From b027026ee84460e95ae9bccf7839049715d68800 Mon Sep 17 00:00:00 2001 From: landor-wang <718092089@qq.com> Date: Fri, 25 Oct 2024 21:00:25 +0800 Subject: [PATCH] add weex for openharmony Signed-off-by: landor-wang <718092089@qq.com> --- ohos/AdvancedAPI_OHOS/.babelrc | 22 + ohos/AdvancedAPI_OHOS/.eslintignore | 1 + ohos/AdvancedAPI_OHOS/.eslintrc | 154 + ohos/AdvancedAPI_OHOS/.gitignore | 11 + ohos/AdvancedAPI_OHOS/README.md | 22 + ohos/AdvancedAPI_OHOS/build/build.js | 141 + ohos/AdvancedAPI_OHOS/build/config.js | 68 + ohos/AdvancedAPI_OHOS/jsconfig.json | 5 + ohos/AdvancedAPI_OHOS/package.json | 37 + .../project/advancedApiHsp/.gitignore | 12 + .../project/advancedApiHsp/AppScope/app.json5 | 10 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../advanced_api_har/.gitignore | 6 + .../advanced_api_har/BuildProfile.ets | 17 + .../advancedApiHsp/advanced_api_har/Index.ets | 2 + .../advanced_api_har/build-profile.json5 | 31 + .../advanced_api_har/consumer-rules.txt | 0 .../advanced_api_har/hvigorfile.ts | 6 + .../advanced_api_har/obfuscation-rules.txt | 23 + .../advanced_api_har/oh-package.json5 | 9 + .../src/main/ets/components/MainPage.ets | 16 + .../src/main/ets/utils/advancedapi.min.js | 48 + .../advanced_api_har/src/main/module.json5 | 11 + .../main/resources/base/element/string.json | 8 + .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 35 + .../src/ohosTest/ets/test/List.test.ets | 5 + .../src/ohosTest/module.json5 | 13 + .../advanced_api_har/src/test/List.test.ets | 5 + .../src/test/LocalUnit.test.ets | 33 + .../advanced_api_hsp/.gitignore | 6 + .../advancedApiHsp/advanced_api_hsp/Index.ets | 2 + .../advanced_api_hsp/build-profile.json5 | 28 + .../advanced_api_hsp/hvigorfile.ts | 6 + .../advanced_api_hsp/obfuscation-rules.txt | 23 + .../advanced_api_hsp/oh-package.json5 | 11 + .../src/main/ets/pages/Index.ets | 17 + .../src/main/ets/utils/advancedapi.min.js | 48 + .../advanced_api_hsp/src/main/module.json5 | 14 + .../main/resources/base/element/string.json | 8 + .../resources/base/profile/main_pages.json | 5 + .../src/ohosTest/ets/test/Ability.test.ets | 35 + .../src/ohosTest/ets/test/List.test.ets | 5 + .../src/ohosTest/module.json5 | 13 + .../advanced_api_hsp/src/test/List.test.ets | 5 + .../src/test/LocalUnit.test.ets | 33 + .../advancedApiHsp/build-profile.json5 | 44 + .../project/advancedApiHsp/code-linter.json5 | 20 + .../project/advancedApiHsp/hvigorfile.ts | 6 + .../project/advancedApiHsp/oh-package.json5 | 10 + .../scripts/build_advancedapi.sh | 103 + .../scripts/build_assemble.sh | 55 + .../scripts/build_codecheck.sh | 7 + .../src/advancedApi/as/account/account.js | 33 + .../advancedApi/as/base/arrayBuffer2Base64.js | 4 + .../src/advancedApi/as/bluetooth/bluetooth.js | 227 + .../advancedApi/as/device/accelerometer.js | 62 + .../advancedApi/as/device/authenication.js | 38 + .../src/advancedApi/as/device/brightness.js | 42 + .../src/advancedApi/as/device/capture.js | 21 + .../src/advancedApi/as/device/compass.js | 62 + .../src/advancedApi/as/device/contact.js | 12 + .../src/advancedApi/as/device/gyroscope.js | 50 + .../src/advancedApi/as/device/system.js | 57 + .../src/advancedApi/as/device/vibrate.js | 31 + .../src/advancedApi/as/device/wifi.js | 90 + .../src/advancedApi/as/file/file.js | 71 + .../src/advancedApi/as/keyboard/keyboard.js | 33 + .../src/advancedApi/as/location/location.js | 87 + .../src/advancedApi/as/media/audio.js | 5 + .../src/advancedApi/as/media/image.js | 59 + .../src/advancedApi/as/media/video.js | 31 + .../src/advancedApi/as/request/request.js | 61 + .../src/advancedApi/as/router/navigate.js | 34 + .../src/advancedApi/as/scan/scan.js | 15 + .../src/advancedApi/as/telephony/telephony.js | 12 + .../src/advancedApi/callback/JSCallback.js | 31 + .../callback/callback-intercept.js | 153 + .../src/advancedApi/callback/index.js | 33 + .../AdvancedAPI_OHOS/src/advancedApi/index.js | 30 + .../module/ASAccelerometer/index.js | 99 + .../src/advancedApi/module/ASAudio/index.js | 552 + .../module/ASAuthentication/index.js | 181 + .../src/advancedApi/module/ASBGAudio/index.js | 311 + .../advancedApi/module/ASBluetooth/index.js | 496 + .../advancedApi/module/ASBrightness/index.js | 25 + .../src/advancedApi/module/ASBuffer/index.js | 20 + .../src/advancedApi/module/ASCapture/index.js | 86 + .../src/advancedApi/module/ASCompass/index.js | 85 + .../src/advancedApi/module/ASContact/index.js | 188 + .../src/advancedApi/module/ASDevice/index.js | 351 + .../advancedApi/module/ASFile/FileCallback.js | 49 + .../advancedApi/module/ASFile/FileError.js | 41 + .../module/ASFile/FileSystemManager.js | 998 + .../src/advancedApi/module/ASFile/index.js | 212 + .../src/advancedApi/module/ASFile/util.js | 280 + .../advancedApi/module/ASGyroscope/index.js | 68 + .../src/advancedApi/module/ASImage/index.js | 345 + .../advancedApi/module/ASInterceptor/index.js | 131 + .../advancedApi/module/ASKeyboard/index.js | 112 + .../advancedApi/module/ASLocation/index.js | 189 + .../src/advancedApi/module/ASPhone/index.js | 13 + .../src/advancedApi/module/ASRequest/index.js | 739 + .../src/advancedApi/module/ASRouter/index.js | 129 + .../src/advancedApi/module/ASScan/index.js | 112 + .../advancedApi/module/ASVibrator/index.js | 82 + .../src/advancedApi/module/ASVideo/index.js | 165 + .../src/advancedApi/module/ASWifi/index.js | 357 + .../src/advancedApi/module/index.js | 59 + .../src/advancedApi/module/interface.js | 317 + .../src/advancedApi/util/index.js | 204 + .../src/base/bridge/abilityBase.js | 70 + .../src/base/bridge/bluetoothBase.js | 185 + .../src/base/bridge/brightnessBase.js | 19 + .../src/base/bridge/deviceBase.js | 14 + .../src/base/bridge/displayBase.js | 21 + .../src/base/bridge/fileioBase.js | 56 + .../src/base/bridge/mediaLibraryBase.js | 77 + .../src/base/bridge/networkBase.js | 27 + .../src/base/bridge/promptBase.js | 26 + .../src/base/bridge/radioBase.js | 45 + .../src/base/bridge/securityBase.js | 17 + .../src/base/bridge/sensorBase.js | 46 + .../src/base/bridge/wantConstantBase.js | 6 + .../src/base/bridge/wifiBase.js | 69 + .../src/base/bridge/windowBase.js | 64 + .../src/base/decorators/index.js | 29 + .../Bluetooth/BluetoothBaseErrorCode.js | 44 + .../module/Bluetooth/BluetoothBaseModule.js | 960 + .../module/Brightness/BrightnessBaseModule.js | 103 + .../base/module/Network/NetworkBaseModule.js | 72 + .../src/base/module/Wifi/WifiBaseModule.js | 93 + .../src/base/util/ErrorCode.js | 162 + ohos/AdvancedAPI_OHOS/src/base/util/Result.js | 27 + .../src/base/util/checkDataType.js | 230 + ohos/AdvancedAPI_OHOS/src/base/util/colors.js | 150 + .../src/base/util/typeTransForm.js | 59 + ohos/README.md | 18 + .../175bef82-f6f8-4bb8-a49c-d6434ffab488.png | Bin 0 -> 105006 bytes .../17f22f52-d829-41e7-b3fa-eb4c5559b7a7.png | Bin 0 -> 112049 bytes .../23b82328-8505-406a-8a57-5c08e806eedd.png | Bin 0 -> 124642 bytes .../25d694fe-9a25-4a89-89a4-64b5d38bed58.png | Bin 0 -> 34587 bytes .../280fc365-e4b5-4a60-b923-04e41a99d86a.png | Bin 0 -> 117712 bytes .../2ef98fc1-56bc-4596-8a09-8bc20a99c87e.png | Bin 0 -> 76122 bytes .../31c7404f-b379-4f9e-ae50-be9fd87cc3d3.png | Bin 0 -> 42330 bytes .../3bb62087-559d-4b6a-866f-6c18cc5c2bad.png | Bin 0 -> 95202 bytes .../45a6a96e-2d2e-4ab3-baba-23285224d6dd.png | Bin 0 -> 121495 bytes .../54fbe58e-12c3-4b1d-8153-2a08e3357f0c.png | Bin 0 -> 86636 bytes .../5539cf38-2042-4679-9bca-53d4dff8b95d.png | Bin 0 -> 38619 bytes .../576798f5-e7e6-42f4-a936-9582505f0acd.png | Bin 0 -> 186509 bytes .../5a66de35-18a7-4b8b-bd93-c58ef3daee78.png | Bin 0 -> 17820 bytes .../6d562a4d-1c1e-4e2f-9953-14c02a924ffd.png | Bin 0 -> 20911 bytes .../6eb53446-30fd-4b5b-8656-765355fd32bc.png | Bin 0 -> 58292 bytes .../7516fe01-caa0-439c-a715-6b4a318a92b6.png | Bin 0 -> 246161 bytes .../7c34a3f4-f143-4b66-9081-9ca592675700.png | Bin 0 -> 143701 bytes .../7c445fe3-0c07-4266-a68d-080d1d013801.png | Bin 0 -> 157140 bytes .../819c8be1-23e8-4332-85f8-c937ae2867d9.png | Bin 0 -> 43328 bytes .../89c55b9c-e257-46bf-99cf-324fbc36c719.png | Bin 0 -> 68530 bytes .../92477799-9258-416f-9c15-9cd528f919a7.gif | Bin 0 -> 698008 bytes .../assets/Snipaste_2024-10-25_10-45-45.png | Bin 0 -> 9711 bytes .../assets/Snipaste_2024-10-25_11-04-47.png | Bin 0 -> 20284 bytes .../assets/Snipaste_2024-10-25_15-24-49.png | Bin 0 -> 31088 bytes .../assets/Snipaste_2024-10-25_15-28-42.png | Bin 0 -> 44383 bytes .../a328663c-49af-400c-a6b4-4bb58687f8c1.png | Bin 0 -> 64480 bytes .../a62d1304-0d15-427f-af2f-179dcf7373a6.png | Bin 0 -> 120237 bytes .../b6302f87-2db1-470b-ac09-0f2da0e9374a.png | Bin 0 -> 57997 bytes .../c61700cc-0d3f-4f4c-8491-6bdced2e5e3c.png | Bin 0 -> 56338 bytes .../cb897828-c91b-4c90-ba93-edd725633983.png | Bin 0 -> 107782 bytes .../cc03849e-a55f-4952-afa4-6e757b35eab6.png | Bin 0 -> 71402 bytes .../cd052d56-d6c0-4594-9937-de434d39d53a.png | Bin 0 -> 178992 bytes .../dede7776-303e-4c3f-a6a4-a366e6224120.png | Bin 0 -> 205193 bytes .../e435707f-4662-4814-a885-314a70f7b33c.png | Bin 0 -> 51725 bytes .../e624406a-3c73-40af-85fb-0aa9f07e2909.png | Bin 0 -> 319679 bytes .../edb18e95-e129-4e8c-b239-a9ea0a253075.png | Bin 0 -> 142999 bytes .../f0453475-e095-4049-b2f0-eae3fd4c0f3c.png | Bin 0 -> 57658 bytes ...07\345\257\274\346\226\207\346\241\243.md" | 3623 +++ ohos/example/ohos-example/.clang-format | 64 + ohos/example/ohos-example/AppScope/app.json5 | 11 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 1314 bytes ohos/example/ohos-example/README.md | 5 + .../ohos-example/WebScenekitHsp-default.tgz | Bin 0 -> 81923 bytes ohos/example/ohos-example/build-profile.json5 | 27 + ohos/example/ohos-example/entry/.gitignore | 4 + .../ohos-example/entry/build-profile.json5 | 14 + ohos/example/ohos-example/entry/hvigorfile.ts | 18 + .../ohos-example/entry/oh-package-lock.json5 | 42 + .../ohos-example/entry/oh-package.json5 | 15 + .../main/ets/commonadapter/CommonAdapter.ets | 78 + .../apiadapter/AuthSettingAPI.ets | 37 + .../commonadapter/apiadapter/BluetoothAPI.ets | 28 + .../commonadapter/apiadapter/ContactAPI.ets | 51 + .../commonadapter/apiadapter/DeviceAPI.ets | 90 + .../commonadapter/apiadapter/DownLoadAPI.ets | 71 + .../apiadapter/HiTraceMeterAPI.ets | 66 + .../ets/commonadapter/apiadapter/ImageAPI.ets | 570 + .../commonadapter/apiadapter/LocationAPI.ets | 91 + .../ets/commonadapter/apiadapter/MediaAPI.ets | 57 + .../commonadapter/apiadapter/NetworkAPI.ets | 87 + .../ets/commonadapter/apiadapter/PhoneAPI.ets | 92 + .../commonadapter/apiadapter/PickerAPI.ets | 166 + .../apiadapter/PreferencesAPI.ets | 129 + .../commonadapter/apiadapter/RouterAPI.ets | 143 + .../commonadapter/apiadapter/ThirdAppAPI.ets | 35 + .../commonadapter/apiadapter/WebViewAPI.ets | 41 + .../commonadapter/apiadapter/WindowAPI.ets | 54 + .../commonadapter/apimodel/CommonCallback.ets | 20 + .../commonadapter/apimodel/EmitterCommon.ets | 15 + .../ets/commonadapter/apimodel/WeexResult.ts | 39 + .../commonadapter/componentAPI/LottieAPI.ets | 57 + .../main/ets/entryability/EntryAbility.ets | 118 + .../entry/src/main/ets/har/WebSceneAPI.har | Bin 0 -> 19739 bytes .../src/main/ets/har/advanced_api_har.har | Bin 0 -> 40687 bytes .../src/main/ets/pages/ApiAndComponent.ets | 55 + .../entry/src/main/ets/pages/ExtWebPage.ets | 35 + .../entry/src/main/ets/pages/Index.ets | 91 + .../entry/src/main/ets/pages/Second.ets | 58 + .../entry/src/main/ets/pages/Third.ets | 55 + .../ets/samelayer/interfaces/SameLayer.ets | 144 + .../nativeComponents/Button/Button.ets | 64 + .../nativeComponents/Lottie/Lottie.ets | 77 + .../nativeComponents/RichText/RichText.ets | 47 + .../nativeComponents/Slider/Slider.ets | 67 + .../nativeComponents/TextArea/TextArea.ets | 55 + .../nativeComponents/Video/Video.ets | 56 + .../samelayer/nativeComponents/Web/Web.ets | 108 + .../ets/samelayer/utils/LottieManager.ets | 125 + .../main/ets/samelayer/utils/WebManger.ets | 85 + .../entry/src/main/ets/utils/FileUtils.ets | 39 + .../entry/src/main/ets/utils/GlobalThis.ets | 37 + .../ohos-example/entry/src/main/module.json5 | 187 + .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/float.json | 32 + .../main/resources/base/element/string.json | 64 + .../src/main/resources/base/media/back.svg | 1 + .../src/main/resources/base/media/ic_back.png | Bin 0 -> 1262 bytes .../main/resources/base/media/ic_widget.png | Bin 0 -> 5831 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 20093 bytes .../src/main/resources/base/media/search.svg | 9 + .../resources/base/profile/form_config.json | 23 + .../resources/base/profile/main_pages.json | 9 + .../main/resources/en_US/element/string.json | 64 + .../frameworkTest_web/WebSceneConfig.json | 173 + .../commons.d0bc9dc540001b2486a6.web.js | 26 + .../images/airplane_search.png | Bin 0 -> 1811 bytes .../images/airplane_search_active.png | Bin 0 -> 1711 bytes .../frameworkTest_web/images/arrow_right.png | Bin 0 -> 215 bytes .../rawfile/frameworkTest_web/images/back.png | Bin 0 -> 359 bytes .../frameworkTest_web/images/back_white.png | Bin 0 -> 636 bytes .../frameworkTest_web/images/default.png | Bin 0 -> 2301 bytes .../frameworkTest_web/images/heart.png | Bin 0 -> 2156 bytes .../rawfile/frameworkTest_web/images/like.png | Bin 0 -> 826 bytes .../frameworkTest_web/images/like_back.png | Bin 0 -> 564 bytes .../frameworkTest_web/images/liked_back.png | Bin 0 -> 826 bytes .../frameworkTest_web/images/loading.gif | Bin 0 -> 8801 bytes .../frameworkTest_web/images/loading.png | Bin 0 -> 1509 bytes .../frameworkTest_web/images/message.png | Bin 0 -> 788 bytes .../images/message_active.png | Bin 0 -> 760 bytes .../rawfile/frameworkTest_web/images/my.png | Bin 0 -> 999 bytes .../frameworkTest_web/images/my_active.png | Bin 0 -> 956 bytes .../frameworkTest_web/images/navbar_add.png | Bin 0 -> 171 bytes .../frameworkTest_web/images/no-result.png | Bin 0 -> 4970 bytes .../frameworkTest_web/images/placeholder.png | Bin 0 -> 698 bytes .../frameworkTest_web/images/refresh.png | Bin 0 -> 658 bytes .../frameworkTest_web/images/refresh_back.png | Bin 0 -> 556 bytes .../rawfile/frameworkTest_web/images/scan.png | Bin 0 -> 172 bytes .../frameworkTest_web/images/scan_back.png | Bin 0 -> 1694 bytes .../frameworkTest_web/images/share_white.png | Bin 0 -> 376 bytes .../rawfile/frameworkTest_web/images/task.png | Bin 0 -> 724 bytes .../frameworkTest_web/images/task_active.png | Bin 0 -> 698 bytes .../frameworkTest_web/images/trash.png | Bin 0 -> 237 bytes .../images/triangle-right.png | Bin 0 -> 449 bytes .../images/triangle_bottom.png | Bin 0 -> 397 bytes .../images/triangle_down.png | Bin 0 -> 165 bytes .../frameworkTest_web/images/triangle_up.png | Bin 0 -> 164 bytes .../frameworkTest_web/images/video-play.png | Bin 0 -> 4244 bytes .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/eventForStop/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/fix_pagingEnabled/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/harmonyPage/entry.html | 39 + .../index/entry.d0bc9dc540001b2486a6.web.js | 1 + .../frameworkTest_web/pages/index/entry.html | 39 + .../jsDemo/entry.d0bc9dc540001b2486a6.web.js | 1 + .../frameworkTest_web/pages/jsDemo/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/list_pageEnable/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/list_scrollbar/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/lottie_complete/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/lottie_test/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/lottie_test2/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/mapTest1/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/mapTest2/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/mapTest3/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/mapTest4/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/mapTest5/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage1/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage10/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage11/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage12/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage13/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage14/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage15/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage2/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage3/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage4/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage5/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage6/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage7/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage8/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/multiPage9/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/navigator_pop/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/navigator_push/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/pushState/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/sameLayerSample1/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/sameLayerSample2/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/scrollerPage1/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/scrollerPage2/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/singlePage1/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/singlePage2/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/singlePage3/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/singlePage4/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/singlePage5/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/singlePage6/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/specialPage/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/test_toast/entry.html | 39 + .../entry.d0bc9dc540001b2486a6.web.js | 1 + .../pages/umewebview-communication/entry.html | 39 + .../video/entry.d0bc9dc540001b2486a6.web.js | 1 + .../frameworkTest_web/pages/video/entry.html | 39 + .../frameworkTest_web/web/assets/Unknown.mp3 | Bin 0 -> 1781046 bytes .../web/assets/echarts.min.js | 12 + .../frameworkTest_web/web/assets/f2.min.js | 1 + .../web/assets/jSignature.min.js | 81 + .../web/assets/jquery.json-editor.min.js | 1 + .../web/assets/jquery.min.js | 6 + .../frameworkTest_web/web/assets/preview.css | 100 + .../frameworkTest_web/web/assets/qrcode.js | 1704 ++ .../rawfile/frameworkTest_web/web/audio.html | 24 + .../rawfile/frameworkTest_web/web/bar.html | 42 + .../frameworkTest_web/web/echarts.html | 41 + .../frameworkTest_web/web/echarts.min.js | 10 + .../frameworkTest_web/web/memoryOut.html | 75 + .../frameworkTest_web/web/preview.html | 175 + .../rawfile/frameworkTest_web/web/radar.html | 212 + .../frameworkTest_web/web/signature.html | 95 + .../rawfile/frameworkTest_web/web/test.html | 70 + .../rawfile/frameworkTest_web/web/test1.html | 76 + .../frameworkTest_web/web/umeH5Flexible.js | 147 + .../main/resources/zh_CN/element/string.json | 64 + .../src/ohosTest/ets/test/Ability.test.ets | 47 + .../entry/src/ohosTest/ets/test/List.test.ets | 17 + .../ohosTest/ets/testability/TestAbility.ets | 60 + .../ohosTest/ets/testability/pages/Index.ets | 22 + .../ets/testrunner/OpenHarmonyTestRunner.ts | 39 + .../entry/src/ohosTest/module.json5 | 37 + .../resources/base/element/color.json | 8 + .../resources/base/element/string.json | 16 + .../ohosTest/resources/base/media/icon.png | Bin 0 -> 1314 bytes .../resources/base/profile/test_pages.json | 5 + .../ohos-example/hvigor/hvigor-config.json5 | 23 + ohos/example/ohos-example/hvigorfile.ts | 14 + .../ohos-example/oh-package-lock.json5 | 20 + ohos/example/ohos-example/oh-package.json5 | 14 + ohos/example/weex-example/.babelrc | 20 + ohos/example/weex-example/.gitignore | 17 + ohos/example/weex-example/.postcssrc.js | 9 + ohos/example/weex-example/README.md | 27 + ohos/example/weex-example/android.config.json | 6 + ohos/example/weex-example/babel.config.js | 4 + ohos/example/weex-example/configs/config.js | 141 + ohos/example/weex-example/configs/helper.js | 20 + .../example/weex-example/configs/hotreload.js | 70 + ohos/example/weex-example/configs/logo.png | Bin 0 -> 1688 bytes ohos/example/weex-example/configs/plugin.js | 37 + .../weex-example/configs/qrcode-w-plugin.js | 59 + .../weex-example/configs/transform-loader.js | 284 + ohos/example/weex-example/configs/utils.js | 108 + .../weex-example/configs/vue-loader.conf.js | 21 + .../configs/webpack.common.conf.js | 464 + .../weex-example/configs/webpack.dev.conf.js | 208 + .../configs/webpack.harmony.conf.js | 174 + .../weex-example/configs/webpack.prod.conf.js | 130 + .../configs/webpack.release.conf.js | 215 + .../weex-example/configs/weexTransform.js | 89 + ohos/example/weex-example/ios.config.json | 9 + ohos/example/weex-example/package.json | 115 + .../example/weex-example/plugins/plugins.json | 5 + .../src/components/HelloWorld.vue | 3 + ohos/example/weex-example/src/entry.js | 13 + ohos/example/weex-example/src/index.vue | 40 + .../weex-example/src/pages/demo111/entry.vue | 13 + .../weex-example/src/pages/index/entry.vue | 15 + ohos/example/weex-example/src/router.js | 15 + .../weex-example/web/assets/preview.css | 104 + .../example/weex-example/web/assets/qrcode.js | 1704 ++ ohos/example/weex-example/web/index.html | 39 + ohos/example/weex-example/web/preview.html | 86 + ohos/example/weex-example/webpack.config.js | 33 + ohos/test/commonTest/.babelrc | 20 + ohos/test/commonTest/.eslintignore | 21 + ohos/test/commonTest/.eslintrc.js | 3 + ohos/test/commonTest/.gitignore | 17 + ohos/test/commonTest/.postcssrc.js | 9 + ohos/test/commonTest/.prettierignore | 20 + ohos/test/commonTest/.prettierrc.js | 2 + ohos/test/commonTest/README.md | 63 + ohos/test/commonTest/android.config.json | 6 + ohos/test/commonTest/babel.config.js | 4 + ohos/test/commonTest/configs/config.js | 140 + .../test/commonTest/configs/gesture-loader.js | 1104 + ohos/test/commonTest/configs/helper.js | 22 + ohos/test/commonTest/configs/hotreload.js | 70 + ohos/test/commonTest/configs/logo.png | Bin 0 -> 1688 bytes ohos/test/commonTest/configs/plugin.js | 41 + .../commonTest/configs/qrcode-w-plugin.js | 59 + .../commonTest/configs/registerGesture.js | 1247 + .../commonTest/configs/transform-loader.js | 284 + ohos/test/commonTest/configs/url-config.js | 17 + ohos/test/commonTest/configs/utils.js | 107 + .../commonTest/configs/vue-loader.conf.js | 23 + .../commonTest/configs/webpack.common.conf.js | 478 + .../commonTest/configs/webpack.dev.conf.js | 208 + .../configs/webpack.harmony.conf.js | 174 + .../commonTest/configs/webpack.prod.conf.js | 287 + .../configs/webpack.release.conf.js | 204 + .../commonTest/configs/webpack.test.conf.js | 35 + ohos/test/commonTest/configs/weexTransform.js | 89 + ohos/test/commonTest/entry.json | 15 + ohos/test/commonTest/ios.config.json | 9 + ohos/test/commonTest/package.json | 116 + .../patches/weex-vue-render+1.0.36.patch | 785 + ohos/test/commonTest/src/App.vue | 15 + .../commonTest/src/assets/css/controlbar.css | 94 + .../test/commonTest/src/assets/css/global.css | 69 + ohos/test/commonTest/src/assets/css/mask.css | 99 + .../commonTest/src/assets/fonts/dinBold.ttf | Bin 0 -> 39948 bytes .../commonTest/src/assets/js/citylist.json | 19850 ++++++++++++++++ ohos/test/commonTest/src/assets/js/index.js | 41 + .../src/assets/json/Boat_Loader.json | 1 + .../commonTest/src/assets/json/Calender.json | 1 + .../commonTest/src/assets/json/comment.json | 173 + .../commonTest/src/assets/json/navbar.json | 7 + .../src/assets/json/priceDetail.json | 27 + .../commonTest/src/components/airportList.vue | 861 + ohos/test/commonTest/src/components/bank.vue | 245 + .../src/components/baseSameLayer.vue | 60 + .../test/commonTest/src/components/button.vue | 68 + .../commonTest/src/components/datePicker.vue | 372 + .../src/components/datePicker_back.vue | 463 + .../commonTest/src/components/geolocation.vue | 453 + .../src/components/hl-button-base.vue | 52 + .../commonTest/src/components/hl-button.vue | 96 + .../src/components/hl-lottie-base.vue | 144 + .../commonTest/src/components/hl-lottie.vue | 180 + .../src/components/hl-richtext-base.vue | 38 + .../commonTest/src/components/hl-richtext.vue | 80 + .../src/components/hl-slider-base.vue | 60 + .../commonTest/src/components/hl-slider.vue | 107 + .../src/components/hl-textarea-base.vue | 38 + .../commonTest/src/components/hl-textarea.vue | 80 + .../src/components/hl-video-base.vue | 63 + .../commonTest/src/components/hl-video.vue | 108 + .../commonTest/src/components/hl-web-base.vue | 93 + .../test/commonTest/src/components/hl-web.vue | 125 + .../test/commonTest/src/components/loading.js | 71 + .../commonTest/src/components/loading.vue | 179 + .../commonTest/src/components/loadingOld.vue | 182 + ohos/test/commonTest/src/components/modal.vue | 187 + .../test/commonTest/src/components/navbar.vue | 190 + .../commonTest/src/components/newImage.vue | 31 + .../commonTest/src/components/oldToast.vue | 131 + .../test/commonTest/src/components/picker.vue | 281 + .../commonTest/src/components/profession.vue | 455 + .../commonTest/src/components/searchText.vue | 878 + .../commonTest/src/components/searchText2.vue | 994 + .../commonTest/src/components/shopList.vue | 175 + .../commonTest/src/components/swipeCard.vue | 234 + ohos/test/commonTest/src/components/toast.vue | 190 + .../commonTest/src/components/wxLottie.vue | 180 + ohos/test/commonTest/src/entry.js | 12 + .../commonTest/src/images/airplane_search.png | Bin 0 -> 1811 bytes .../src/images/airplane_search_active.png | Bin 0 -> 1711 bytes .../commonTest/src/images/arrow_right.png | Bin 0 -> 215 bytes ohos/test/commonTest/src/images/back.png | Bin 0 -> 359 bytes .../test/commonTest/src/images/back_white.png | Bin 0 -> 636 bytes ohos/test/commonTest/src/images/default.png | Bin 0 -> 2301 bytes ohos/test/commonTest/src/images/heart.png | Bin 0 -> 2156 bytes ohos/test/commonTest/src/images/like.png | Bin 0 -> 826 bytes ohos/test/commonTest/src/images/like_back.png | Bin 0 -> 564 bytes .../test/commonTest/src/images/liked_back.png | Bin 0 -> 826 bytes ohos/test/commonTest/src/images/loading.gif | Bin 0 -> 8801 bytes ohos/test/commonTest/src/images/loading.png | Bin 0 -> 1509 bytes ohos/test/commonTest/src/images/message.png | Bin 0 -> 788 bytes .../commonTest/src/images/message_active.png | Bin 0 -> 760 bytes ohos/test/commonTest/src/images/my.png | Bin 0 -> 999 bytes ohos/test/commonTest/src/images/my_active.png | Bin 0 -> 956 bytes .../test/commonTest/src/images/navbar_add.png | Bin 0 -> 171 bytes ohos/test/commonTest/src/images/no-result.png | Bin 0 -> 4970 bytes .../commonTest/src/images/placeholder.png | Bin 0 -> 698 bytes ohos/test/commonTest/src/images/refresh.png | Bin 0 -> 658 bytes .../commonTest/src/images/refresh_back.png | Bin 0 -> 556 bytes ohos/test/commonTest/src/images/scan.png | Bin 0 -> 172 bytes ohos/test/commonTest/src/images/scan_back.png | Bin 0 -> 1694 bytes .../commonTest/src/images/share_white.png | Bin 0 -> 376 bytes ohos/test/commonTest/src/images/task.png | Bin 0 -> 724 bytes .../commonTest/src/images/task_active.png | Bin 0 -> 698 bytes ohos/test/commonTest/src/images/trash.png | Bin 0 -> 237 bytes .../commonTest/src/images/triangle-right.png | Bin 0 -> 449 bytes .../commonTest/src/images/triangle_bottom.png | Bin 0 -> 397 bytes .../commonTest/src/images/triangle_down.png | Bin 0 -> 165 bytes .../commonTest/src/images/triangle_up.png | Bin 0 -> 164 bytes .../test/commonTest/src/images/video-play.png | Bin 0 -> 4244 bytes ohos/test/commonTest/src/mixin/compMixin.js | 47 + ohos/test/commonTest/src/mixin/jumpMixin.js | 35 + ohos/test/commonTest/src/mixin/screenMixin.js | 37 + .../src/pages/eventForStop/entry.vue | 91 + .../src/pages/eventForTouch/entry.vue | 106 + .../src/pages/fix_pagingEnabled/entry.vue | 97 + .../src/pages/harmonyPage/entry.vue | 451 + .../src/pages/index/components/indexTab.vue | 122 + .../src/pages/index/components/tab1.vue | 552 + .../src/pages/index/components/tab2.vue | 524 + .../src/pages/index/components/tab3.vue | 521 + .../src/pages/index/components/tab4.vue | 91 + .../src/pages/index/components/tab5.vue | 1534 ++ .../src/pages/index/components/tab6.vue | 321 + .../test/commonTest/src/pages/index/entry.vue | 413 + .../commonTest/src/pages/jsDemo/entry.vue | 86 + .../src/pages/list_pageEnable/entry.vue | 65 + .../src/pages/list_scrollbar/entry.vue | 209 + .../commonTest/src/pages/long_list/entry.vue | 114 + .../src/pages/lottie_complete/entry.vue | 67 + .../src/pages/lottie_test/entry.vue | 90 + .../src/pages/lottie_test2/entry.vue | 88 + .../commonTest/src/pages/mapTest1/entry.vue | 183 + .../commonTest/src/pages/mapTest1/mapdata.js | 178 + .../commonTest/src/pages/mapTest2/entry.vue | 150 + .../commonTest/src/pages/mapTest2/mapdata.js | 178 + .../commonTest/src/pages/mapTest3/entry.vue | 151 + .../commonTest/src/pages/mapTest3/mapdata.js | 180 + .../commonTest/src/pages/mapTest4/entry.vue | 163 + .../commonTest/src/pages/mapTest4/mapdata.js | 178 + .../commonTest/src/pages/mapTest5/entry.vue | 153 + .../commonTest/src/pages/mapTest5/mapdata.js | 178 + .../commonTest/src/pages/multiPage1/entry.vue | 140 + .../src/pages/multiPage10/entry.vue | 79 + .../src/pages/multiPage11/entry.vue | 79 + .../src/pages/multiPage12/entry.vue | 79 + .../src/pages/multiPage13/entry.vue | 79 + .../src/pages/multiPage14/entry.vue | 79 + .../src/pages/multiPage15/entry.vue | 83 + .../commonTest/src/pages/multiPage2/entry.vue | 144 + .../commonTest/src/pages/multiPage3/entry.vue | 142 + .../commonTest/src/pages/multiPage4/entry.vue | 79 + .../commonTest/src/pages/multiPage5/entry.vue | 79 + .../commonTest/src/pages/multiPage6/entry.vue | 79 + .../commonTest/src/pages/multiPage7/entry.vue | 79 + .../commonTest/src/pages/multiPage8/entry.vue | 79 + .../commonTest/src/pages/multiPage9/entry.vue | 79 + .../src/pages/navigator_pop/entry.vue | 42 + .../src/pages/navigator_push/entry.vue | 43 + ohos/test/commonTest/src/pages/pick/entry.vue | 108 + .../commonTest/src/pages/pushState/entry.vue | 45 + .../src/pages/sameLayerSample1/entry.vue | 194 + .../src/pages/sameLayerSample2/entry.vue | 265 + .../src/pages/scrollerPage1/entry.vue | 77 + .../src/pages/scrollerPage2/entry.vue | 77 + .../src/pages/singlePage1/entry.vue | 186 + .../src/pages/singlePage2/entry.vue | 87 + .../src/pages/singlePage3/entry.vue | 139 + .../src/pages/singlePage4/entry.vue | 83 + .../src/pages/singlePage5/entry.vue | 83 + .../src/pages/singlePage6/entry.vue | 89 + .../src/pages/specialPage/entry.vue | 88 + .../commonTest/src/pages/test_toast/entry.vue | 39 + .../pages/umewebview-communication/entry.vue | 179 + .../test/commonTest/src/pages/video/entry.vue | 689 + ohos/test/commonTest/src/utils/api.js | 248 + ohos/test/commonTest/src/utils/constants.js | 1075 + ohos/test/commonTest/src/utils/filter.js | 9 + ohos/test/commonTest/src/utils/fixFloat.js | 45 + ohos/test/commonTest/src/utils/h5.js | 57 + ohos/test/commonTest/src/utils/index.js | 567 + ohos/test/commonTest/src/utils/jsapi.js | 2166 ++ ohos/test/commonTest/src/utils/scroll.js | 109 + ohos/test/commonTest/src/utils/tools.js | 207 + ohos/test/commonTest/src/utils/web.js | 293 + .../commonTest/src/web/assets/Unknown.mp3 | Bin 0 -> 1781046 bytes .../commonTest/src/web/assets/echarts.min.js | 12 + ohos/test/commonTest/src/web/assets/f2.min.js | 1 + .../src/web/assets/jSignature.min.js | 81 + .../src/web/assets/jquery.json-editor.min.js | 1 + .../commonTest/src/web/assets/jquery.min.js | 6 + .../commonTest/src/web/assets/preview.css | 100 + ohos/test/commonTest/src/web/assets/qrcode.js | 1704 ++ ohos/test/commonTest/src/web/audio.html | 24 + ohos/test/commonTest/src/web/bar.html | 42 + ohos/test/commonTest/src/web/echarts.html | 41 + ohos/test/commonTest/src/web/echarts.min.js | 10 + ohos/test/commonTest/src/web/memoryOut.html | 75 + ohos/test/commonTest/src/web/preview.html | 175 + ohos/test/commonTest/src/web/radar.html | 212 + ohos/test/commonTest/src/web/signature.html | 95 + ohos/test/commonTest/src/web/test.html | 70 + ohos/test/commonTest/src/web/test1.html | 76 + ohos/test/commonTest/src/web/umeH5Flexible.js | 147 + .../test/commonTest/web/assets/echarts.min.js | 12 + ohos/test/commonTest/web/assets/f2.min.js | 1 + .../web/assets/jquery.json-editor.min.js | 1 + ohos/test/commonTest/web/assets/jquery.min.js | 6 + ohos/test/commonTest/web/assets/preview.css | 104 + ohos/test/commonTest/web/assets/qrcode.js | 1704 ++ ohos/test/commonTest/web/bar.html | 42 + ohos/test/commonTest/web/echarts.html | 41 + ohos/test/commonTest/web/index.html | 39 + ohos/test/commonTest/web/preview.html | 175 + ohos/test/commonTest/webpack.config.js | 33 + ohos/web_api_ohos/.gitignore | 12 + ohos/web_api_ohos/AppScope/app.json5 | 10 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes ohos/web_api_ohos/WebSceneAPI/.gitignore | 6 + .../web_api_ohos/WebSceneAPI/BuildProfile.ets | 17 + ohos/web_api_ohos/WebSceneAPI/Index.ets | 1 + .../WebSceneAPI/build-profile.json5 | 31 + .../WebSceneAPI/consumer-rules.txt | 0 ohos/web_api_ohos/WebSceneAPI/hvigorfile.ts | 6 + .../WebSceneAPI/obfuscation-rules.txt | 23 + .../web_api_ohos/WebSceneAPI/oh-package.json5 | 9 + .../common/constants/BusinessConstants.ets | 52 + .../ets/common/constants/StyleConstants.ets | 0 .../main/ets/common/entity/CommonConfig.ets | 31 + .../src/main/ets/common/entity/StatusCode.ets | 25 + .../src/main/ets/common/js-base64/LICENSE.md | 27 + .../src/main/ets/common/js-base64/README.md | 169 + .../src/main/ets/common/js-base64/base64.d.ts | 135 + .../src/main/ets/common/js-base64/base64.js | 316 + .../src/main/ets/common/js-base64/base64.mjs | 296 + .../main/ets/common/js-base64/package.json | 38 + .../src/main/ets/common/log/Log.ets | 48 + .../src/main/ets/common/utils/CommonUtil.ets | 31 + .../main/ets/common/utils/PermissionUtil.ets | 57 + .../src/main/ets/common/utils/WindowUtil.ets | 32 + .../src/main/ets/components/MainPage.ets | 16 + .../src/main/ets/model/CallBackAdapter.ts | 51 + .../src/main/ets/model/GlobalThis.ets | 66 + .../src/main/ets/module/ability/WSRouter.ets | 78 + .../main/ets/module/bluetooth/WSBluetooth.ets | 64 + .../main/ets/module/calendar/WSCalendar.ets | 137 + .../src/main/ets/module/media/WSMedia.ets | 141 + .../src/main/ets/module/network/WSNetwork.ets | 145 + .../main/ets/module/telephony/WSContact.ets | 130 + .../src/main/ets/module/window/WSWindow.ets | 164 + .../WebSceneAPI/src/main/module.json5 | 11 + .../main/resources/base/element/string.json | 8 + .../main/resources/en_US/element/string.json | 8 + .../main/resources/zh_CN/element/string.json | 8 + .../src/ohosTest/ets/test/Ability.test.ets | 35 + .../src/ohosTest/ets/test/List.test.ets | 5 + .../WebSceneAPI/src/ohosTest/module.json5 | 13 + .../WebSceneAPI/src/test/List.test.ets | 5 + .../WebSceneAPI/src/test/LocalUnit.test.ets | 33 + ohos/web_api_ohos/build-profile.json5 | 45 + ohos/web_api_ohos/code-linter.json5 | 20 + ohos/web_api_ohos/entry/.gitignore | 6 + ohos/web_api_ohos/entry/build-profile.json5 | 28 + ohos/web_api_ohos/entry/hvigorfile.ts | 6 + ohos/web_api_ohos/entry/obfuscation-rules.txt | 23 + ohos/web_api_ohos/entry/oh-package-lock.json5 | 18 + ohos/web_api_ohos/entry/oh-package.json5 | 12 + .../main/ets/entryability/EntryAbility.ets | 41 + .../entrybackupability/EntryBackupAbility.ets | 12 + .../entry/src/main/ets/pages/Index.ets | 20 + ohos/web_api_ohos/entry/src/main/module.json5 | 52 + .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 16 + .../main/resources/zh_CN/element/string.json | 16 + .../entry/src/mock/mock-config.json5 | 2 + .../src/ohosTest/ets/test/Ability.test.ets | 35 + .../entry/src/ohosTest/ets/test/List.test.ets | 5 + .../entry/src/ohosTest/module.json5 | 13 + .../web_api_ohos/entry/src/test/List.test.ets | 5 + .../entry/src/test/LocalUnit.test.ets | 33 + ohos/web_api_ohos/hvigor/hvigor-config.json5 | 22 + ohos/web_api_ohos/hvigorfile.ts | 6 + ohos/web_api_ohos/oh-package-lock.json5 | 27 + ohos/web_api_ohos/oh-package.json5 | 10 + ohos/web_scenekit_hsp/Index.ets | 19 + ohos/web_scenekit_hsp/build-profile.json5 | 25 + ohos/web_scenekit_hsp/hvigorfile.ts | 18 + ohos/web_scenekit_hsp/obfuscation-rules.txt | 18 + ohos/web_scenekit_hsp/oh-package.json5 | 11 + ohos/web_scenekit_hsp/src/main/ets/ExtWeb.ets | 104 + .../src/main/ets/ExtWebController.ets | 112 + .../adapterservice/api/BroadcastChannel.ets | 118 + .../ets/adapterservice/api/ClipboardAPI.ets | 57 + .../ets/adapterservice/api/DeviceInfoAPI.ets | 31 + .../ets/adapterservice/api/GlobalEvent.ets | 79 + .../ets/adapterservice/api/KeyboardAPI.ets | 85 + .../main/ets/adapterservice/api/Navigator.ets | 57 + .../main/ets/adapterservice/api/StreamAPI.ets | 117 + .../main/ets/adapterservice/api/UpdateApi.ets | 46 + .../ets/adapterservice/api/ViewAppear.ets | 106 + .../api/apimodel/ApiOptions.ets | 21 + .../adapterservice/api/apimodel/WeexResult.ts | 39 + .../adapterservice/constants/Constants.ets | 126 + .../ets/adapterservice/model/JsBridge.ets | 93 + .../ets/adapterservice/model/WebAdapter.ets | 165 + .../ets/adapterservice/utils/GlobalThis.ets | 37 + .../ets/bundleservice/constants/Constants.ets | 125 + .../ets/bundleservice/update/FileUtils.ets | 71 + .../update/LocalUpdateManager.ets | 86 + .../bundleservice/update/UpdateManager.ets | 90 + .../data/source/MiniConfigRepository.ets | 32 + .../update/data/source/MiniRepository.ets | 42 + .../data/source/bean/CompareVersion.ets | 50 + .../data/source/bean/LocalVersionInfo.ets | 21 + .../update/data/source/bean/MiniConfig.ets | 23 + .../update/data/source/bean/NetworkTask.ets | 27 + .../update/data/source/bean/UpdateConfig.ets | 50 + .../source/local/MiniLocalFileDataSource.ets | 105 + .../source/local/MiniRawFileDataSource.ets | 17 + .../network/MiniConfigNetworkDataSource.ets | 46 + .../source/network/MiniNetworkDataSource.ets | 55 + .../src/main/ets/common/Logger.ets | 60 + .../src/main/ets/pages/pageTemplate.ets | 38 + .../main/ets/samelayer/SameLayerManager.ets | 262 + .../src/main/ets/utils/Calc.ets | 15 + .../common/constant/Constant.ets | 132 + .../common/entity/BuilderData.ets | 24 + .../common/entity/IdResource.ets | 25 + .../common/entity/NodeType.ets | 18 + .../common/entity/PreRenderUrl.ets | 11 + .../common/entity/Project.ets | 21 + .../common/entity/RouteNode.ets | 19 + .../common/entity/RouteType.ets | 23 + .../common/entity/UrlInfo.ets | 21 + .../common/util/ParseUtil.ets | 114 + .../webrouterservice/common/util/UrlUtil.ets | 44 + .../globalrouter/GlobalRouter.ets | 435 + .../globalrouter/RouterStorage.ets | 257 + .../pagemanager/PageModel.ets | 56 + .../pagemanager/PageModelController.ets | 182 + .../webrouterservice/pagemanager/SubPage.ets | 58 + .../webmanger/MixWebBuilder.ets | 104 + .../webmanger/MixWebManager.ets | 90 + .../webrouterservice/webmanger/WebBuilder.ets | 160 + .../webmanger/WebCodeCache.ets | 84 + .../webrouterservice/webmanger/WebManager.ets | 498 + .../webmanger/WebNodeController.ets | 71 + ohos/web_scenekit_hsp/src/main/module.json5 | 14 + .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 8 + .../resources/base/profile/main_pages.json | 5 + ohos/web_scenekit_hsp/src/test/List.test.ets | 5 + .../src/test/LocalUnit.test.ets | 33 + ohos/weex-openharmony/.gitignore | 14 + ohos/weex-openharmony/README.md | 4 + ohos/weex-openharmony/index.js | 13 + ohos/weex-openharmony/package.json | 21 + ohos/weex-openharmony/src/adapter.ts | 182 + 811 files changed, 93272 insertions(+) create mode 100644 ohos/AdvancedAPI_OHOS/.babelrc create mode 100644 ohos/AdvancedAPI_OHOS/.eslintignore create mode 100644 ohos/AdvancedAPI_OHOS/.eslintrc create mode 100644 ohos/AdvancedAPI_OHOS/.gitignore create mode 100644 ohos/AdvancedAPI_OHOS/README.md create mode 100644 ohos/AdvancedAPI_OHOS/build/build.js create mode 100644 ohos/AdvancedAPI_OHOS/build/config.js create mode 100644 ohos/AdvancedAPI_OHOS/jsconfig.json create mode 100644 ohos/AdvancedAPI_OHOS/package.json create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/.gitignore create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/app.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/resources/base/element/string.json create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/resources/base/media/app_icon.png create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/.gitignore create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/BuildProfile.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/Index.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/build-profile.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/consumer-rules.txt create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/hvigorfile.ts create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/obfuscation-rules.txt create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/oh-package.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/components/MainPage.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/utils/advancedapi.min.js create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/module.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/base/element/string.json create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/en_US/element/string.json create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/zh_CN/element/string.json create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/List.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/module.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/List.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/LocalUnit.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/.gitignore create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/Index.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/build-profile.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/hvigorfile.ts create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/obfuscation-rules.txt create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/oh-package.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/ets/pages/Index.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/ets/utils/advancedapi.min.js create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/module.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/element/string.json create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/profile/main_pages.json create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/List.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/module.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/List.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/LocalUnit.test.ets create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/build-profile.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/code-linter.json5 create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/hvigorfile.ts create mode 100644 ohos/AdvancedAPI_OHOS/project/advancedApiHsp/oh-package.json5 create mode 100644 ohos/AdvancedAPI_OHOS/scripts/build_advancedapi.sh create mode 100644 ohos/AdvancedAPI_OHOS/scripts/build_assemble.sh create mode 100644 ohos/AdvancedAPI_OHOS/scripts/build_codecheck.sh create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/account/account.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/base/arrayBuffer2Base64.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/bluetooth/bluetooth.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/accelerometer.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/authenication.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/brightness.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/capture.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/compass.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/contact.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/gyroscope.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/system.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/vibrate.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/wifi.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/file/file.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/keyboard/keyboard.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/location/location.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/audio.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/image.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/video.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/request/request.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/router/navigate.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/scan/scan.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/as/telephony/telephony.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/callback/JSCallback.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/callback/callback-intercept.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/callback/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAccelerometer/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAudio/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAuthentication/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBGAudio/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBluetooth/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBrightness/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBuffer/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCapture/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCompass/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASContact/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASDevice/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileCallback.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileError.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileSystemManager.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/util.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASGyroscope/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASImage/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASInterceptor/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASKeyboard/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASLocation/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASPhone/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRequest/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRouter/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASScan/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVibrator/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVideo/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASWifi/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/module/interface.js create mode 100644 ohos/AdvancedAPI_OHOS/src/advancedApi/util/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/abilityBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/bluetoothBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/brightnessBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/deviceBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/displayBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/fileioBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/mediaLibraryBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/networkBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/promptBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/radioBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/securityBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/sensorBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/wantConstantBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/wifiBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/bridge/windowBase.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/decorators/index.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseErrorCode.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseModule.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/module/Brightness/BrightnessBaseModule.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/module/Network/NetworkBaseModule.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/module/Wifi/WifiBaseModule.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/util/ErrorCode.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/util/Result.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/util/checkDataType.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/util/colors.js create mode 100644 ohos/AdvancedAPI_OHOS/src/base/util/typeTransForm.js create mode 100644 ohos/README.md create mode 100644 ohos/docs/assets/175bef82-f6f8-4bb8-a49c-d6434ffab488.png create mode 100644 ohos/docs/assets/17f22f52-d829-41e7-b3fa-eb4c5559b7a7.png create mode 100644 ohos/docs/assets/23b82328-8505-406a-8a57-5c08e806eedd.png create mode 100644 ohos/docs/assets/25d694fe-9a25-4a89-89a4-64b5d38bed58.png create mode 100644 ohos/docs/assets/280fc365-e4b5-4a60-b923-04e41a99d86a.png create mode 100644 ohos/docs/assets/2ef98fc1-56bc-4596-8a09-8bc20a99c87e.png create mode 100644 ohos/docs/assets/31c7404f-b379-4f9e-ae50-be9fd87cc3d3.png create mode 100644 ohos/docs/assets/3bb62087-559d-4b6a-866f-6c18cc5c2bad.png create mode 100644 ohos/docs/assets/45a6a96e-2d2e-4ab3-baba-23285224d6dd.png create mode 100644 ohos/docs/assets/54fbe58e-12c3-4b1d-8153-2a08e3357f0c.png create mode 100644 ohos/docs/assets/5539cf38-2042-4679-9bca-53d4dff8b95d.png create mode 100644 ohos/docs/assets/576798f5-e7e6-42f4-a936-9582505f0acd.png create mode 100644 ohos/docs/assets/5a66de35-18a7-4b8b-bd93-c58ef3daee78.png create mode 100644 ohos/docs/assets/6d562a4d-1c1e-4e2f-9953-14c02a924ffd.png create mode 100644 ohos/docs/assets/6eb53446-30fd-4b5b-8656-765355fd32bc.png create mode 100644 ohos/docs/assets/7516fe01-caa0-439c-a715-6b4a318a92b6.png create mode 100644 ohos/docs/assets/7c34a3f4-f143-4b66-9081-9ca592675700.png create mode 100644 ohos/docs/assets/7c445fe3-0c07-4266-a68d-080d1d013801.png create mode 100644 ohos/docs/assets/819c8be1-23e8-4332-85f8-c937ae2867d9.png create mode 100644 ohos/docs/assets/89c55b9c-e257-46bf-99cf-324fbc36c719.png create mode 100644 ohos/docs/assets/92477799-9258-416f-9c15-9cd528f919a7.gif create mode 100644 ohos/docs/assets/Snipaste_2024-10-25_10-45-45.png create mode 100644 ohos/docs/assets/Snipaste_2024-10-25_11-04-47.png create mode 100644 ohos/docs/assets/Snipaste_2024-10-25_15-24-49.png create mode 100644 ohos/docs/assets/Snipaste_2024-10-25_15-28-42.png create mode 100644 ohos/docs/assets/a328663c-49af-400c-a6b4-4bb58687f8c1.png create mode 100644 ohos/docs/assets/a62d1304-0d15-427f-af2f-179dcf7373a6.png create mode 100644 ohos/docs/assets/b6302f87-2db1-470b-ac09-0f2da0e9374a.png create mode 100644 ohos/docs/assets/c61700cc-0d3f-4f4c-8491-6bdced2e5e3c.png create mode 100644 ohos/docs/assets/cb897828-c91b-4c90-ba93-edd725633983.png create mode 100644 ohos/docs/assets/cc03849e-a55f-4952-afa4-6e757b35eab6.png create mode 100644 ohos/docs/assets/cd052d56-d6c0-4594-9937-de434d39d53a.png create mode 100644 ohos/docs/assets/dede7776-303e-4c3f-a6a4-a366e6224120.png create mode 100644 ohos/docs/assets/e435707f-4662-4814-a885-314a70f7b33c.png create mode 100644 ohos/docs/assets/e624406a-3c73-40af-85fb-0aa9f07e2909.png create mode 100644 ohos/docs/assets/edb18e95-e129-4e8c-b239-a9ea0a253075.png create mode 100644 ohos/docs/assets/f0453475-e095-4049-b2f0-eae3fd4c0f3c.png create mode 100644 "ohos/docs/weex\351\270\277\350\222\231\345\214\226\346\214\207\345\257\274\346\226\207\346\241\243.md" create mode 100644 ohos/example/ohos-example/.clang-format create mode 100644 ohos/example/ohos-example/AppScope/app.json5 create mode 100644 ohos/example/ohos-example/AppScope/resources/base/element/string.json create mode 100644 ohos/example/ohos-example/AppScope/resources/base/media/app_icon.png create mode 100644 ohos/example/ohos-example/README.md create mode 100644 ohos/example/ohos-example/WebScenekitHsp-default.tgz create mode 100644 ohos/example/ohos-example/build-profile.json5 create mode 100644 ohos/example/ohos-example/entry/.gitignore create mode 100644 ohos/example/ohos-example/entry/build-profile.json5 create mode 100644 ohos/example/ohos-example/entry/hvigorfile.ts create mode 100644 ohos/example/ohos-example/entry/oh-package-lock.json5 create mode 100644 ohos/example/ohos-example/entry/oh-package.json5 create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/CommonAdapter.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/AuthSettingAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/BluetoothAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/ContactAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/DeviceAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/DownLoadAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/HiTraceMeterAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/ImageAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/LocationAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/MediaAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/NetworkAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/PhoneAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/PickerAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/PreferencesAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/RouterAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/ThirdAppAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/WebViewAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apiadapter/WindowAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apimodel/CommonCallback.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apimodel/EmitterCommon.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/apimodel/WeexResult.ts create mode 100644 ohos/example/ohos-example/entry/src/main/ets/commonadapter/componentAPI/LottieAPI.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/har/WebSceneAPI.har create mode 100644 ohos/example/ohos-example/entry/src/main/ets/har/advanced_api_har.har create mode 100644 ohos/example/ohos-example/entry/src/main/ets/pages/ApiAndComponent.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/pages/ExtWebPage.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/pages/Index.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/pages/Second.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/pages/Third.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/interfaces/SameLayer.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/nativeComponents/Button/Button.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/nativeComponents/Lottie/Lottie.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/nativeComponents/RichText/RichText.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/nativeComponents/Slider/Slider.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/nativeComponents/TextArea/TextArea.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/nativeComponents/Video/Video.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/nativeComponents/Web/Web.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/utils/LottieManager.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/samelayer/utils/WebManger.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/utils/FileUtils.ets create mode 100644 ohos/example/ohos-example/entry/src/main/ets/utils/GlobalThis.ets create mode 100644 ohos/example/ohos-example/entry/src/main/module.json5 create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/element/color.json create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/element/float.json create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/element/string.json create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/media/back.svg create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/media/ic_back.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/media/ic_widget.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/media/icon.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/media/search.svg create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/profile/form_config.json create mode 100644 ohos/example/ohos-example/entry/src/main/resources/base/profile/main_pages.json create mode 100644 ohos/example/ohos-example/entry/src/main/resources/en_US/element/string.json create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/WebSceneConfig.json create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/commons.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/airplane_search.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/airplane_search_active.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/arrow_right.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/back.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/back_white.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/default.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/heart.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/like.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/like_back.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/liked_back.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/loading.gif create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/loading.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/message.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/message_active.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/my.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/my_active.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/navbar_add.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/no-result.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/placeholder.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/refresh.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/refresh_back.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/scan.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/scan_back.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/share_white.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/task.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/task_active.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/trash.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/triangle-right.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/triangle_bottom.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/triangle_down.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/triangle_up.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/images/video-play.png create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/eventForStop/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/eventForStop/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/fix_pagingEnabled/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/fix_pagingEnabled/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/harmonyPage/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/harmonyPage/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/index/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/index/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/jsDemo/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/jsDemo/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/list_pageEnable/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/list_pageEnable/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/list_scrollbar/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/list_scrollbar/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/lottie_complete/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/lottie_complete/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/lottie_test/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/lottie_test/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/lottie_test2/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/lottie_test2/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest1/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest1/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest2/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest2/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest3/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest3/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest4/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest4/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest5/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/mapTest5/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage1/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage1/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage10/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage10/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage11/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage11/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage12/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage12/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage13/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage13/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage14/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage14/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage15/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage15/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage2/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage2/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage3/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage3/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage4/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage4/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage5/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage5/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage6/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage6/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage7/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage7/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage8/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage8/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage9/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/multiPage9/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/navigator_pop/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/navigator_pop/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/navigator_push/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/navigator_push/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/pushState/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/pushState/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/sameLayerSample1/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/sameLayerSample1/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/sameLayerSample2/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/sameLayerSample2/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/scrollerPage1/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/scrollerPage1/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/scrollerPage2/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/scrollerPage2/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage1/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage1/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage2/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage2/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage3/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage3/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage4/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage4/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage5/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage5/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage6/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/singlePage6/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/specialPage/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/specialPage/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/test_toast/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/test_toast/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/umewebview-communication/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/umewebview-communication/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/video/entry.d0bc9dc540001b2486a6.web.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/pages/video/entry.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/Unknown.mp3 create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/echarts.min.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/f2.min.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/jSignature.min.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/jquery.json-editor.min.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/jquery.min.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/preview.css create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/assets/qrcode.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/audio.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/bar.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/echarts.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/echarts.min.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/memoryOut.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/preview.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/radar.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/signature.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/test.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/test1.html create mode 100644 ohos/example/ohos-example/entry/src/main/resources/rawfile/frameworkTest_web/web/umeH5Flexible.js create mode 100644 ohos/example/ohos-example/entry/src/main/resources/zh_CN/element/string.json create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/ets/testability/TestAbility.ets create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/ets/testability/pages/Index.ets create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ts create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/module.json5 create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/resources/base/element/color.json create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/resources/base/element/string.json create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/resources/base/media/icon.png create mode 100644 ohos/example/ohos-example/entry/src/ohosTest/resources/base/profile/test_pages.json create mode 100644 ohos/example/ohos-example/hvigor/hvigor-config.json5 create mode 100644 ohos/example/ohos-example/hvigorfile.ts create mode 100644 ohos/example/ohos-example/oh-package-lock.json5 create mode 100644 ohos/example/ohos-example/oh-package.json5 create mode 100644 ohos/example/weex-example/.babelrc create mode 100644 ohos/example/weex-example/.gitignore create mode 100644 ohos/example/weex-example/.postcssrc.js create mode 100644 ohos/example/weex-example/README.md create mode 100644 ohos/example/weex-example/android.config.json create mode 100644 ohos/example/weex-example/babel.config.js create mode 100644 ohos/example/weex-example/configs/config.js create mode 100644 ohos/example/weex-example/configs/helper.js create mode 100644 ohos/example/weex-example/configs/hotreload.js create mode 100644 ohos/example/weex-example/configs/logo.png create mode 100644 ohos/example/weex-example/configs/plugin.js create mode 100644 ohos/example/weex-example/configs/qrcode-w-plugin.js create mode 100644 ohos/example/weex-example/configs/transform-loader.js create mode 100644 ohos/example/weex-example/configs/utils.js create mode 100644 ohos/example/weex-example/configs/vue-loader.conf.js create mode 100644 ohos/example/weex-example/configs/webpack.common.conf.js create mode 100644 ohos/example/weex-example/configs/webpack.dev.conf.js create mode 100644 ohos/example/weex-example/configs/webpack.harmony.conf.js create mode 100644 ohos/example/weex-example/configs/webpack.prod.conf.js create mode 100644 ohos/example/weex-example/configs/webpack.release.conf.js create mode 100644 ohos/example/weex-example/configs/weexTransform.js create mode 100644 ohos/example/weex-example/ios.config.json create mode 100644 ohos/example/weex-example/package.json create mode 100644 ohos/example/weex-example/plugins/plugins.json create mode 100644 ohos/example/weex-example/src/components/HelloWorld.vue create mode 100644 ohos/example/weex-example/src/entry.js create mode 100644 ohos/example/weex-example/src/index.vue create mode 100644 ohos/example/weex-example/src/pages/demo111/entry.vue create mode 100644 ohos/example/weex-example/src/pages/index/entry.vue create mode 100644 ohos/example/weex-example/src/router.js create mode 100644 ohos/example/weex-example/web/assets/preview.css create mode 100644 ohos/example/weex-example/web/assets/qrcode.js create mode 100644 ohos/example/weex-example/web/index.html create mode 100644 ohos/example/weex-example/web/preview.html create mode 100644 ohos/example/weex-example/webpack.config.js create mode 100644 ohos/test/commonTest/.babelrc create mode 100644 ohos/test/commonTest/.eslintignore create mode 100644 ohos/test/commonTest/.eslintrc.js create mode 100644 ohos/test/commonTest/.gitignore create mode 100644 ohos/test/commonTest/.postcssrc.js create mode 100644 ohos/test/commonTest/.prettierignore create mode 100644 ohos/test/commonTest/.prettierrc.js create mode 100644 ohos/test/commonTest/README.md create mode 100644 ohos/test/commonTest/android.config.json create mode 100644 ohos/test/commonTest/babel.config.js create mode 100644 ohos/test/commonTest/configs/config.js create mode 100644 ohos/test/commonTest/configs/gesture-loader.js create mode 100644 ohos/test/commonTest/configs/helper.js create mode 100644 ohos/test/commonTest/configs/hotreload.js create mode 100644 ohos/test/commonTest/configs/logo.png create mode 100644 ohos/test/commonTest/configs/plugin.js create mode 100644 ohos/test/commonTest/configs/qrcode-w-plugin.js create mode 100644 ohos/test/commonTest/configs/registerGesture.js create mode 100644 ohos/test/commonTest/configs/transform-loader.js create mode 100644 ohos/test/commonTest/configs/url-config.js create mode 100644 ohos/test/commonTest/configs/utils.js create mode 100644 ohos/test/commonTest/configs/vue-loader.conf.js create mode 100644 ohos/test/commonTest/configs/webpack.common.conf.js create mode 100644 ohos/test/commonTest/configs/webpack.dev.conf.js create mode 100644 ohos/test/commonTest/configs/webpack.harmony.conf.js create mode 100644 ohos/test/commonTest/configs/webpack.prod.conf.js create mode 100644 ohos/test/commonTest/configs/webpack.release.conf.js create mode 100644 ohos/test/commonTest/configs/webpack.test.conf.js create mode 100644 ohos/test/commonTest/configs/weexTransform.js create mode 100644 ohos/test/commonTest/entry.json create mode 100644 ohos/test/commonTest/ios.config.json create mode 100644 ohos/test/commonTest/package.json create mode 100644 ohos/test/commonTest/patches/weex-vue-render+1.0.36.patch create mode 100644 ohos/test/commonTest/src/App.vue create mode 100644 ohos/test/commonTest/src/assets/css/controlbar.css create mode 100644 ohos/test/commonTest/src/assets/css/global.css create mode 100644 ohos/test/commonTest/src/assets/css/mask.css create mode 100644 ohos/test/commonTest/src/assets/fonts/dinBold.ttf create mode 100644 ohos/test/commonTest/src/assets/js/citylist.json create mode 100644 ohos/test/commonTest/src/assets/js/index.js create mode 100644 ohos/test/commonTest/src/assets/json/Boat_Loader.json create mode 100644 ohos/test/commonTest/src/assets/json/Calender.json create mode 100644 ohos/test/commonTest/src/assets/json/comment.json create mode 100644 ohos/test/commonTest/src/assets/json/navbar.json create mode 100644 ohos/test/commonTest/src/assets/json/priceDetail.json create mode 100644 ohos/test/commonTest/src/components/airportList.vue create mode 100644 ohos/test/commonTest/src/components/bank.vue create mode 100644 ohos/test/commonTest/src/components/baseSameLayer.vue create mode 100644 ohos/test/commonTest/src/components/button.vue create mode 100644 ohos/test/commonTest/src/components/datePicker.vue create mode 100644 ohos/test/commonTest/src/components/datePicker_back.vue create mode 100644 ohos/test/commonTest/src/components/geolocation.vue create mode 100644 ohos/test/commonTest/src/components/hl-button-base.vue create mode 100644 ohos/test/commonTest/src/components/hl-button.vue create mode 100644 ohos/test/commonTest/src/components/hl-lottie-base.vue create mode 100644 ohos/test/commonTest/src/components/hl-lottie.vue create mode 100644 ohos/test/commonTest/src/components/hl-richtext-base.vue create mode 100644 ohos/test/commonTest/src/components/hl-richtext.vue create mode 100644 ohos/test/commonTest/src/components/hl-slider-base.vue create mode 100644 ohos/test/commonTest/src/components/hl-slider.vue create mode 100644 ohos/test/commonTest/src/components/hl-textarea-base.vue create mode 100644 ohos/test/commonTest/src/components/hl-textarea.vue create mode 100644 ohos/test/commonTest/src/components/hl-video-base.vue create mode 100644 ohos/test/commonTest/src/components/hl-video.vue create mode 100644 ohos/test/commonTest/src/components/hl-web-base.vue create mode 100644 ohos/test/commonTest/src/components/hl-web.vue create mode 100644 ohos/test/commonTest/src/components/loading.js create mode 100644 ohos/test/commonTest/src/components/loading.vue create mode 100644 ohos/test/commonTest/src/components/loadingOld.vue create mode 100644 ohos/test/commonTest/src/components/modal.vue create mode 100644 ohos/test/commonTest/src/components/navbar.vue create mode 100644 ohos/test/commonTest/src/components/newImage.vue create mode 100644 ohos/test/commonTest/src/components/oldToast.vue create mode 100644 ohos/test/commonTest/src/components/picker.vue create mode 100644 ohos/test/commonTest/src/components/profession.vue create mode 100644 ohos/test/commonTest/src/components/searchText.vue create mode 100644 ohos/test/commonTest/src/components/searchText2.vue create mode 100644 ohos/test/commonTest/src/components/shopList.vue create mode 100644 ohos/test/commonTest/src/components/swipeCard.vue create mode 100644 ohos/test/commonTest/src/components/toast.vue create mode 100644 ohos/test/commonTest/src/components/wxLottie.vue create mode 100644 ohos/test/commonTest/src/entry.js create mode 100644 ohos/test/commonTest/src/images/airplane_search.png create mode 100644 ohos/test/commonTest/src/images/airplane_search_active.png create mode 100644 ohos/test/commonTest/src/images/arrow_right.png create mode 100644 ohos/test/commonTest/src/images/back.png create mode 100644 ohos/test/commonTest/src/images/back_white.png create mode 100644 ohos/test/commonTest/src/images/default.png create mode 100644 ohos/test/commonTest/src/images/heart.png create mode 100644 ohos/test/commonTest/src/images/like.png create mode 100644 ohos/test/commonTest/src/images/like_back.png create mode 100644 ohos/test/commonTest/src/images/liked_back.png create mode 100644 ohos/test/commonTest/src/images/loading.gif create mode 100644 ohos/test/commonTest/src/images/loading.png create mode 100644 ohos/test/commonTest/src/images/message.png create mode 100644 ohos/test/commonTest/src/images/message_active.png create mode 100644 ohos/test/commonTest/src/images/my.png create mode 100644 ohos/test/commonTest/src/images/my_active.png create mode 100644 ohos/test/commonTest/src/images/navbar_add.png create mode 100644 ohos/test/commonTest/src/images/no-result.png create mode 100644 ohos/test/commonTest/src/images/placeholder.png create mode 100644 ohos/test/commonTest/src/images/refresh.png create mode 100644 ohos/test/commonTest/src/images/refresh_back.png create mode 100644 ohos/test/commonTest/src/images/scan.png create mode 100644 ohos/test/commonTest/src/images/scan_back.png create mode 100644 ohos/test/commonTest/src/images/share_white.png create mode 100644 ohos/test/commonTest/src/images/task.png create mode 100644 ohos/test/commonTest/src/images/task_active.png create mode 100644 ohos/test/commonTest/src/images/trash.png create mode 100644 ohos/test/commonTest/src/images/triangle-right.png create mode 100644 ohos/test/commonTest/src/images/triangle_bottom.png create mode 100644 ohos/test/commonTest/src/images/triangle_down.png create mode 100644 ohos/test/commonTest/src/images/triangle_up.png create mode 100644 ohos/test/commonTest/src/images/video-play.png create mode 100644 ohos/test/commonTest/src/mixin/compMixin.js create mode 100644 ohos/test/commonTest/src/mixin/jumpMixin.js create mode 100644 ohos/test/commonTest/src/mixin/screenMixin.js create mode 100644 ohos/test/commonTest/src/pages/eventForStop/entry.vue create mode 100644 ohos/test/commonTest/src/pages/eventForTouch/entry.vue create mode 100644 ohos/test/commonTest/src/pages/fix_pagingEnabled/entry.vue create mode 100644 ohos/test/commonTest/src/pages/harmonyPage/entry.vue create mode 100644 ohos/test/commonTest/src/pages/index/components/indexTab.vue create mode 100644 ohos/test/commonTest/src/pages/index/components/tab1.vue create mode 100644 ohos/test/commonTest/src/pages/index/components/tab2.vue create mode 100644 ohos/test/commonTest/src/pages/index/components/tab3.vue create mode 100644 ohos/test/commonTest/src/pages/index/components/tab4.vue create mode 100644 ohos/test/commonTest/src/pages/index/components/tab5.vue create mode 100644 ohos/test/commonTest/src/pages/index/components/tab6.vue create mode 100644 ohos/test/commonTest/src/pages/index/entry.vue create mode 100644 ohos/test/commonTest/src/pages/jsDemo/entry.vue create mode 100644 ohos/test/commonTest/src/pages/list_pageEnable/entry.vue create mode 100644 ohos/test/commonTest/src/pages/list_scrollbar/entry.vue create mode 100644 ohos/test/commonTest/src/pages/long_list/entry.vue create mode 100644 ohos/test/commonTest/src/pages/lottie_complete/entry.vue create mode 100644 ohos/test/commonTest/src/pages/lottie_test/entry.vue create mode 100644 ohos/test/commonTest/src/pages/lottie_test2/entry.vue create mode 100644 ohos/test/commonTest/src/pages/mapTest1/entry.vue create mode 100644 ohos/test/commonTest/src/pages/mapTest1/mapdata.js create mode 100644 ohos/test/commonTest/src/pages/mapTest2/entry.vue create mode 100644 ohos/test/commonTest/src/pages/mapTest2/mapdata.js create mode 100644 ohos/test/commonTest/src/pages/mapTest3/entry.vue create mode 100644 ohos/test/commonTest/src/pages/mapTest3/mapdata.js create mode 100644 ohos/test/commonTest/src/pages/mapTest4/entry.vue create mode 100644 ohos/test/commonTest/src/pages/mapTest4/mapdata.js create mode 100644 ohos/test/commonTest/src/pages/mapTest5/entry.vue create mode 100644 ohos/test/commonTest/src/pages/mapTest5/mapdata.js create mode 100644 ohos/test/commonTest/src/pages/multiPage1/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage10/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage11/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage12/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage13/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage14/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage15/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage2/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage3/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage4/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage5/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage6/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage7/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage8/entry.vue create mode 100644 ohos/test/commonTest/src/pages/multiPage9/entry.vue create mode 100644 ohos/test/commonTest/src/pages/navigator_pop/entry.vue create mode 100644 ohos/test/commonTest/src/pages/navigator_push/entry.vue create mode 100644 ohos/test/commonTest/src/pages/pick/entry.vue create mode 100644 ohos/test/commonTest/src/pages/pushState/entry.vue create mode 100644 ohos/test/commonTest/src/pages/sameLayerSample1/entry.vue create mode 100644 ohos/test/commonTest/src/pages/sameLayerSample2/entry.vue create mode 100644 ohos/test/commonTest/src/pages/scrollerPage1/entry.vue create mode 100644 ohos/test/commonTest/src/pages/scrollerPage2/entry.vue create mode 100644 ohos/test/commonTest/src/pages/singlePage1/entry.vue create mode 100644 ohos/test/commonTest/src/pages/singlePage2/entry.vue create mode 100644 ohos/test/commonTest/src/pages/singlePage3/entry.vue create mode 100644 ohos/test/commonTest/src/pages/singlePage4/entry.vue create mode 100644 ohos/test/commonTest/src/pages/singlePage5/entry.vue create mode 100644 ohos/test/commonTest/src/pages/singlePage6/entry.vue create mode 100644 ohos/test/commonTest/src/pages/specialPage/entry.vue create mode 100644 ohos/test/commonTest/src/pages/test_toast/entry.vue create mode 100644 ohos/test/commonTest/src/pages/umewebview-communication/entry.vue create mode 100644 ohos/test/commonTest/src/pages/video/entry.vue create mode 100644 ohos/test/commonTest/src/utils/api.js create mode 100644 ohos/test/commonTest/src/utils/constants.js create mode 100644 ohos/test/commonTest/src/utils/filter.js create mode 100644 ohos/test/commonTest/src/utils/fixFloat.js create mode 100644 ohos/test/commonTest/src/utils/h5.js create mode 100644 ohos/test/commonTest/src/utils/index.js create mode 100644 ohos/test/commonTest/src/utils/jsapi.js create mode 100644 ohos/test/commonTest/src/utils/scroll.js create mode 100644 ohos/test/commonTest/src/utils/tools.js create mode 100644 ohos/test/commonTest/src/utils/web.js create mode 100644 ohos/test/commonTest/src/web/assets/Unknown.mp3 create mode 100644 ohos/test/commonTest/src/web/assets/echarts.min.js create mode 100644 ohos/test/commonTest/src/web/assets/f2.min.js create mode 100644 ohos/test/commonTest/src/web/assets/jSignature.min.js create mode 100644 ohos/test/commonTest/src/web/assets/jquery.json-editor.min.js create mode 100644 ohos/test/commonTest/src/web/assets/jquery.min.js create mode 100644 ohos/test/commonTest/src/web/assets/preview.css create mode 100644 ohos/test/commonTest/src/web/assets/qrcode.js create mode 100644 ohos/test/commonTest/src/web/audio.html create mode 100644 ohos/test/commonTest/src/web/bar.html create mode 100644 ohos/test/commonTest/src/web/echarts.html create mode 100644 ohos/test/commonTest/src/web/echarts.min.js create mode 100644 ohos/test/commonTest/src/web/memoryOut.html create mode 100644 ohos/test/commonTest/src/web/preview.html create mode 100644 ohos/test/commonTest/src/web/radar.html create mode 100644 ohos/test/commonTest/src/web/signature.html create mode 100644 ohos/test/commonTest/src/web/test.html create mode 100644 ohos/test/commonTest/src/web/test1.html create mode 100644 ohos/test/commonTest/src/web/umeH5Flexible.js create mode 100644 ohos/test/commonTest/web/assets/echarts.min.js create mode 100644 ohos/test/commonTest/web/assets/f2.min.js create mode 100644 ohos/test/commonTest/web/assets/jquery.json-editor.min.js create mode 100644 ohos/test/commonTest/web/assets/jquery.min.js create mode 100644 ohos/test/commonTest/web/assets/preview.css create mode 100644 ohos/test/commonTest/web/assets/qrcode.js create mode 100644 ohos/test/commonTest/web/bar.html create mode 100644 ohos/test/commonTest/web/echarts.html create mode 100644 ohos/test/commonTest/web/index.html create mode 100644 ohos/test/commonTest/web/preview.html create mode 100644 ohos/test/commonTest/webpack.config.js create mode 100644 ohos/web_api_ohos/.gitignore create mode 100644 ohos/web_api_ohos/AppScope/app.json5 create mode 100644 ohos/web_api_ohos/AppScope/resources/base/element/string.json create mode 100644 ohos/web_api_ohos/AppScope/resources/base/media/app_icon.png create mode 100644 ohos/web_api_ohos/WebSceneAPI/.gitignore create mode 100644 ohos/web_api_ohos/WebSceneAPI/BuildProfile.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/Index.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/build-profile.json5 create mode 100644 ohos/web_api_ohos/WebSceneAPI/consumer-rules.txt create mode 100644 ohos/web_api_ohos/WebSceneAPI/hvigorfile.ts create mode 100644 ohos/web_api_ohos/WebSceneAPI/obfuscation-rules.txt create mode 100644 ohos/web_api_ohos/WebSceneAPI/oh-package.json5 create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/constants/BusinessConstants.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/constants/StyleConstants.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/entity/CommonConfig.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/entity/StatusCode.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/js-base64/LICENSE.md create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/js-base64/README.md create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/js-base64/base64.d.ts create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/js-base64/base64.js create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/js-base64/base64.mjs create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/js-base64/package.json create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/log/Log.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/utils/CommonUtil.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/utils/PermissionUtil.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/common/utils/WindowUtil.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/components/MainPage.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/model/CallBackAdapter.ts create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/model/GlobalThis.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/module/ability/WSRouter.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/module/bluetooth/WSBluetooth.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/module/calendar/WSCalendar.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/module/media/WSMedia.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/module/network/WSNetwork.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/module/telephony/WSContact.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/ets/module/window/WSWindow.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/module.json5 create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/resources/base/element/string.json create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/resources/en_US/element/string.json create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/main/resources/zh_CN/element/string.json create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/ohosTest/ets/test/List.test.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/ohosTest/module.json5 create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/test/List.test.ets create mode 100644 ohos/web_api_ohos/WebSceneAPI/src/test/LocalUnit.test.ets create mode 100644 ohos/web_api_ohos/build-profile.json5 create mode 100644 ohos/web_api_ohos/code-linter.json5 create mode 100644 ohos/web_api_ohos/entry/.gitignore create mode 100644 ohos/web_api_ohos/entry/build-profile.json5 create mode 100644 ohos/web_api_ohos/entry/hvigorfile.ts create mode 100644 ohos/web_api_ohos/entry/obfuscation-rules.txt create mode 100644 ohos/web_api_ohos/entry/oh-package-lock.json5 create mode 100644 ohos/web_api_ohos/entry/oh-package.json5 create mode 100644 ohos/web_api_ohos/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 ohos/web_api_ohos/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 ohos/web_api_ohos/entry/src/main/ets/pages/Index.ets create mode 100644 ohos/web_api_ohos/entry/src/main/module.json5 create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/element/color.json create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/element/string.json create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/media/background.png create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/media/foreground.png create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/media/layered_image.json create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/media/startIcon.png create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/profile/backup_config.json create mode 100644 ohos/web_api_ohos/entry/src/main/resources/base/profile/main_pages.json create mode 100644 ohos/web_api_ohos/entry/src/main/resources/en_US/element/string.json create mode 100644 ohos/web_api_ohos/entry/src/main/resources/zh_CN/element/string.json create mode 100644 ohos/web_api_ohos/entry/src/mock/mock-config.json5 create mode 100644 ohos/web_api_ohos/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 ohos/web_api_ohos/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 ohos/web_api_ohos/entry/src/ohosTest/module.json5 create mode 100644 ohos/web_api_ohos/entry/src/test/List.test.ets create mode 100644 ohos/web_api_ohos/entry/src/test/LocalUnit.test.ets create mode 100644 ohos/web_api_ohos/hvigor/hvigor-config.json5 create mode 100644 ohos/web_api_ohos/hvigorfile.ts create mode 100644 ohos/web_api_ohos/oh-package-lock.json5 create mode 100644 ohos/web_api_ohos/oh-package.json5 create mode 100644 ohos/web_scenekit_hsp/Index.ets create mode 100644 ohos/web_scenekit_hsp/build-profile.json5 create mode 100644 ohos/web_scenekit_hsp/hvigorfile.ts create mode 100644 ohos/web_scenekit_hsp/obfuscation-rules.txt create mode 100644 ohos/web_scenekit_hsp/oh-package.json5 create mode 100644 ohos/web_scenekit_hsp/src/main/ets/ExtWeb.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/ExtWebController.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/BroadcastChannel.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/ClipboardAPI.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/DeviceInfoAPI.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/GlobalEvent.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/KeyboardAPI.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/Navigator.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/StreamAPI.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/UpdateApi.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/ViewAppear.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/apimodel/ApiOptions.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/api/apimodel/WeexResult.ts create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/constants/Constants.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/model/JsBridge.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/model/WebAdapter.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/adapterservice/utils/GlobalThis.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/constants/Constants.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/FileUtils.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/LocalUpdateManager.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/UpdateManager.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/MiniConfigRepository.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/MiniRepository.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/bean/CompareVersion.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/bean/LocalVersionInfo.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/bean/MiniConfig.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/bean/NetworkTask.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/bean/UpdateConfig.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/local/MiniLocalFileDataSource.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/local/MiniRawFileDataSource.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/network/MiniConfigNetworkDataSource.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/bundleservice/update/data/source/network/MiniNetworkDataSource.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/common/Logger.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/pages/pageTemplate.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/samelayer/SameLayerManager.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/utils/Calc.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/constant/Constant.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/BuilderData.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/IdResource.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/NodeType.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/PreRenderUrl.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/Project.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/RouteNode.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/RouteType.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/entity/UrlInfo.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/util/ParseUtil.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/common/util/UrlUtil.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/globalrouter/GlobalRouter.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/globalrouter/RouterStorage.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/pagemanager/PageModel.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/pagemanager/PageModelController.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/pagemanager/SubPage.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/webmanger/MixWebBuilder.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/webmanger/MixWebManager.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/webmanger/WebBuilder.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/webmanger/WebCodeCache.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/webmanger/WebManager.ets create mode 100644 ohos/web_scenekit_hsp/src/main/ets/webrouterservice/webmanger/WebNodeController.ets create mode 100644 ohos/web_scenekit_hsp/src/main/module.json5 create mode 100644 ohos/web_scenekit_hsp/src/main/resources/base/element/color.json create mode 100644 ohos/web_scenekit_hsp/src/main/resources/base/element/string.json create mode 100644 ohos/web_scenekit_hsp/src/main/resources/base/profile/main_pages.json create mode 100644 ohos/web_scenekit_hsp/src/test/List.test.ets create mode 100644 ohos/web_scenekit_hsp/src/test/LocalUnit.test.ets create mode 100644 ohos/weex-openharmony/.gitignore create mode 100644 ohos/weex-openharmony/README.md create mode 100644 ohos/weex-openharmony/index.js create mode 100644 ohos/weex-openharmony/package.json create mode 100644 ohos/weex-openharmony/src/adapter.ts diff --git a/ohos/AdvancedAPI_OHOS/.babelrc b/ohos/AdvancedAPI_OHOS/.babelrc new file mode 100644 index 0000000000..f33928bb09 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/.babelrc @@ -0,0 +1,22 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "modules":false, + "targets":{ + "chrome":"73", + "node":"16" + } + } + ] + ], + "plugins": [ + [ + "@babel/plugin-proposal-decorators", + { + "legacy": true + } + ] + ] +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/.eslintignore b/ohos/AdvancedAPI_OHOS/.eslintignore new file mode 100644 index 0000000000..3e22129247 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/.eslintignore @@ -0,0 +1 @@ +/dist \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/.eslintrc b/ohos/AdvancedAPI_OHOS/.eslintrc new file mode 100644 index 0000000000..8ae9b58d75 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/.eslintrc @@ -0,0 +1,154 @@ +{ + "parser": "babel-eslint", + + "extends": [ + "plugin:flowtype/recommended" + ], + + "plugins": [ + "flowtype" + ], + + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + + "env": { + "es6": true, + "node": true, + "mocha": true + }, + "globals": { + "globalThis": false, + "AppStorage": true, + "requireAPI": true, + "getCachedElement": true, + "document": true + }, + + "rules": { + "flowtype/no-types-missing-file-annotation": 0, + "accessor-pairs": 2, + "arrow-spacing": [2, { "before": true, "after": true }], + "block-spacing": [2, "always"], + "brace-style": [2, "1tbs", { "allowSingleLine": true }], + "camelcase": [2, { "properties": "never" }], + "comma-dangle": [2, "only-multiline"], + "comma-spacing": [2, { "before": false, "after": true }], + "comma-style": [2, "last"], + "constructor-super": 2, + "curly": [2, "multi-line"], + "dot-location": [2, "property"], + "eol-last": 2, + "eqeqeq": [2, "allow-null"], + "generator-star-spacing": [2, { "before": true, "after": true }], + "handle-callback-err": [2, "^(err|error)$" ], + "indent": [2, 2, { "SwitchCase": 1 }], + "key-spacing": [2, { "beforeColon": false, "afterColon": true }], + "keyword-spacing": [2, { "before": true, "after": true }], + "new-cap": [2, { "newIsCap": true, "capIsNew": false }], + "new-parens": 2, + "no-array-constructor": 2, + "no-caller": 2, + "no-class-assign": 2, + "no-cond-assign": 2, + "no-const-assign": 2, + "no-control-regex": 2, + "no-debugger": 2, + "no-delete-var": 2, + "no-dupe-args": 2, + "no-dupe-class-members": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-empty-character-class": 2, + "no-empty-pattern": 2, + "no-eval": 2, + "no-ex-assign": 2, + "no-extend-native": 2, + "no-extra-bind": 2, + "no-extra-boolean-cast": 2, + "no-extra-parens": [2, "functions"], + "no-fallthrough": 2, + "no-floating-decimal": 2, + "no-func-assign": 2, + "no-implied-eval": 2, + "no-inner-declarations": [2, "functions"], + "no-invalid-regexp": 2, + "no-irregular-whitespace": 2, + "no-iterator": 2, + "no-label-var": 2, + "no-labels": [2, { "allowLoop": false, "allowSwitch": false }], + "no-lone-blocks": 2, + "no-mixed-spaces-and-tabs": 2, + "no-multi-spaces": 2, + "no-multi-str": 2, + "no-multiple-empty-lines": [2, { "max": 1 }], + "no-native-reassign": 2, + "no-negated-in-lhs": 2, + "no-new-object": 2, + "no-new-require": 2, + "no-new-symbol": 2, + "no-new-wrappers": 2, + "no-obj-calls": 2, + "no-octal": 2, + "no-octal-escape": 2, + "no-path-concat": 2, + "no-proto": 2, + "no-redeclare": 2, + "no-regex-spaces": 2, + "no-return-assign": [2, "except-parens"], + "no-self-assign": 2, + "no-self-compare": 2, + "no-sequences": 2, + "no-shadow-restricted-names": 2, + "no-spaced-func": 2, + "no-sparse-arrays": 2, + "no-this-before-super": 2, + "no-throw-literal": 2, + "no-trailing-spaces": 2, + "no-undef": 2, + "no-undef-init": 2, + "no-unexpected-multiline": 2, + "no-unmodified-loop-condition": 2, + "no-unneeded-ternary": [2, { "defaultAssignment": false }], + "no-unreachable": 2, + "no-unsafe-finally": 2, + "no-unused-vars": [2, { "vars": "all", "args": "none" }], + "no-useless-call": 2, + "no-useless-computed-key": 2, + "no-useless-constructor": 2, + "no-useless-escape": 2, + "no-whitespace-before-property": 2, + "no-with": 2, + "one-var": [2, { "initialized": "never" }], + "padded-blocks": [2, "never"], + "quotes": [2, "single", {"avoidEscape": true, "allowTemplateLiterals": true}], + "semi": [2, "never"], + "semi-spacing": [2, { "before": false, "after": true }], + "space-before-blocks": [2, "always"], + "space-in-parens": [2, "never"], + "space-infix-ops": 2, + "space-unary-ops": [2, { "words": true, "nonwords": false }], + "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }], + "template-curly-spacing": [2, "never"], + "use-isnan": 2, + "valid-typeof": 2, + "wrap-iife": [2, "any"], + "yield-star-spacing": [2, "both"], + "yoda": [2, "never"], + + "no-var": 2, + "prefer-const": 2, + "object-curly-spacing": [2, "always", { + "objectsInObjects": false + }], + "array-bracket-spacing": [2, "never"] + }, + + "settings": { + "flowtype": { + "onlyFilesWithFlowAnnotation": true + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/.gitignore b/ohos/AdvancedAPI_OHOS/.gitignore new file mode 100644 index 0000000000..673a34a791 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/.gitignore @@ -0,0 +1,11 @@ +dist +node_modules +src/qafApi/modules/Account/environment/SetMirror.js +package-lock.json +oh_modules +hvigor +.hvigor +.idea +oh-package-lock.json5 +local.properties +hvigorw \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/README.md b/ohos/AdvancedAPI_OHOS/README.md new file mode 100644 index 0000000000..43e1e333f8 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/README.md @@ -0,0 +1,22 @@ +### 编译生成js + +git clone下载源码,在根目录中执行: + +``` +npm install +``` + +然后使用如下命令打包生成一个js文件: + +``` +npm run build:advanced +``` + +### 生成har包或者hsp包 + +- 使用DevEco Studio打开project/advancedHsp工程,新建如下两个路径: + - project\advancedApiHsp\advanced_api_har\src\main\ets\utils\ + - project\advancedApiHsp\advanced_api_hsp\src\main\ets\utils\ +- 把生成的js文件dist/advancedapi.min.js复制到上述位置 +- 点击菜单: `Build` -- `Make All Modules`生成所有模块 +- har包生成在路径:advancedApiHsp\advanced_api_har\build\default\outputs\default中 diff --git a/ohos/AdvancedAPI_OHOS/build/build.js b/ohos/AdvancedAPI_OHOS/build/build.js new file mode 100644 index 0000000000..f53b8079aa --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/build/build.js @@ -0,0 +1,141 @@ +const fs = require('fs') +const path = require('path') +const gzip = require('zlib').createGzip() +const rollup = require('rollup') + +const getConfig = require('./config') + +if (!fs.existsSync('dist')) { + fs.mkdirSync('dist') +} + +let isWatch = false +if (process.argv[3]) { + isWatch = process.argv[3] === '--watch' || process.argv[3] === '-w' +} + +// build specific package +if (process.argv[2]) { + build(process.argv[2]) +} else { + console.log('\nPlease specify the package you want to build. [native, runtime, browser, vue]') +} +build(process.argv[2]) + +function build (name) { + const pkgName = 'API' + console.log(`\n => start to build ${name} (${pkgName})\n`) + + if (isWatch) { + runRollupOnWatch(name) + return + } + + const config = getConfig({ name }) + const minifyConfig = getConfig({ minify: true, name }) + + return new Promise((resolve, reject) => { + runRollup(config).then(() => { + runRollup(minifyConfig).then(() => { + if(name==='advanced'){ + replaceFile(minifyConfig.output.file, + [ + /;import/g, + /from"/g, + /import{/g, + /}from/g, + /import"/g, + /";function/g + ] + , + [ + ';\nimport', + 'from "', + 'import {', + '} from', + 'import "', + '";\nfunction' + ]).then(()=>{ + zip(minifyConfig.output.file, resolve) + }) + }else{ + zip(minifyConfig.output.file, resolve) + } + }) + }) + }) +} + +function runRollup (config) { + return new Promise((resolve, reject) => { + rollup.rollup(config).then(bundle => { + bundle.write(config).then(() => { + report(config.output.file) + resolve() + }) + }) + }) +} + +function runRollupOnWatch (name) { + const config = getConfig({ name, isWatch }) + const watcher = rollup.watch(config) + watcher.on('event', event => { + switch (event.code) { + case 'STARTING': + console.log('checking rollup.watch version...') + break + case 'BUILD_START': + console.log('bundling...') + break + case 'BUILD_END': + break + case 'END': + console.info('compile jsBundle success...') + break + case 'ERROR': + console.error('ERROR: ', event.error) + break + } + }) +} + +function zip (filePath, callback) { + const read = fs.createReadStream(filePath) + const write = fs.createWriteStream(filePath + '.gz') + read.pipe(gzip).pipe(write).on('close', () => { + report(filePath + '.gz') + callback && callback() + }) +} + +function report (filePath) { + const size = (fs.statSync(filePath).size / 1024).toFixed(2) + 'KB' + const file = path.relative(process.cwd(), filePath) + console.log(` => write ${file} (${size})`) +} + +function replaceFile (filePath, sourceRegx, targetStr) { + return new Promise((resolve, reject) => { + fs.readFile(filePath, function (err, data) { + if (err) { + console.error(err) + reject() + return + } + let str = data.toString() + for (let i = 0; i < sourceRegx.length; i++) { + str = str.replace(sourceRegx[i], targetStr[i]) + } + fs.writeFile(filePath, str, function (err) { + if (err) { + console.error(err) + reject() + return + } + console.log('=> replaceFile success') + resolve() + }) + }) + }) +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/build/config.js b/ohos/AdvancedAPI_OHOS/build/config.js new file mode 100644 index 0000000000..e9ed5cc025 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/build/config.js @@ -0,0 +1,68 @@ +const { uglify } = require('rollup-plugin-uglify') +const bable = require('rollup-plugin-babel') +const path = require('path') +const resolve = require('rollup-plugin-node-resolve') +const commonjs = require('rollup-plugin-commonjs') + +function getConfig ({ isWatch = false, minify = false, name }) { + let packageName = '' + switch (name) { + case 'advanced': + packageName = 'advanced-api' + break + default: + packageName = 'advanced-api' + } + const frameworkBanner = 'if(typeof(global)===\'undefined\'){var global = globalThis}' + const frameworkfooter = '' + const configs = { + 'advanced-api': { + input: absolute('./src/advancedApi/index.js'), + output: { + name: 'ADVANCEDAPI', + file: absolute('dist/advancedapi.js'), + format: 'es', + banner: frameworkBanner, + footer: frameworkfooter || '' + }, + plugins: [] + } + } + + const opt = configs[packageName] + const config = { + input: opt.input, + output: { + name: opt.output.name, + file: minify ? opt.output.file.replace(/\.js$/, '.min.js') : opt.output.file, + format: opt.output.format, + banner: opt.output.banner || '', + footer: opt.output.footer || '' + }, + plugins: [ + bable({ + exclude: 'node_modules/**' + }), + commonjs(), + resolve() + ].concat(opt.plugins || []) + } + + if (minify) { + config.plugins.push(uglify({ + output: { + beautify: name!=='advanced' + } + })) + } else { + config.output.sourcemap = 'inline' + } + return config +} + +// get the absolute path +function absolute (str) { + return path.resolve(__dirname, '..', str) +} + +module.exports = getConfig diff --git a/ohos/AdvancedAPI_OHOS/jsconfig.json b/ohos/AdvancedAPI_OHOS/jsconfig.json new file mode 100644 index 0000000000..a178f9dcd0 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/jsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "experimentalDecorators": true + } +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/package.json b/ohos/AdvancedAPI_OHOS/package.json new file mode 100644 index 0000000000..55587102c7 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/package.json @@ -0,0 +1,37 @@ +{ + "name": "qafapi", + "version": "1.0.0", + "description": "QAF API", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build:advanced": "node build/build.js advanced", + "dev:advanced": "node build/build.js advanced --watch", + "build:web": "node build/build.js web", + "dev": "node build/build.js native --watch", + "lint": "eslint src", + "format": "eslint src --ext .js --fix" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/core": "^7.14.6", + "@babel/plugin-proposal-decorators": "^7.10.5", + "@babel/preset-env": "^7.0.0", + "babel-eslint": "^10.0.3", + "eslint": "^6.6.0", + "eslint-plugin-flowtype": "^2.30.4", + "rollup": "^1.32.1", + "rollup-plugin-babel": "^4.4.0", + "rollup-plugin-buble": "^0.14.0", + "rollup-plugin-commonjs": "^10.1.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-typescript2": "^0.34.1", + "rollup-plugin-uglify": "^6.0.3", + "typescript": "^5.0.4" + }, + "dependencies": { + "js-base64": "^3.7.2", + "js-sha256": "^0.9.0", + "moment": "^2.29.3" + } +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/.gitignore b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/.gitignore new file mode 100644 index 0000000000..d2ff20141c --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/app.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/app.json5 new file mode 100644 index 0000000000..d6acae6366 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "com.example.advancedapihsp", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/resources/base/element/string.json b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/resources/base/element/string.json new file mode 100644 index 0000000000..3a0b2ef125 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "advancedApiHsp" + } + ] +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/resources/base/media/app_icon.png b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/.gitignore b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/.gitignore new file mode 100644 index 0000000000..e2713a2779 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/BuildProfile.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/BuildProfile.ets new file mode 100644 index 0000000000..3a501e5dde --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/BuildProfile.ets @@ -0,0 +1,17 @@ +/** + * Use these variables when you tailor your ArkTS code. They must be of the const type. + */ +export const HAR_VERSION = '1.0.0'; +export const BUILD_MODE_NAME = 'debug'; +export const DEBUG = true; +export const TARGET_NAME = 'default'; + +/** + * BuildProfile Class is used only for compatibility purposes. + */ +export default class BuildProfile { + static readonly HAR_VERSION = HAR_VERSION; + static readonly BUILD_MODE_NAME = BUILD_MODE_NAME; + static readonly DEBUG = DEBUG; + static readonly TARGET_NAME = TARGET_NAME; +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/Index.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/Index.ets new file mode 100644 index 0000000000..8b8666f85f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/Index.ets @@ -0,0 +1,2 @@ +import AdvancedAPI,{ as } from './src/main/ets/utils/advancedapi.min' +export { AdvancedAPI, as } \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/build-profile.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/build-profile.json5 new file mode 100644 index 0000000000..e6773f9f5d --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/build-profile.json5 @@ -0,0 +1,31 @@ +{ + "apiType": "stageMode", + "buildOption": { + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + }, + "consumerFiles": [ + "./consumer-rules.txt" + ] + } + }, + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest" + } + ] +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/consumer-rules.txt b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/consumer-rules.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/hvigorfile.ts b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/hvigorfile.ts new file mode 100644 index 0000000000..4218707148 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/hvigorfile.ts @@ -0,0 +1,6 @@ +import { harTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/obfuscation-rules.txt b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/obfuscation-rules.txt new file mode 100644 index 0000000000..272efb6ca3 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/oh-package.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/oh-package.json5 new file mode 100644 index 0000000000..e00b65c81b --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/oh-package.json5 @@ -0,0 +1,9 @@ +{ + "name": "advanced_api_har", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "Index.ets", + "author": "", + "license": "Apache-2.0", + "dependencies": {} +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/components/MainPage.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/components/MainPage.ets new file mode 100644 index 0000000000..8bc3e27cce --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/components/MainPage.ets @@ -0,0 +1,16 @@ +@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/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/utils/advancedapi.min.js b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/utils/advancedapi.min.js new file mode 100644 index 0000000000..2d410ec514 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/ets/utils/advancedapi.min.js @@ -0,0 +1,48 @@ +var global,_dec,_dec2,_dec3,_dec4,_dec5,_dec6,_dec7,_dec8,_dec9,_dec10,_dec11,_dec12,_dec13,_dec14,_class,_dec$1,_dec2$1,_class$1,_dec$2,_dec2$2,_dec3$1,_class$2;void 0===global&&(global=globalThis); +import abilityFeatureAbility from "@ohos.ability.featureAbility"; +import deviceInfo from "@ohos.deviceInfo"; +import display from "@ohos.display"; +import I18n from "@ohos.i18n"; +import abilityAccessCtrl from "@ohos.abilityAccessCtrl"; +import bluetooth from "@ohos.bluetooth"; +import geoLocationManager from "@ohos.geoLocationManager"; +import wifiManager from "@ohos.wifiManager"; +import window from "@ohos.window"; +import mapCommon from "@hms.core.map.mapCommon"; +import map from "@hms.core.map.map"; +import wantAgent from "@ohos.app.ability.wantAgent"; +import backgroundTaskManager from "@ohos.resourceschedule.backgroundTaskManager"; +import call from "@ohos.telephony.call"; +import http from "@ohos.net.http"; +import request$1 from "@ohos.request"; +import fs from "@ohos.file.fs"; +import photoAccessHelper from "@ohos.file.photoAccessHelper"; +import dataSharePredicates from "@ohos.data.dataSharePredicates"; +import bluetoothManager from "@ohos.bluetoothManager"; +import access from "@ohos.bluetooth.access"; +import ble from "@ohos.bluetooth.ble"; +import connection from "@ohos.bluetooth.connection"; +import promptAction from "@ohos.promptAction"; +import router from "@ohos.router"; +import wifi from "@ohos.wifi"; +import userIAM_userAuth from "@ohos.userIAM.userAuth"; +import prompt from "@ohos.prompt"; +import sensor from "@ohos.sensor"; +import contact from "@ohos.contact"; +import vibrator from "@ohos.vibrator"; +import inputMethod from "@ohos.inputMethod"; +import fileuri from "@ohos.file.fileuri"; +import wantConstant from "@ohos.ability.wantConstant"; +import bundleManager from "@ohos.bundle.bundleManager"; +import image from "@ohos.multimedia.image"; +import picker from "@ohos.file.picker"; +import media from "@ohos.multimedia.media"; +import audio from "@ohos.multimedia.audio"; +import avSession from "@ohos.multimedia.avsession"; +import cryptoFramework from "@ohos.security.cryptoFramework"; +import buffer from "@ohos.buffer"; +import util from "@ohos.util"; +import settings from "@ohos.settings"; +import scanCore from "@hms.core.scan.scanCore"; +import scanBarcode from "@hms.core.scan.scanBarcode"; +function _applyDecoratedDescriptor(o,a,e,t,r){var s={};return Object.keys(t).forEach(function(e){s[e]=t[e]}),s.enumerable=!!s.enumerable,s.configurable=!!s.configurable,("value"in s||s.initializer)&&(s.writable=!0),s=e.slice().reverse().reduce(function(e,t){return t(o,a,e)||e},s),r&&void 0!==s.initializer&&(s.value=s.initializer?s.initializer.call(r):void 0,s.initializer=void 0),void 0===s.initializer?(Object.defineProperty(o,a,s),null):s}function _defineProperty(e,t,o){return(t=_toPropertyKey(t))in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function _toPrimitive(e,t){if("object"!=typeof e||!e)return e;var o=e[Symbol.toPrimitive];if(void 0===o)return("string"===t?String:Number)(e);if("object"!=typeof(o=o.call(e,t||"default")))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}function _toPropertyKey(e){return"symbol"==typeof(e=_toPrimitive(e,"string"))?e:e+""}let context=abilityFeatureAbility.getContext();function initContextOnStageModel(e){(context=e).startAbilityForResult||(context.startAbilityForResult=context.startAbility),context.getAbilityInfo=function(){return new Promise((e,t)=>{try{e(this.abilityInfo)}catch(e){t(e)}})},context.getFilesDir=function(){return new Promise((e,t)=>{try{e(this.filesDir)}catch(e){t(e)}})},context.getCacheDir=function(){return new Promise((e,t)=>{try{e(this.cacheDir)}catch(e){t(e)}})}}class AbilityBase{static getAbilityInfo(){return new Promise((t,o)=>{this.hasAbilityInfo?t(this.abilityInfo):context.getAbilityInfo().then(e=>{this.hasAbilityInfo=!0,this.abilityInfo=e,console.log("[QAFAPI] getAbilityInfo successful. "),t(e)}).catch(e=>{console.error("[QAFAPI] getAbilityInfo failed. Cause: "+JSON.stringify(e)),o(e)})})}}_defineProperty(AbilityBase,"abilityInfo",{}),_defineProperty(AbilityBase,"hasAbilityInfo",!1);class DeivceBase{static getDeviceInfo(){return deviceInfo}}class DisplayBase{static ohosGetDisplay(){let e=null;try{e=display.getDefaultDisplaySync()}catch(e){console.error("[QAFAPI] display error message: "+JSON.stringify(e))}return e}}class ASDevice{getSystemInfoSync(){var{brand:e,productModel:t,osFullName:o,deviceType:a,udid:r,sdkApiVersion:s}=DeivceBase.getDeviceInfo(),i=o.split("-")[0],n=i,c=o.split("-")[1],l=c,d=I18n.System.getSystemLanguage(),{rotation:h,densityPixels:u}=p=DisplayBase.ohosGetDisplay(),{width:p,height:f}=p,p=Math.round(p/u),f=Math.round(f/u),h=1===h||3===h?"landscape":"portrait",{signatureInfo:A,versionName:g,versionCode:m,appInfo:y}=globalThis.bundleInfoForSelf,y=context.resourceManager.getStringSync(y.labelId),A=A.appId,S=context.config.language,{width:v,height:C,top:P}=null==(v=globalThis.lastWindow.getWindowProperties())?void 0:v.windowRect,{isFullScreen:E,isLayoutFullScreen:b}=globalThis.lastWindow.getWindowProperties(),I=globalThis.lastWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM),I=Math.round(((null==I||null==(I=I.topRect)?void 0:I.height)||0)/u),E=E||b?Math.round(C/u):Math.round((C+I)/u),P=Math.round(P/u),b={deviceType:a,deviceBrand:e,brand:e,deviceModel:t,platform:n,model:t,deviceOrientation:h,devicePixelRatio:u,pixelRatio:u,system:o,osName:n,osVersion:l,version:l,osLanguage:d,language:d,ohosAPILevel:s,romName:i,romVersion:c,appId:A,appName:y,appVersion:g,appVersionCode:m,appLanguage:S,screenWidth:p,screenHeight:f,windowWidth:Math.round(v/u),windowHeight:Math.round(C/u),windowTop:P,windowBottom:E,statusBarHeight:I};return r&&(b.deviceId=r),b}getDeviceInfo(){console.debug("[AdvancedAPI] start ASDevice getDeviceInfo");var{brand:e,productModel:t,osFullName:o,deviceType:a,osFullName:r,udid:s}=DeivceBase.getDeviceInfo(),i=e,n=t,r=r.split("-")[0],{densityPixels:c,rotation:l}=DisplayBase.ohosGetDisplay(),r={platform:r,deviceBrand:i,deviceModel:t,deviceType:a,deviceOrientation:1===l||3===l?"landscape":"portrait",devicePixelRatio:c,system:o,brand:e,model:n};return s&&(r.deviceId=s),r}getWindowInfo(){console.debug("[AdvancedAPI] start ASDevice getWindowInfo");var e=(t=DisplayBase.ohosGetDisplay()).densityPixels,{width:t,height:o}=t,{width:a,height:r,top:s}=null==(a=globalThis.lastWindow.getWindowProperties())?void 0:a.windowRect,{isFullScreen:i,isLayoutFullScreen:n}=globalThis.lastWindow.getWindowProperties(),c=globalThis.lastWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM),c=Math.round(((null==c||null==(c=c.topRect)?void 0:c.height)||0)/e),i=i||n?Math.round(r/e):Math.round((r+c)/e),s=Math.round(s/e),a=Math.round(a/e),r=Math.round(r/e);return{pixelRatio:e,screenWidth:Math.round(t/e),screenHeight:Math.round(o/e),windowWidth:a,windowHeight:r,windowTop:s,windowBottom:i,statusBarHeight:c}}getAppBaseInfo(){console.debug("[AdvancedAPI] start ASDevice getAppBaseInfo");var{signatureInfo:e,versionName:t,versionCode:o,appInfo:a}=globalThis.bundleInfoForSelf,r=a.debug,a=context.resourceManager.getStringSync(a.labelId),e=e.appId,s=context.config.language,i=(Environment.envProp("colorMode",-1),AppStorage.get("colorMode"));return{appId:e,appName:a,appVersion:t,appVersionCode:o,appLanguage:s,enableDebug:r,theme:0===i?"light":1===i?"dark":"auto"}}getAppAuthorizeSetting(){console.debug("[AdvancedAPI] start ASDevice getAppAuthorizeSetting");var e=abilityAccessCtrl.createAtManager(),t=globalThis.bundleInfoForSelf.appInfo.accessTokenId,o=e=>-1===e?"denied":0===e?"authorized":"config error";let a="not determined";try{a=o(a=e.checkAccessTokenSync(t,"ohos.permission.WRITE_IMAGEVIDEO"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken album fail")}let r="not determined";try{r=o(r=e.checkAccessTokenSync(t,"ohos.permission.USE_BLUETOOTH"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken bluetooth fail")}let s="not determined";try{s=o(s=e.checkAccessTokenSync(t,"ohos.permission.CAMERA"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken camera fail")}let i="not determined";try{i=o(i=e.checkAccessTokenSync(t,"ohos.permission.LOCATION"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken location fail")}let n="not determined";try{n=0===e.checkAccessTokenSync(t,"ohos.permission.APPROXIMATELY_LOCATION")?"full":"reduced"}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken locationAccuracy fail")}let c="not determined";try{c=o(c=e.checkAccessTokenSync(t,"ohos.permission.MICROPHONE"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken microphone fail")}let l="not determined";try{l=o(l=e.checkAccessTokenSync(t,"ohos.permission.NOTIFICATION_CONTROLLER"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken notification fail")}let d="not determined";try{d=o(d=e.checkAccessTokenSync(t,"ohos.permission.READ_CALENDAR"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken phoneCalendar fail")}return{albumAuthorized:a,bluetoothAuthorized:r,cameraAuthorized:s,locationAuthorized:i,locationAccuracy:n,microphoneAuthorized:c,notificationAuthorized:l,phoneCalendarAuthorized:d}}getSystemSetting(){let e,t,o,a,r;try{e=!(2!==(e=bluetooth.getState())&&5!==e)}catch(e){console.error("errCode:"+e.code+",errMessage:"+e.message),a=e.message}try{t=geoLocationManager.isLocationEnabled()}catch(e){console.error("errCode:"+e.code+",errMessage:"+e.message),r=e.message}try{o=wifiManager.isWifiActive()}catch(e){console.error("errCode:"+e.code+",errMessage:"+e.message)}var s=DisplayBase.ohosGetDisplay().rotation;return{bluetoothEnabled:e,bluetoothError:a,locationEnabled:t,locationError:r,wifiEnabled:o,deviceOrientation:1===s||3===s?"landscape":"portrait"}}openAppAuthorizeSetting(){var e={bundleName:"com.huawei.hmos.settings",abilityName:"com.huawei.hmos.settings.MainAbility",uri:"application_info_entry",parameters:{pushParams:context.applicationInfo.name}};return context.startAbilityForResult(e)}}let ErrorCode$1={SHARE_INSTALLED_ERROR:-1001,SUCCESS:0,COMMON_ERROR:200,USER_REJECT:201,PARAMETER_ERROR:202,SERVICE_UNAVIALABLE:203,SERVICE_TIMEOUT:204,NOT_SUPPORT_SERVICE_COUNTRY:205,NOT_IN_WHITE_LIST:206,SYSTEM_PERMISSION_DENIAL:207,IO_ERROR:300,FILE_NOT_FOUND:301,FILE_EXIST:302,FILE_EXTENSION_NOT_EXIST:303,FILE_PATH_NOT_LEGAL:304,WEB_PAGE_NOT_FOUND:404,QUICKAPP_IN_BACKGROUND:500,LOCATION_SWITCH_CLOSED:1e3,PAY_CHECKKEY_FAIL:1001,SIM_NOT_FOUND:1001,SIGNIN_AUTH_FAIL:1002,OPERATORS_GET_FAIL:1002,ALARM_SYSTEM_ERROR:1003,AGD_COMMON_ERROR:2001,WIDGET_NOT_SUPPORT:2001,CARD_CALL_QUICK_APP_CENTER_FAIL:2003,BI_REPORT_ERROR:4001,PAY_CANCEL_CODE:3e4,PAY_CERTIFICATION_CODE:30102},BLHErrorCode={OK:0,OTHER_ERRORS:200,NOT_INIT:1e4,NOT_AVAILABLE:10001,NO_DEVICE:10002,CONNECTION_FAIL:10003,NO_SERVICE:10004,NO_CHARACTERISTIC:10005,NO_CONNECTION:10006,PROPERTY_NOT_SUPPORT:10007,SYSTEM_ERROR:10008,SYSTEM_NOT_SUPPORT:10009,LOCATION_NOT_TURN_ON:10010,NO_SUCH_INTERFACE:10100,DEVICE_DOES_NOT_EXIST:10101,NOT_AVAILABLE_TIRAMISU:10102},WifiErrorCode={PASSWORD_ERROR:1e3,CONNECTION_TIMEOUT:1001,DUPLICATE_REQUEST:1002,WIFI_NOT_TURNED_ON:1003,GPS_NOT_TURNED_ON:1004,INVALID_SSID:1005};function dataToArray(e){return Array.isArray(e)?e:[e]}class Result{static success(e,t=!1,o=!1){return{method:"success",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static fail(e,t=!1,o=!1){return{method:"fail",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static cancel(e,t=!1,o=!1){return{method:"cancel",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static callback(e,t=!1,o=!1){return{method:"callback",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static destroy(e,t=!1,o=!1){return{method:"destroy",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}}class ASLocation{constructor(){this.locationChangeCallbacks=[],this.locationChangeErrorCallback=(e,t)=>{},this.bothCallback=(t,e)=>{if(e)this.locationChangeErrorCallback({errMsg:e[2].arguments[0],errCode:e[2].arguments[1]});else for(let e=0;e{var o=t.authResults,a=t.dialogShownResults,r=o.length;for(let e=0;e{var e;return console.debug("[AdvancedAPI] current location: %s",JSON.stringify(t)),"gcj02"===(null==s?void 0:s.type)?(e={latitude:t.latitude,longitude:t.longitude},map.convertCoordinate(mapCommon.CoordinateType.WGS84,mapCommon.CoordinateType.GCJ02,e).then(e=>(t.latitude=e.latitude,t.longitude=e.longitude,Promise.resolve(t))).catch(e=>(console.debug("[AdvancedAPI] promise, convertCoordinate: error= %s",JSON.stringify(e)),Promise.reject([[e.message,ErrorCode$1.SERVICE_UNAVIALABLE]])))):Promise.resolve(t)}).catch(e=>(console.debug("[AdvancedAPI] promise, getCurrentLocation: error= %s",JSON.stringify(e)),Promise.reject([[e.message,ErrorCode$1.SERVICE_UNAVIALABLE]])))}catch(e){return console.error("[AdvancedAPI] errCode:"+e.code+",errMessage:"+e.message),Promise.reject([[e.message,ErrorCode$1.SERVICE_UNAVIALABLE]])}})}onLocationChange(e){console.debug("[AdvancedAPI] start ASLocation onLocationChange"),this.locationChangeCallbacks.push(e)}offLocationChange(e){console.debug("[AdvancedAPI] start ASLocation offLocationChange"),e?0<=(e=this.locationChangeCallbacks.indexOf(e))&&this.locationChangeCallbacks.splice(e,1):this.locationChangeCallbacks=[]}onLocationChangeError(e){console.debug("[AdvancedAPI] start ASLocation onLocationChangeError"),this.locationChangeErrorCallback=e}offLocationChangeError(){console.debug("[AdvancedAPI] start ASLocation offLocationChangeError"),this.locationChangeErrorCallback=(e,t)=>{}}startLocationUpdate(){console.debug("[AdvancedAPI] start ASLocation startLocationUpdate");var e=abilityAccessCtrl.createAtManager();try{return e.requestPermissionsFromUser(context,["ohos.permission.APPROXIMATELY_LOCATION","ohos.permission.LOCATION"]).then(t=>{var o=t.authResults,a=o.length;for(let e=0;e{var o=t.authResults,a=o.length;for(let e=0;e{e={wants:[{bundleName:e.bundleName,abilityName:e.name}],operationType:wantAgent.OperationType.START_ABILITY,requestCode:0,wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]},wantAgent.getWantAgent(e).then(e=>backgroundTaskManager.startBackgroundRunning(context,backgroundTaskManager.BackgroundMode.LOCATION,e)).then(()=>{console.debug("[AdvancedAPI] start bg operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] start bg operation failed Cause: "+e)})});try{return geoLocationManager.on("locationChange",{priority:515,scenario:768,timeInterval:0,distanceInterval:0,maxAccuracy:0},this.bothCallback),Promise.resolve("SUCCESS")}catch(e){return Promise.reject([[e.message,e.code]])}})}catch(e){return Promise.reject([["startLocationUpdateBackground failed",ErrorCode$1.COMMON_ERROR]])}}stopLocationUpdate(e){console.debug("[AdvancedAPI] start ASLocation stopLocationUpdate"),backgroundTaskManager.stopBackgroundRunning(context).then(()=>{console.debug("[AdvancedAPI] stop operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] stop operation fail cause: "+JSON.stringify(e))});try{return geoLocationManager.off("locationChange"),Promise.resolve("SUCCESS")}catch(e){return Promise.reject([["stopLocationUpdate failed",ErrorCode$1.COMMON_ERROR]])}}}class ASPhone{makePhoneCall(e){return e&&e.phoneNumber&&"string"==typeof e.phoneNumber&&""!==e?call.makeCall(e.phoneNumber):new Promise((e,t)=>{t(["param is invalid.",ErrorCode$1.PARAMETER_ERROR])})}}function isMac(e){return/^[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}$/.test(e)}function isUuid(e){return/^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$/.test(e)}function isLower(e){return e===e.toLowerCase()}function isNumber(e){return"number"==typeof e&&!Number.isNaN(e)&&Number.isFinite(e)}function isString(e){return"string"==typeof e}function isBoolean(e){return"boolean"==typeof e}function isFunction(e){return"function"==typeof e}function isArrayBuffer(e){return"[object ArrayBuffer]"===Object.prototype.toString.call(e)}function isNull(e){return null===e}function isUndefined(e){return void 0===e}function isArray(e){return Array.isArray(e)}function isHexcolor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)||/^#[0-9a-fA-F]{3}$/i.test(e)}function checkDataType(t,e,o,a){let r=!1;try{if(e&&(isNull(t)||isUndefined(t)))throw new Error("The param data is required");if(!isString(o)&&!isArray(o))throw new Error("The param dataType should be a String or an Array");if(!isNull(a)&&!isUndefined(a)&&!isFunction(a))throw new Error("If customCheck exist,it should be a Function");if(!e&&(isNull(t)||isUndefined(t)))return!0;isString(o)?r=checkSingleDataType(t,o):isArray(o)&&(r=o.some(e=>checkSingleDataType(t,e))),r&&isFunction(a)&&(r=a(t))}catch(e){return console.log(e),!1}return r}function checkSingleDataType(e,t){let o=!1;switch(t){case"string":o=isString(e);break;case"number":o=isNumber(e);break;case"boolean":o=isBoolean(e);break;case"function":o=isFunction(e);break;case"arraybuffer":o=isArrayBuffer(e);break;case"array":o=isArray(e);break;case"hexcolor":o=isHexcolor(e);break;case"null":o=isNull(e);break;case"undefined":o=isUndefined(e);break;default:throw new Error("The param dataType is unsupport")}return o}class MediaLibraryBase{static getPermissions(){try{let e=["ohos.permission.SHORT_TERM_WRITE_IMAGEVIDEO"],t=abilityAccessCtrl.createAtManager();return new Promise(o=>{t.requestPermissionsFromUser(context,e).then(e=>{var t=e.authResults[0],e=e.dialogShownResults[0];o({perNum:t,dialogShownResults:e})})})}catch(e){console.error("[AdvancedAPI] getPermissions is fail!",JSON.stringify(e))}}static getMediaType(e){return photoAccessHelper.PhotoType[e]}static getFileKey(){return photoAccessHelper.PhotoKeys}static getMedia(){return photoAccessHelper.getPhotoAccessHelper(context)}static async createAsset(e,t,o){var a=o.split(".").pop().toString(),o=o.split(".").shift().toString();return e.createAsset(t,a,{title:o})}static closeAsset(e,o){return new Promise(t=>{e.close(o,e=>{t(void 0===e)})})}static getFd(e){return new Promise(t=>{e.open("rw").then(e=>{t(e)}).catch(()=>{t(!1)})})}}function switchInternalToHapSandBox(e){return e.startsWith("internal://bundle/")?e.replace("internal://bundle",context.bundleCodeDir):e.startsWith("internal://cache/")?e.replace("internal://cache",context.cacheDir):e.startsWith("internal://files/")?e.replace("internal://files",context.filesDir):e.startsWith("internal://preferences/")?e.replace("internal://preferences",context.preferencesDir):e.startsWith("internal://temp/")?e.replace("internal://temp",context.tempDir):e.startsWith("internal://database/")?e.replace("internal://database",context.databaseDir):e.startsWith("internal://distributedFiles/")?e.replace("internal://distributedFiles",context.distributedFilesDir):e}function switchHapSandBoxToInternal(e){return e.startsWith(context.bundleCodeDir)?e.replace(context.bundleCodeDir,"internal://bundle"):e.startsWith(context.cacheDir)?e.replace(context.cacheDir,"internal://cache"):e.startsWith(context.filesDir)?e.replace(context.filesDir,"internal://files"):e.startsWith(context.preferencesDir)?e.replace(context.preferencesDir,"internal://preferences"):e.startsWith(context.tempDir)?e.replace(context.tempDir,"internal://temp"):e.startsWith(context.databaseDir)?e.replace(context.databaseDir,"internal://database"):e.startsWith(context.distributedFilesDir)?e.replace(context.distributedFilesDir,"internal://distributedFiles"):e}function isFileUri(e){return e&&"string"==typeof e&&(e.startsWith("file://")||e.startsWith("datashare://"))}function isSandboxPath(e){return e&&"string"==typeof e&&(e.startsWith("/data/storage/")||e.startsWith("internal://"))}function getFdFromUriOrSandBoxPath(t){try{return fs.openSync(t,fs.OpenMode.READ_ONLY).fd}catch(e){console.info(`[AdvancedAPI] Can not get file from uri: ${t} `)}throw new Error("file is not exist")}async function getFileAssetFromUri(e){try{-1===(await MediaLibraryBase.getPermissions()).perNum&&console.debug("[AdvancedAPI] permission fail");var t=photoAccessHelper.getPhotoAccessHelper(context),o=new dataSharePredicates.DataSharePredicates,a=(console.debug(`[AdvancedAPI] getFileAssetFromUri uri: ${e} `),o.equalTo(photoAccessHelper.PhotoKeys.URI,e.toString()),{fetchColumns:[photoAccessHelper.PhotoKeys.URI,photoAccessHelper.PhotoKeys.PHOTO_TYPE,photoAccessHelper.PhotoKeys.SIZE,photoAccessHelper.PhotoKeys.DURATION,photoAccessHelper.PhotoKeys.WIDTH,photoAccessHelper.PhotoKeys.HEIGHT,photoAccessHelper.PhotoKeys.TITLE,photoAccessHelper.PhotoKeys.ORIENTATION],predicates:o}),r=await t.getAssets(a),s=(console.debug(`[AdvancedAPI] getFileAssetFromUri fetchResult: ${JSON.stringify(r)} `),await r.getFirstObject());return console.debug(`[AdvancedAPI] getFileAssetFromUri asset: ${JSON.stringify(s)} `),r.close(),s}catch(e){console.debug("[AdvancedAPI] getAsset is fail!,"+e)}}function pathToCache(e){try{var t=switchInternalToHapSandBox(e),o=t.slice(t.lastIndexOf("/")),a=context.cacheDir+o;return fs.copyFile(t,a,e=>{e&&console.info("[AdvancedAPI] Failed to copy: "+JSON.stringify(e))}),switchHapSandBoxToInternal(a)}catch(e){console.error("[AdvancedAPI] to copy: "+JSON.stringify(e))}}async function saveMedia(e,t,o,a){try{var r=photoAccessHelper.getPhotoAccessHelper(context),s=t.split(".").pop().toString(),i=[{title:t.split(".").shift().toString().toString(),fileNameExtension:s.toString(),photoType:e}],n=[o.toString()],c=(await r.showAssetsCreationDialog(n,i))[0],l=fs.openSync(c,fs.OpenMode.READ_WRITE);return await fs.write(l.fd,a),fs.closeSync(l),c}catch(e){console.error("[AdvancedAPI] saveMedia is fail!: "+JSON.stringify(e))}}function arrayBufferToBase64(e){return requireAPI("ASBuffer").arrayBufferToBase64(e)}let errMsgMap=new Map([[401,"Parameter error"],[201,"Permission denied"],[2300003,"URL using bad/illegal format or missing URL"],[2300006,"Could not resolve host name"],[2300007,"Couldn not connect to server"],[2300009,"Access denied to remote resource"],[2300023,"Failed writing received data to disk/application"],[2300025,"Upload failed"],[2300026,"Failed to open/read local data from file/application"],[2300028,"Timeout was reached"],[2300073,"Remote file already exists"],[2300078,"Remote file not found"],[2300999,"Unknown Other Error"]]);class ASRequest{request(e){return console.debug("[AdvancedAPI] ASRequest request"),new RequestTask(e)}uploadFile(e){return console.debug("[AdvancedAPI] ASRequest uploadFile : %s",JSON.stringify(e)),new UploadTask(e)}downloadFile(e){return console.debug("[AdvancedAPI] ASRequest downloadFile %s",JSON.stringify(e)),new DownloadTask(e)}}class RequestTask{constructor(s){let{url:i,header:a,method:n="GET",timeout:c,responseType:l,enableCache:d}=s||{},h=(s||{}).data,{success:u,fail:p,complete:f}=s||{};if(this.abortFlag=!1,this.fail=p,this.complete=f,this.httpRequest=http.createHttp(),this.headersCallback=new Map,s){let e=!1;for(var A in a)if("content-type"===A.toLowerCase()){a[A].toLowerCase().includes("application/x-www-form-urlencoded")&&(e=!0);break}if(h&&(e||["GET","OPTIONS","DELETE","TRACE","CONNECT"].includes(n))){var g,m=[];for(g in h)m.push(encodeURIComponent(g)+"="+encodeURIComponent(h[g]));h=m.join("&")}if(a)for(var y in a)a[y]=""+a[y];let t={method:n,extraData:h||{},header:a,expectDataType:l&&"arraybuffer"===l?http.HttpDataType.ARRAY_BUFFER:http.HttpDataType.STRING,usingCache:d||!1},o=!1,r=setTimeout(()=>{var e;console.error("[AdvancedAPI] request error: Timeout was reached"),o=!0,p&&!this.abortFlag&&(this.result=e={errMsg:"Timeout was reached"},p(e)),f&&!this.abortFlag&&f(this.result),this.httpRequest&&(this.httpRequest.destroy(),this.httpRequest=void 0)},c||6e4);this.httpRequest.request("string"==typeof i?i:"",t).then(a=>{if(clearTimeout(r),console.debug("[AdvancedAPI] request url %s success",i),u&&!this.abortFlag){let e=a.result,t=!1,o=(s||{}).responseType;if(o&&"json"!==o)"[object ArrayBuffer]"===Object.prototype.toString.call(e)&&(e=arrayBufferToBase64(e),t=!0);else if("string"==typeof a.result)try{e=JSON.parse(e)}catch(e){}o={isArrayBuffer:!1,data:e,statusCode:a.responseCode,header:a.header,cookies:"string"==typeof a.cookies?a.cookies?[a.cookies]:[]:a.cookies,errMsg:"request:ok"},t&&(o.isArrayBuffer=!0),this.result=o,u(o)}}).catch(e=>{clearTimeout(r),o||(console.error("[AdvancedAPI] request error: "+JSON.stringify(e)),p&&!this.abortFlag&&(e={errMsg:errMsgMap.has(e.code)?errMsgMap.get(e.code):"Unknown Error"},this.result=e,p(e)))}).finally(()=>{o||(f&&!this.abortFlag&&f(this.result),this.httpRequest&&(this.httpRequest.destroy(),this.httpRequest=void 0))})}else console.error("[AdvancedAPI] request error: params illegal")}abort(){console.debug("[AdvancedAPI] request abort"),this.abortFlag=!0,this.httpRequest&&(this.httpRequest.destroy(),this.httpRequest=void 0,this.res={errMsg:"request:fail abort"},this.fail&&this.fail(this.res),this.complete)&&this.complete(this.res)}onHeadersReceived(t){var e=e=>{this.abortFlag||t({header:e})};t?this.headersCallback.has(t)||(this.headersCallback.set(t,e),this.httpRequest&&this.httpRequest.on("headersReceive",e)):console.error("[AdvancedAPI] Invalid, callback is null")}offHeadersReceived(e){e?this.headersCallback.has(e)?(this.httpRequest&&this.httpRequest.off("headersReceive",this.headersCallback.get(e)),this.headersCallback.delete(e)):console.debug("[AdvancedAPI] offHeadersReceived callback invalid"):(this.headersCallback.clear(),this.httpRequest&&this.httpRequest.off("headersReceive"))}}class UploadTask{constructor(e){var{url:t,files:o,filePath:a,name:r,header:s,formData:i}=e||{};let{success:n,fail:c,complete:l}=e||{},d=(e=a.startsWith("internal://cache/")?a:pathToCache(a),this.progressCallback=new Map,this.headersCallback=new Map,[]);o?o.forEach(function(e){var t,o;"string"==typeof e.uri&&(t=e.uri.substring(e.uri.lastIndexOf("/")+1),o=e.uri.substring(e.uri.lastIndexOf(".")+1),d.push({filename:t,name:e.name,uri:e.uri,type:o}))}):"string"==typeof e&&(a=e.substring(e.lastIndexOf("/")+1),o=e.substring(e.lastIndexOf(".")+1),d.push({filename:a,name:r,uri:e,type:o}));var h,u,p=[];for([h,u]of Object.entries(i||{}))p.push({name:h,value:"string"==typeof u?u:JSON.stringify(u)});a={url:t,header:s||{},method:"POST",files:d,data:p},this.successHandle=e=>{n&&n(e),l&&l(e)},this.failHandle=e=>{c&&c(e),l&&l(e)};try{console.debug("[AdvancedAPI] request upload"),request$1.uploadFile(globalThis.abilityContext,a).then(e=>{if(this.uploadTask=e,this.abortFlag&&(this.abortFlag=!1,this.uploadTask.delete(()=>{this.res={errMsg:"uploadFile:fail abort"},this.failHandle(this.res)})),this.progressFlag){this.progressFlag=!1;for(var t of this.progressCallback.values())this.uploadTask.on("progress",t)}if(this.headersFlag){this.headersFlag=!1;for(var o of this.headersCallback.values())this.uploadTask.on("headerReceive",o)}this.uploadTask.on("headerReceive",this.headersReceivedHandle.bind(this)),this.uploadTask.on("complete",()=>{var e;console.debug("[AdvancedAPI] upload success"),this.res={data:(null==(e=this.receivedData)?void 0:e.body)||{},header:(null==(e=this.receivedData)?void 0:e.headers)||{},cookies:[],statusCode:200,errMsg:"uploadFile:ok"},this.successHandle(this.res)}),this.uploadTask.on("fail",()=>{console.debug("[AdvancedAPI] upload fail"),this.res={errMsg:"uploadFile:fail"},this.failHandle(this.res)})}).catch(e=>{console.error("[AdvancedAPI] upload request error: "+e.message),this.res={errMsg:"uploadFile:fail "+e.message},this.failHandle(this.res)})}catch(e){console.error("[AdvancedAPI] upload request err.code : "+e.code+", err.message : "+e.message),this.res={errMsg:"uploaddFile:fail "+e.message},this.failHandle(this.res)}}abort(){this.res={errMsg:"uploadFile:fail abort"},this.uploadTask?this.uploadTask.delete(()=>{this.failHandle(this.res)}):this.abortFlag=!0}onProgressUpdate(o){function e(e,t){o({progress:Math.ceil(100*e/t),totalBytesSent:e,totalBytesExpectedToSend:t})}o?this.progressCallback.has(o)||(this.progressCallback.set(o,e),this.uploadTask?this.uploadTask.on("progress",e):this.progressFlag=!0):console.error("[AdvancedAPI] Invalid, callback is null")}offProgressUpdate(e){e?this.progressCallback.has(e)?(this.uploadTask&&this.uploadTask.off("progress",this.progressCallback.get(e)),this.progressCallback.delete(e)):console.debug("[AdvancedAPI] offProgressUpdate callback invalid"):(this.progressCallback.clear(),this.uploadTask&&this.uploadTask.off("progress"))}headersReceivedHandle(e){this.receivedData=e}onHeadersReceived(t){var e=e=>{this.abortFlag||t({header:e.headers||{}})};t?this.headersCallback.has(t)||(this.headersCallback.set(t,e),this.uploadTask?this.uploadTask.on("headerReceive",e):this.headersFlag=!0):console.error("[AdvancedAPI] Invalid, callback is null")}offHeadersReceived(e){e?this.headersCallback.has(e)?(this.uploadTask&&this.uploadTask.off("headerReceive",this.headersCallback.get(e)),this.headersCallback.delete(e)):console.debug("[AdvancedAPI] offHeadersReceived callback invalid"):(this.headersCallback.clear(),this.uploadTask&&(this.uploadTask.off("headerReceive"),this.uploadTask.on("headerReceive",this.headersReceivedHandle.bind(this))))}}class DownloadTask{constructor(e){let{url:t,header:o,filePath:a}=e||{},{success:r,fail:s,complete:i}=e||{},n=(this.progressCallback=new Map,"string"==typeof t&&(e=(new Date).getTime(),this.filename="Download_"+e+"_"+t.substring(t.lastIndexOf("/")+1).replace(/[^a-zA-Z0-9.]/,"").slice(-16)),a||"internal://cache/"+this.filename);e=switchInternalToHapSandBox(n),e={url:this.isEncodeUri(t)?t:encodeURI(t),header:o||{},filePath:e},this.successHandle=e=>{r&&r(e),i&&i(e)},this.failHandle=e=>{s&&s(e),i&&i(e)};try{console.debug("[AdvancedAPI] request download"),request$1.downloadFile(globalThis.abilityContext,e).then(e=>{if(this.downloadTask=e,this.abortFlag&&(this.abortFlag=!1,this.downloadTask.delete(()=>{console.debug("[AdvancedAPI] download fail"),this.res={errMsg:"downloadFile:fail abort"},this.failHandle(this.res)})),this.progressFlag){this.progressFlag=!1;for(var t of this.progressCallback.values())this.downloadTask.on("progress",t)}this.downloadTask.on("complete",()=>{console.debug("[AdvancedAPI] download success"),this.res={tempFilePath:n,statusCode:200,errMsg:"downloadFile:ok"},a&&Object.assign(this.res,{filePath:a}),this.downloadTask.getTaskInfo().then(e=>{console.debug("[AdvancedAPI] download info: %s",JSON.stringify(e)),e.downloadTotalBytes&&Object.assign(this.res,{dataLength:e.downloadTotalBytes})}).catch(e=>{console.error("[AdvancedAPI] download request get task info error: "+e.message)}).finally(()=>{this.successHandle(this.res)})}),this.downloadTask.on("fail",()=>{console.debug("[AdvancedAPI] download fail"),this.res={errMsg:"downloadFile:fail"},this.failHandle(this.res)})}).catch(e=>{console.error("[AdvancedAPI] download request error: "+e.message),this.res={errMsg:"downloadFile:fail "+e.message},this.failHandle(this.res)})}catch(e){console.error("[AdvancedAPI] download request err.code : "+e.code+", err.message : "+e.message),this.res={errMsg:"downloadFile:fail "+e.message},this.failHandle(this.res)}}abort(){this.downloadTask?this.downloadTask.delete(()=>{console.debug("[AdvancedAPI] download fail"),this.res={errMsg:"downloadFile:fail abort"},this.failHandle(this.res)}):this.abortFlag=!0}onProgressUpdate(o){function e(e,t){o({progress:Math.ceil(100*e/t),totalBytesWritten:e,totalBytesExpectedToWrite:t})}o?this.progressCallback.has(o)||(this.progressCallback.set(o,e),this.downloadTask?this.downloadTask.on("progress",e):this.progressFlag=!0):console.error("[AdvancedAPI] Invalid, callback is null")}offProgressUpdate(e){e?this.progressCallback.has(e)?this.downloadTask&&(this.downloadTask.off("progress",this.progressCallback.get(e)),this.progressCallback.delete(e)):console.debug("[AdvancedAPI] offProgressUpdate callback invalid"):(this.progressCallback.clear(),this.downloadTask&&this.downloadTask.off("progress"))}onHeadersReceived(e){console.debug("[AdvancedAPI] onHeadersReceived not support")}offHeadersReceived(e){console.debug("[AdvancedAPI] offHeadersReceived not support")}isEncodeUri(e){return!e||/^[a-zA-Z0-9-_.!~*'();/?:@&=+$,#]+$/.test(e)}}let SCAN_MODE={LIMITED:5,DURATION:0};class BluetoothBase{static getPermissions(){let t=["ohos.permission.ACCESS_BLUETOOTH"],o=abilityAccessCtrl.createAtManager();return new Promise(async e=>{0===(await o.requestPermissionsFromUser(context,t)).authResults[0]?e(!0):e(!1)})}static onStateChange(e){try{return access.on("stateChange",e)}catch(e){console.warn("[AdvancedAPI] on bondStateChange fail")}}static on(e){try{return connection.on("bluetoothDeviceFind",e)}catch(e){console.warn("[AdvancedAPI] on fail")}}static onBLE(e){try{ble.on("BLEDeviceFind",e)}catch(e){console.warn("[AdvancedAPI] BLE.on.BLEDeviceFind fail")}}static createGattClientDevice(e){try{return ble.createGattClientDevice(e)}catch(e){console.warn("[AdvancedAPI] createGattClientDevice fail")}}static enableBluetooth(){try{return access.enableBluetooth()}catch(e){console.warn("[AdvancedAPI] enableBluetooth fail")}}static disableBluetooth(){try{return access.disableBluetooth()}catch(e){console.warn("[AdvancedAPI] disableBluetooth fail")}}static bluetoothState(){try{return access.getState()}catch(e){console.error("[AdvancedAPI] getState fail, errCode: "+e.code+", errMessage: "+e.message)}}static startBluetoothDiscovery(){connection.setBluetoothScanMode(connection.ScanMode.SCAN_MODE_LIMITED_DISCOVERABLE,SCAN_MODE.DURATION);try{return connection.startBluetoothDiscovery()}catch(e){console.warn("[AdvancedAPI] startBluetoothDiscovery fail")}}static off(){try{return connection.off("bluetoothDeviceFind")}catch(e){console.warn("[AdvancedAPI] off fail")}}static getRemoteDeviceName(e){try{return connection.getRemoteDeviceName(e)}catch(e){console.warn("[AdvancedAPI] getRemoteDeviceName fail")}}static stopBluetoothDiscovery(){try{return connection.stopBluetoothDiscovery()}catch(e){console.warn("[AdvancedAPI] no need to stop")}}static startBLEScan(e){try{ble.startBLEScan(null,{interval:e,dutyMode:ble.ScanDuty.SCAN_MODE_LOW_POWER,matchMode:ble.MatchMode.MATCH_MODE_AGGRESSIVE})}catch(e){console.error("[QAFAPI] startBLEScan errCode:"+e.code+",errMessage:"+e.message)}}static stopBLEScan(){try{ble.stopBLEScan()}catch(e){console.error("[QAFAPI] stopBLEScan errCode:"+e.code+",errMessage:"+e.message)}}static offBLE(){try{ble.off("BLEDeviceFind")}catch(e){console.warn("[AdvancedAPI] BLE.off.BLEDeviceFind fail")}}static getProfile(e){try{return bluetoothManager.getProfileInstance(e).getConnectionDevices()}catch(e){console.warn("[AdvancedAPI] getProfileInstance fail")}}static getConnectedBLEDevices(){try{return ble.getConnectedBLEDevices()}catch(e){console.error("[AdvancedAPI]getConnectedBLEDevices errCode:"+e.code+",errMessage:"+e.message)}}}function jsMethod(s){return(e,t,o)=>{var a=s&&s.common?e.constructor._jsBaseMethods=e.constructor._jsBaseMethods||{}:e.constructor._jsMethods=e.constructor._jsMethods||{},e=void 0!==(s=void 0!==s?s:{}).alias?s.alias:t,r=void 0===s.callback||s.callback;a[e]={methodName:t,callback:r}}}class PromptBase{static showToast(o){return new Promise((e,t)=>{promptAction.showToast(o),e()})}static showDialog(o,a){return new Promise((e,t)=>{promptAction.showDialog(o,a)})}static showActionMenu(o,a){return new Promise((e,t)=>{promptAction.showActionMenu(o,a)})}static ohosShowDialog(e){return promptAction.showDialog(e)}}let BLESTATE={STATE_ON:2,STATE_OFF:0,INDEX:1,STATE_CONNECTED:2,STATE_DISCONNECTED:0},DEFAULT={OPEN:!1,OPEN_MSG:"快应用加载器想要开启蓝牙",CLOSE_MSG:"快应用加载器请求关闭蓝牙",ALLOW_BUTTON:"允许",REFUSE_BUTTON:"拒绝"},BluetoothBaseModule=(_dec=jsMethod({alias:"openAdapter",common:!1,callback:!0}),_dec2=jsMethod({alias:"closeAdapter",common:!1,callback:!0}),_dec3=jsMethod({alias:"getAdapterState",common:!1,callback:!0}),_dec4=jsMethod({alias:"startDevicesDiscovery",common:!1,callback:!0}),_dec5=jsMethod({alias:"stopDevicesDiscovery",common:!1,callback:!0}),_dec6=jsMethod({alias:"getDevices",common:!1,callback:!0}),_dec7=jsMethod({alias:"getConnectedDevices",common:!1,callback:!0}),_dec8=jsMethod({alias:"createBLEConnection",common:!1,callback:!0}),_dec9=jsMethod({alias:"closeBLEConnection",common:!1,callback:!0}),_dec10=jsMethod({alias:"getBLEDeviceServices",common:!1,callback:!0}),_dec11=jsMethod({alias:"getBLEDeviceCharacteristics",common:!1,callback:!0}),_dec12=jsMethod({alias:"readBLECharacteristicValue",common:!1,callback:!0}),_dec13=jsMethod({alias:"writeBLECharacteristicValue",common:!1,callback:!0}),_dec14=jsMethod({alias:"notifyBLECharacteristicValueChange",common:!1,callback:!0}),_applyDecoratedDescriptor((_class=class{constructor(){_defineProperty(this,"BLECharacteristicCallback",e=>{console.debug("[AdvancedAPI] characteristicChange triger valueChange:"+JSON.stringify(e));var t,{serviceUuid:o,characteristicUuid:a}=e,e=new Uint8Array(e.characteristicValue),r={deviceId:this.deviceIdBle,serviceId:o,characteristicId:a,value:e};for(t of this.BLECharacteristicListeners)t(r)}),this.onadapterstatechange,this.ondevicefound,this.allowDuplicatesKey=!1,this.interval=0,this.state={available:BluetoothBase.bluetoothState()===BLESTATE.STATE_ON,discovering:!1},this.deviceIdBle,this.scanResult=[],this.gattClient=null,this.isOnBle={mode:!1},this.stateBLE={},this.services=[],this.bleCharacteristic={},this.characteristicValue=null,this.isInit=!1,this.devicesFoundListeners=[],this.adapterStateChangeListeners=[],this.BLEConnectionStateListeners=[],this.BLECharacteristicListeners=[]}openAdapter(e){let{operateAdapter:a=DEFAULT.OPEN}=e||{},r=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise((t,o)=>{r?t([["bluetooth is turned"]]):a?this.promptTemp(DEFAULT.OPEN_MSG).then(e=>{e.index===BLESTATE.INDEX?(BluetoothBase.enableBluetooth()&&t([[BLHErrorCode.OK]]),this.state.available=!0):o([["user reject",BLHErrorCode.SYSTEM_ERROR]])}):o([["not available",BLHErrorCode.NOT_AVAILABLE]])})}closeAdapter(e){let{operateAdapter:o=DEFAULT.OPEN}=e||{},a=BluetoothBase.bluetoothState()===BLESTATE.STATE_OFF;return new Promise((t,e)=>{a?e([["bluetooth is not turned",BLHErrorCode.NOT_INIT]]):o?this.promptTemp(DEFAULT.CLOSE_MSG).then(e=>{if(e.index===BLESTATE.INDEX){BluetoothBase.disableBluetooth()&&t([[BLHErrorCode.OK]]),this.state.available=!1;try{BluetoothBase.offBLE()}catch(e){console.error("[QAFAPI] OpenHarmony Error ondevicefound,error Message:"+e)}}}):t([["closeBluetoothAdapter success"]])})}getAdapterState(){let t=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise(e=>{e({discovering:this.state.discovering,available:t})})}startDevicesDiscovery(i){let t=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise((e,o)=>{if(t){if(i){var{services:a,allowDuplicatesKey:r,interval:s}=i;if(a&&!isArray(a)||r&&!isBoolean(r)||s&&!isNumber(s))return void o([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);let t=[];if(a){if(!a.every(e=>(t.push({serviceUuid:e}),isUuid(e.toLowerCase()))))return void o([["uuid invalid",BLHErrorCode.NO_DEVICE]]);this.isOnBle.mode=!0}else t=null;r&&(this.allowDuplicatesKey=r),s&&(this.interval=s)}BluetoothBase.startBLEScan(this.interval),BluetoothBase.startBluetoothDiscovery()?(this.state.discovering=!0,e("ok")):o([["[QAFAPI] openHarmony startBluetoothDiscovery fail",BLHErrorCode.CONNECTION_FAIL]])}else o([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}stopDevicesDiscovery(){return new Promise((e,t)=>{var o;BluetoothBase.bluetoothState()?(BluetoothBase.stopBLEScan(),o=BluetoothBase.stopBluetoothDiscovery(),this.state.discovering=!1,o?(e("ok"),this.devicesFoundListeners=[],this.isOnBle.mode=!1,this.interval=0,this.allowDuplicatesKey=!1):e("ok")):t(["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE])})}getDevices(){let o=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise((e,t)=>{o?e([[{devices:this.scanResult}]]):t([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}saveDevice(e){!this.allowDuplicatesKey&&this.isRepeat(this.scanResult,e.deviceId)||this.scanResult.push(e)}onFoundEvent(e){let a=this.getTemp();if(e[0]&&e[0].deviceId){var{deviceId:t,rssi:o,data:r}=e[0];a.deviceId=t,a.RSSI=o,a.serviceData=r;try{let o=BluetoothBase.createGattClientDevice(t);o.connect(),o.getDeviceName((e,t)=>{a.name=t,a.localName=t;try{o.disconnect(),o.close()}catch(e){console.warn("[QAFAPI] close client fail: "+JSON.stringify(e))}this.saveDevice(a)})}catch(e){console.warn("[QAFAPI] close client fail: "+JSON.stringify(e))}}else a.deviceId=e[0],a.name=BluetoothBase.getRemoteDeviceName(a.deviceId),a.localName=a.name,console.debug("[QAFAPI] onFoundEvent:"+JSON.stringify(a)),this.saveDevice(a)}getConnectedDevices(a){return new Promise((e,t)=>{if(BluetoothBase.bluetoothState()===BLESTATE.STATE_ON)if(a&&a.services&&isArray(a.services)&&0!==a.services.length){console.debug("[QAFAPI] services : "+JSON.stringify(a.services));var o=a.services.every(e=>isUuid(e.toLowerCase()))||!1;if(a&&o){let o=[];try{o=BluetoothBase.getConnectedBLEDevices()}catch(e){console.error("[QAFAPI] errCode:"+e.code+",errMessage:"+e.message)}console.debug("[QAFAPI] BleDeviceIds = "+JSON.stringify(o));try{[1,4,6,7].forEach(e=>{e=BluetoothBase.getProfile(e),console.error("[QAFAPI] profiles"+JSON.stringify(e)),e&&(o=[...o,...e])})}catch(e){console.error("[QAFAPI] getProfile fail"+e)}if((o=o.reduce((e,t)=>e.includes(t)?e:[...e,t],[]))&&0!==o.length){let t=[];o.forEach(e=>{t.push({name:BluetoothBase.getRemoteDeviceName(e),deviceId:e})}),e([[{devices:t}]])}else t([["no device",BLHErrorCode.NO_DEVICE]])}else console.debug("[QAFAPI] invalidParam services "),t([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else t([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);else t([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}createBLEConnection(e){let{deviceId:a,timeout:r}=e||{};return new Promise((t,o)=>{if(BluetoothBase.bluetoothState()===BLESTATE.STATE_ON)if(r&&!isNumber(r))o([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);else if(a&&isString(a)){this.gattClient=BluetoothBase.createGattClientDevice(a),this.gattClient.on("BLEConnectionStateChange",e=>{var t=2===e.state;this.stateBLE[e.deviceId]!==t&&(this.stateBLE[e.deviceId]=t)});try{this.gattClient.on("BLECharacteristicChange",this.BLECharacteristicCallback),console.debug("[AdvancedAPI] BLECharacteristicChange Registration succeeded.")}catch(e){console.error("AdvancedAPI BLECharacteristicChange Registration fail "+e.message)}let e=this.gattClient.connect();r?setTimeout(()=>{e?(t("ok"),this.deviceIdBle=a):o([["connection timed out",BLHErrorCode.CONNECTION_FAIL]])},r):e?(t("ok"),this.deviceIdBle=a):o([["fail connection",BLHErrorCode.CONNECTION_FAIL]])}else o([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);else o([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}closeBLEConnection(e){let o=(e||{}).deviceId;return new Promise((e,t)=>{if(o&&isString(o))try{this.gattClient.disconnect(),this.gattClient.close(),this.gattClient=null,this.stateBLE[o]=!1,e("ok")}catch(e){t([["Failed to disconnect the Bluetooth connection",BLHErrorCode.SYSTEM_ERROR]])}else t([["Deviceid must be written",BLHErrorCode.SYSTEM_ERROR]])})}getBLEDeviceServices(e){let o=(e||{}).deviceId;return new Promise((t,e)=>{if(o&&isString(o))if(isMac(o))if(BluetoothBase.bluetoothState()===BLESTATE.STATE_ON){console.debug("[QAFAPI] getServices deviceId:"+o+" this.deviceIdBLE = "+this.deviceIdBle);let e;this.gattClient&&o===this.deviceIdBle?(console.debug("[QAFAPI] getServices deviceId:"+o),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(o)).connect(),this.gattClient=e,this.deviceIdBle=o),e.getServices().then(e=>{let o=[];e.forEach(e=>{console.debug("[QAFAPI] getServices services = "+JSON.stringify(e));var{serviceUuid:e,isPrimary:t}=e,e={uuid:e,isPrimary:t};o.push(e)}),this.services=e,t([[{services:o}]])}).catch(e=>{console.error("[QAFAPI] getServices fail:"+JSON.stringify(e)),t([[{services:[]}]])})}else e([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]]);else e([["deviceId is not MAC",BLHErrorCode.SYSTEM_ERROR]]);else e([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}getBLEDeviceCharacteristics(e){return new Promise((r,s)=>{if(e){let{deviceId:t,serviceId:a}=e;if(console.info("[QAFAPI] getBLEDeviceCharacteristics deviceId:"+t+" serviceId = "+a),t&&isString(t)&&a&&isString(a)){console.info("[QAFAPI] getBLEDeviceCharacteristics deviceId:"+t+" this.deviceIdBLE = "+this.deviceIdBle);let e;this.gattClient&&t===this.deviceIdBle?(console.info("[QAFAPI] getBLEDeviceCharacteristics deviceId:"+t),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(t)).connect(),this.gattClient=e,this.deviceIdBle=t),e.getServices().then(e=>{let o;if(this.services.forEach(e=>{console.info("[QAFAPI] serviceId = "+JSON.stringify(e)),e.serviceUuid===a&&(o=e)}),o){let t=[];(this.bleDescriptor=o).characteristics.forEach(e=>{console.info("[QAFAPI] Servicesfound item = "+JSON.stringify(e)),t.push({uuid:e.characteristicUuid,properties:e.properties})}),r([[{characteristics:t}]])}else s([["Service not found",BLHErrorCode.NO_SERVICE]])}).catch(e=>{console.error("[QAFAPI] OpenHarmony Error getServices value,error Message:"+e),s([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])})}else s([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else s([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}readBLECharacteristicValue(e){return new Promise((i,n)=>{if(e){let{deviceId:a,serviceId:r,characteristicId:s}=e;isString(a)&&isString(r)&&isString(s)&&a&&r&&isUuid(r.toLowerCase())&&s&&isUuid(s.toLowerCase())?isMac(a.toLowerCase())?this.queryBLECharacteristic(a,r).then(e=>{var t=[],e={serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),descriptorUuid:e.descriptorUuid,descriptorValue:e.descriptorValue},e=(t.push(e),{serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),characteristicValue:this.characteristicValue,descriptors:t}),t=(console.debug("[QAFAPI] characteristicIn = "+JSON.stringify(e)),null);let o;if(this.gattClient&&this.deviceIdBle===a)try{o=this.gattClient.readCharacteristicValue(e)}catch(e){n([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]readBLECharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}else try{t=BluetoothBase.createGattClientDevice(a),o=t.readCharacteristicValue(e)}catch(e){n([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]readBLECharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}o?o.then(e=>{i([e])}).catch(e=>{console.error("[AdvancedAPI] Failed to read characteristic value"+e.message),n([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}):n([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}).catch(e=>{n([["Bluetooth not available",BLHErrorCode.SYSTEM_ERROR]])}):n([["deviceId is not MAC",BLHErrorCode.SYSTEM_ERROR]]):n([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else n([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}writeBLECharacteristicValue(e){return new Promise((n,c)=>{if(e){let{deviceId:a,serviceId:r,characteristicId:s,value:i}=e;isString(a)&&isString(r)&&isString(s)&&isArrayBuffer(i)&&isMac(a)&&a&&r&&isUuid(r.toLowerCase())&&s&&isUuid(s.toLowerCase())&&isLower(s.toLowerCase())&&i?this.queryBLECharacteristic(a,r).then(e=>{var t=[],e={serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),descriptorUuid:e.descriptorUuid,descriptorValue:e.descriptorValue},e=(t.push(e),{serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),characteristicValue:i,descriptors:t}),t=(console.debug("[QAFAPI] characteristicIn = "+JSON.stringify(e)),null);let o;if(this.gattClient&&this.deviceIdBle===a)try{o=this.gattClient.writeCharacteristicValue(e)}catch(e){c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]writeCharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}else try{t=BluetoothBase.createGattClientDevice(a),o=t.writeCharacteristicValue(e)}catch(e){c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]readBLECharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}o?n("ok"):c([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}).catch(e=>{c([["Bluetooth not available",BLHErrorCode.SYSTEM_ERROR]])}):c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}queryBLECharacteristic(t,r){return new Promise((o,a)=>{if(this.descriptors&&t.toLowerCase()===this.deviceIdBle.toLowerCase())o(this.descriptors);else{let e;this.gattClient&&t.toLowerCase()===this.deviceIdBle.toLowerCase()?(console.info("[QAFAPI] queryBLECharacteristic deviceId:"+t),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(t)).connect(),this.gattClient=e,this.deviceIdBle=t),e.getServices().then(e=>{let t;e.forEach(e=>{e.serviceUuid.toLowerCase()===r.toLowerCase()&&(t=e)}),t?t.characteristics.forEach(e=>{e.serviceUuid.toLowerCase()===r.toLowerCase()?(this.characteristicValue=e.characteristicValue,e.descriptors.forEach(e=>{e.serviceUuid.toLowerCase()===r.toLowerCase()?(this.descriptors=e,console.info("[QAFAPI] Servicesfound descriptor = "+JSON.stringify(e)),o(this.descriptors)):a([["characteristics not found",BLHErrorCode.NO_SERVICE]])})):(console.error("[AdvancedAPI] characteristics not found"),a([["characteristics not found",BLHErrorCode.NO_SERVICE]]))}):a([["Service not found",BLHErrorCode.NO_SERVICE]])}).catch(e=>{console.error("[AdvancedAPI] getServices fail:"+e.message),a([["Service not found",BLHErrorCode.NO_SERVICE]])})}})}notifyBLECharacteristicValueChange(e){return new Promise((n,c)=>{if(e){let{deviceId:a,serviceId:r,characteristicId:s,state:i}=e;a&&isString(a)&&r&&isString(r)&&isUuid(r.toLowerCase())&&s&&isString(s)&&isUuid(s.toLowerCase())&&i&&isBoolean(i)?isMac(a.toLowerCase())?this.queryBLECharacteristic(a,r).then(e=>{console.debug("[QAFAPI] desc = "+JSON.stringify(e));var t=[],e={serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),descriptorUuid:e.descriptorUuid,descriptorValue:e.descriptorValue},e=(t.push(e),{serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),characteristicValue:this.characteristicValue,descriptors:t}),t=(console.debug("[QAFAPI] BLECharacteristic = "+JSON.stringify(e)),null);let o;if(this.gattClient&&this.deviceIdBle===a)try{o=this.gattClient.setNotifyCharacteristicChanged(e,i)}catch(e){return c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),void console.error("[QAFAPI]setNotifyCharacteristicChanged errCode:"+e.code+",errMessage:"+e.message)}else try{t=BluetoothBase.createGattClientDevice(a),o=t.setNotifyCharacteristicChanged(e,i)}catch(e){return c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),void console.error("[QAFAPI]setNotifyCharacteristicChanged errCode:"+e.code+",errMessage:"+e.message)}o?(console.debug("[QAFAPI] notify success"),n("ok")):c([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}):c([["deviceId is not MAC",BLHErrorCode.SYSTEM_ERROR]]):c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}getBLEDeviceRSSI(a){return new Promise((t,o)=>{if(this.gattClient&&this.deviceIdBle===a)this.gattClient.getRssiValue().then(e=>{t(e)}).catch(e=>{o(e.message)});else try{var e=BluetoothBase.createGattClientDevice(a);e.connect(),this.gattClient=e,this.deviceIdBle=a,e.getRssiValue().then(e=>{t(e)}).catch(e=>{o(e.message)})}catch(e){o(e.message)}})}getTemp(){return{RSSI:"",localName:"",advertisData:"",advertisServiceUUIDs:"",name:"",serviceData:"",deviceId:""}}isRepeat(e,t){return e.some(e=>e.deviceId===t)}promptTemp(e){return PromptBase.ohosShowDialog({message:e,buttons:[{text:DEFAULT.REFUSE_BUTTON,color:"#1358e7"},{text:DEFAULT.ALLOW_BUTTON,color:"#1358e7"}]})}}).prototype,"openAdapter",[_dec],Object.getOwnPropertyDescriptor(_class.prototype,"openAdapter"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"closeAdapter",[_dec2],Object.getOwnPropertyDescriptor(_class.prototype,"closeAdapter"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getAdapterState",[_dec3],Object.getOwnPropertyDescriptor(_class.prototype,"getAdapterState"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"startDevicesDiscovery",[_dec4],Object.getOwnPropertyDescriptor(_class.prototype,"startDevicesDiscovery"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"stopDevicesDiscovery",[_dec5],Object.getOwnPropertyDescriptor(_class.prototype,"stopDevicesDiscovery"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getDevices",[_dec6],Object.getOwnPropertyDescriptor(_class.prototype,"getDevices"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getConnectedDevices",[_dec7],Object.getOwnPropertyDescriptor(_class.prototype,"getConnectedDevices"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"createBLEConnection",[_dec8],Object.getOwnPropertyDescriptor(_class.prototype,"createBLEConnection"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"closeBLEConnection",[_dec9],Object.getOwnPropertyDescriptor(_class.prototype,"closeBLEConnection"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getBLEDeviceServices",[_dec10],Object.getOwnPropertyDescriptor(_class.prototype,"getBLEDeviceServices"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getBLEDeviceCharacteristics",[_dec11],Object.getOwnPropertyDescriptor(_class.prototype,"getBLEDeviceCharacteristics"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"readBLECharacteristicValue",[_dec12],Object.getOwnPropertyDescriptor(_class.prototype,"readBLECharacteristicValue"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"writeBLECharacteristicValue",[_dec13],Object.getOwnPropertyDescriptor(_class.prototype,"writeBLECharacteristicValue"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"notifyBLECharacteristicValueChange",[_dec14],Object.getOwnPropertyDescriptor(_class.prototype,"notifyBLECharacteristicValueChange"),_class.prototype),_class);class ASBluetooth extends BluetoothBaseModule{constructor(){super(),this.deviceFoundCallback=void 0,this.adapterStateCallback=void 0,this.BLEConnectionStateCallback=void 0,this.initBluetoothDeviceFound(),this.initBluetoothAdapterStateChange(),this.initBLEConnectionStateChange()}openBluetoothAdapter(){return new Promise(async(e,t)=>{if(!await BluetoothBase.getPermissions())return t(["permission fail",ErrorCode.USER_REJECT]);BluetoothBase.bluetoothState()===BLESTATE.STATE_ON?(this.isInit=!0,e("ok")):t([["not available",BLHErrorCode.NOT_AVAILABLE]])})}closeBluetoothAdapter(){let o=BluetoothBase.bluetoothState()===BLESTATE.STATE_OFF;return new Promise((e,t)=>{if(o)t([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]]);else{if(this.isInit=!1,BluetoothBase.stopBluetoothDiscovery(),this.state.discovering=!1,this.deviceIdBle="",this.scanResult=[],this.gattClient)try{this.gattClient.disconnect(),this.gattClient.close(),this.gattClient=null}catch(e){}this.isOnBle={mode:!1},this.stateBLE={},this.services=[],this.bleCharacteristic={},this.characteristicValue=null,this.devicesFoundListeners=[],this.adapterStateChangeListeners=[],this.BLEConnectionStateListeners=[],this.BLECharacteristicListeners=[],e("ok")}})}startBluetoothDevicesDiscovery(e){return this.isInit?this.startDevicesDiscovery(e):new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}stopBluetoothDevicesDiscovery(e){return this.isInit?this.stopDevicesDiscovery(e):new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}initBluetoothDeviceFound(){this.deviceFoundCallback=e=>{this.onFoundEvent(e);for(let e of this.devicesFoundListeners)setTimeout(()=>{e([this.scanResult])},this.interval)};try{BluetoothBase.on(this.deviceFoundCallback),BluetoothBase.onBLE(this.deviceFoundCallback)}catch(e){console.error("[AdvancedAPI] openHarmony ondevicefound fail "+e)}}onBluetoothDeviceFound(e){this.devicesFoundListeners.push(e)}offBluetoothDeviceFound(e){void 0===e?this.devicesFoundListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBluetoothAdapterStateChange, param is invalid:"+typeof e):-1<(e=this.devicesFoundListeners.indexOf(e))&&this.devicesFoundListeners.splice(e,1)}initBluetoothAdapterStateChange(){this.adapterStateCallback=e=>{var t=this.state.available;if(2===e?this.state.available=!0:0===e&&(this.state.available=!1),t!==this.state.available)for(var o of this.adapterStateChangeListeners)o(t)};try{BluetoothBase.onStateChange(e=>{this.adapterStateCallback(e)})}catch(e){console.error("[AdvancedAPI] onBluetoothAdapterStateChange errCode:"+e.code+",errMessage:"+e.message)}}onBluetoothAdapterStateChange(e){this.adapterStateChangeListeners.push(e)}offBluetoothAdapterStateChange(e){void 0===e?this.devicesFoundListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBluetoothAdapterStateChange, param is invalid:"):-1<(e=this.adapterStateChangeListeners.indexOf(e))&&this.adapterStateChangeListeners.splice(e,1)}getConnectedBluetoothDevices(e){return this.isInit?this.getConnectedDevices(e):new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}getBluetoothDevices(){return this.isInit?this.getDevices():new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}getBluetoothAdapterState(){return this.isInit?this.getAdapterState():new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}asSetBLEMTU(a){return new Promise((t,o)=>{if(a&&a.deviceId&&a.mtu)if(isString(a.deviceId)&&isNumber(a.mtu))try{console.debug("[AdvancedAPI] asSetBLEMTU deviceId:"+a.deviceId+" this.deviceIdBLE = "+this.deviceIdBle);let e;this.gattClient&&a.deviceId.toLowerCase()===this.deviceIdBle.toLowerCase()?(console.debug("[AdvancedAPI] asSetBLEMTU deviceId:"+a.deviceId),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(a.deviceId)).connect(),this.gattClient=e,this.deviceIdBle=a.deviceId),this.gattClient.setBLEMtuSize(a.mtu),t("ok")}catch(e){console.error("[AdvancedAPI] setBLEMtuSize fail, errCode:"+e.code+",errMessage:"+e.message),o([[e.message,BLHErrorCode.SYSTEM_ERROR]])}else console.error("[AdvancedAPI] setBLEMTU fail, params error"),o([["param error",BLHErrorCode.SYSTEM_ERROR]]);else console.error("[AdvancedAPI] setBLEMTU fail, params error"),o([["param error",BLHErrorCode.SYSTEM_ERROR]])})}asWriteBLECharacteristicValue(e){return this.writeBLECharacteristicValue(e)}asReadBLECharacteristicValue(e){return this.readBLECharacteristicValue(e)}initBLEConnectionStateChange(){this.BLEConnectionStateCallback=t=>{this.BLEConnectionStateListeners.forEach(e=>{e(t)})},this.stateBLE=new Proxy({},{get:(e,t)=>e[t],set:(e,t,o)=>(e={deviceId:t,connected:e[t]=o},console.debug("AdvancedAPI bleConnectionStateChange"),this.BLEConnectionStateCallback(e),!0)})}asOnBLEConnectionStateChange(e){this.BLEConnectionStateListeners.push(e)}asOffBLEConnectionStateChange(e){void 0===e?this.BLEConnectionStateListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBLEConnectionStateChange, param is invalid:"):-1<(e=this.BLEConnectionStateListeners.indexOf(e))&&this.BLEConnectionStateListeners.splice(e,1)}asOnBLECharacteristicValueChange(e){this.BLECharacteristicListeners.push(e)}asOffBLECharacteristicValueChange(e){void 0===e?this.BLECharacteristicListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBLECharacteristicValueChange, param is invalid:"):-1<(e=this.BLECharacteristicListeners.indexOf(e))&&this.BLECharacteristicListeners.splice(e,1)}asNotifyBLECharacteristicValueChange(e){return console.debug("[AdvancedAPI] params = "+JSON.stringify(e)),this.notifyBLECharacteristicValueChange(e)}asGetBLEDeviceServices(e){return this.getBLEDeviceServices(e)}asGetBLEDeviceRSSI(e){return new Promise((t,o)=>{e&&e.deviceId&&"string"==typeof e.deviceId?this.getBLEDeviceRSSI(e.deviceId).then(e=>{t({rssi:e})}).catch(e=>{o([[e,BLHErrorCode.SYSTEM_ERROR]])}):o([["invalidParams",BLHErrorCode.SYSTEM_ERROR]])})}asGetBLEDeviceCharacteristics(e){return this.getBLEDeviceCharacteristics(e)}asCreateBLEConnection(e){return e&&console.info("[AdvancedAPI] asCreateBLEConnection params = "+JSON.stringify(e)),this.createBLEConnection(e)}asCloseBLEConnection(e){return this.closeBLEConnection(e)}}class ASRouter{navigateTo(r){return new Promise((e,t)=>{var o,a;"string"!=typeof r.url?t(["param url",ErrorCode$1.PARAMETER_ERROR]):({url:o,urlParams:a}=getUrlParams(r.url),console.debug("[AdvancedAPI] navigateTo urlParams = %s",JSON.stringify(a)),router.pushUrl({url:o,params:a}).then(()=>{e()}).catch(e=>{console.error(`[AdvancedAPI] pushUrl failed, code is ${e.code}, message is `+e.message),t([e.message,e.code])}))})}redirectTo(r){return new Promise((e,t)=>{var o,a;"string"!=typeof r.url?t(["param url",ErrorCode$1.PARAMETER_ERROR]):({url:o,urlParams:a}=getUrlParams(r.url),console.debug("[AdvancedAPI] redirectTo urlParams = "+JSON.stringify(a)),router.replaceUrl({url:o,params:a}).then(()=>{e()}).catch(e=>{console.error(`[AdvancedAPI] replaceUrl failed, code is ${e.code}, message is `+e.message),t([e.message,e.code])}))})}switchTab(e){return new Promise(async(e,t)=>{t("[AdvancedAPI] switchTab do not support")})}navigateBack(r){return new Promise((e,t)=>{let{delta:o=1}=r;if("number"!=typeof(o=null===o?1:o))t(["parameter delta",ErrorCode$1.PARAMETER_ERROR]);else{var a=Number(router.getLength());o>a&&(o=a-1);try{for(let e=0;e{e=e.split("="),t[e[0]]=e[1]}),{url:e,urlParams:t}}class WifiBase{static isWifiActive(){return wifi.isWifiActive()}static scan(){return wifi.scan()}static ohoGetLinkedInfo(){return new Promise((o,a)=>{wifi.getLinkedInfo((e,t)=>{e?(console.log("[QAFAPI] get linked info error:"+e),a(e)):(console.log("[QAFAPI] get wifi linked info: "+JSON.stringify(t)),o(t))})})}static connectionChange(e){wifi.on("wifiConnectionChange",e)}static scanStateChange(e){wifi.on("wifiScanStateChange",e)}static getScanInfos(){return new Promise((t,o)=>{wifi.getScanInfos().then(e=>{t(e)}).catch(e=>{console.info("[QAFAPI] getScanInfos error "+JSON.stringify(e)),o(e)})})}}_defineProperty(WifiBase,"ConnState",{SCANNING:0,CONNECTING:1,AUTHENTICATING:2,OBTAINING_IPADDR:3,CONNECTED:4,DISCONNECTING:5,DISCONNECTED:6,UNKNOWN:7}),_defineProperty(WifiBase,"StateType",{OFF:0,ON:1}),_defineProperty(WifiBase,"ScanState",{SUCCESS:1,FAIL:0}),_dec$1=jsMethod({alias:"scan",common:!1}),_dec2$1=jsMethod({alias:"getConnectedWifi",common:!1}),_applyDecoratedDescriptor((_class$1=class{constructor(){this.SecureType={WPA:"wpa",WEP:"wep"}}isSecure(e=""){return!(!(e=e.toLowerCase()).includes(this.SecureType.WPA)&&!e.includes(this.SecureType.WEP))}getSignalStrength(e){return e+100}scan(){return new Promise((e,t)=>{WifiBase.isWifiActive()?WifiBase.scan()?e([["scan success"]]):t([["scan fail",WifiErrorCode.WIFI_NOT_TURNED_ON]]):t([["wifi not turned on",WifiErrorCode.WIFI_NOT_TURNED_ON]])})}getConnectedWifi(a){return new Promise((s,o)=>{WifiBase.isWifiActive()?WifiBase.ohoGetLinkedInfo().then(async e=>{if(e.connState===WifiBase.ConnState.DISCONNECTED)o([["wifi is not connected",ErrorCode$1.COMMON_ERROR]]);else if(a){var t={SSID:e.ssid};s([[t]])}else{let t={BSSID:e.bssid,SSID:e.ssid,frequency:e.frequency,signalStrength:this.getSignalStrength(e.rssi),secure:!1},o,a=await WifiBase.getScanInfos(),r=a.length;for(let e=0;e{wifi.isWifiActive()||wifi.enableWifi()?(console.debug("[AdvancedAPI] enableWifi success"),e()):(console.debug("[AdvancedAPI] enableWifi fail"),t(["wifi not turned on",WifiErrorCode.WIFI_NOT_TURNED_ON]))})}stopWifi(){return new Promise((e,t)=>{!wifi.isWifiActive()||wifi.disableWifi()?(console.debug("[AdvancedAPI] stopWifi success"),e()):(console.debug("[AdvancedAPI] stopWifi fail"),t(["system not support",ErrorCode$1.COMMON_ERROR]))})}getConnectedWifi(a={}){return new Promise((t,o)=>{var{partialInfo:e=!1}=a;super.getConnectedWifi(e).then(([[e]])=>{t({wifi:e})},e=>{o(...e)})})}getWifiList(e){return new Promise((t,o)=>{super.scan().then(([e=[]]=[])=>{t(...e)},e=>{o(...e)})})}onGetWifiList(e){"function"!=typeof e?console.error("[AdvancedAPI] param is invalid."):this.wifiScanCallbacks.push(e)}offGetWifiList(e){0<=(e=this.wifiScanCallbacks.indexOf(e))?this.wifiScanCallbacks.splice(e,1):this.wifiScanCallbacks=[]}connectWifi(n){return new Promise(async(t,o)=>{let{SSID:a,BSSID:e="",password:r="",maunal:s=!1}=n;if(isString(a))if(isString(e))if(isString(r)){try{if((await this.getConnectedWifi()).wifi.SSID===a)return void t()}catch(e){console.debug("[AdvancedAPI] wifi is not connected.")}try{var i=await wifi.addDeviceConfig({ssid:a,bssid:e,preSharedKey:r,securityType:3,isHiddenSsid:!1});console.debug("[AdvancedAPI] addDeviceConfig success netId = %d",i),this._connectByNetId.push(e=>{(e.wifi.SSID===a?t:o)()}),s?console.error("[AdvancedAPI] 不支持跳转系统wlan页面"):wifi.connectToNetwork(i)}catch(e){console.error("[AdvancedAPI] connectWifi addDeviceConfig fail err = "+e),o(["system not support",ErrorCode$1.COMMON_ERROR])}}else console.error("[AdvancedAPI] connectWifi invalid password"),o(["wifi password error",WifiErrorCode.PASSWORD_ERROR]);else console.error("[AdvancedAPI] connectWifi invalid BSSID"),o(["wifi BSSID error",WifiErrorCode.PASSWORD_ERROR]);else console.error("[AdvancedAPI] connectWifi invalid SSID"),o(["wifi SSID error",WifiErrorCode.PASSWORD_ERROR])})}onWifiConnected(e){"function"!=typeof e?console.error("[AdvancedAPI] param is invalid."):this.connectCallbacks.push(e)}offWifiConnected(e){0<=(e=this.connectCallbacks.indexOf(e))?this.connectCallbacks.splice(e,1):this.connectCallbacks=[]}connectionChange(){WifiBase.connectionChange(e=>{e===WifiBase.StateType.ON?this.getConnectedWifi().then(({wifi:e})=>{e.state=WifiBase.StateType.ON,this.triggerConnectCallbacks({wifi:e}),this.triggerConnectWithPartialInfo({wifi:e}),this.triggerConnectById({wifi:e})},()=>{var e={BSSID:"",signalStrength:0,state:WifiBase.StateType.ON,secure:!1,SSID:""};this.triggerConnectCallbacks({wifi:e}),this.triggerConnectWithPartialInfo({wifi:e})}):e===WifiBase.StateType.OFF&&(e={BSSID:"",signalStrength:0,state:WifiBase.StateType.OFF,secure:!1,SSID:""},this.triggerConnectCallbacks({wifi:e}),this.triggerConnectWithPartialInfo({wifi:e}))})}scanChange(){WifiBase.scanStateChange(e=>{e===WifiBase.ScanState.SUCCESS&&WifiBase.getScanInfos().then(e=>{console.debug("[AdvancedAPI] onGetWifiList getScanInfos success"),e=e.map(e=>({BSSID:e.bssid,SSID:e.ssid,frequency:e.frequency,signalStrength:super.getSignalStrength(e.rssi),secure:super.isSecure(e.capabilities)})),this.triggerScanCallbacks({wifiList:e})})})}triggerConnectCallbacks(t){console.debug("[AdvancedAPI] triggerConnectCallbacks"),t.errMsg="onWifiConnected:ok",t.errCode=0,this.connectCallbacks.forEach(e=>{e(t)})}triggerConnectById(t){console.debug("[AdvancedAPI] triggerConnectById"),this._connectByNetId.forEach(e=>{e(t)}),this._connectByNetId=[]}triggerScanCallbacks(t){console.debug("[AdvancedAPI] wifiScanCallbacks"),this.wifiScanCallbacks.forEach(e=>{e(t)})}onWifiConnectedWithPartialInfo(e){"function"!=typeof e?console.error("[AdvancedAPI] param is invalid."):this.connectWithPartialInfo.push(e)}offWifiConnectedWithPartialInfo(e){0<=(e=this.connectWithPartialInfo.indexOf(e))?this.connectWithPartialInfo.splice(e,1):this.connectWithPartialInfo=[]}triggerConnectWithPartialInfo(e){console.debug("[AdvancedAPI] triggerConnectWithPartialInfo");let t={SSID:e.wifi.SSID};this.connectWithPartialInfo.forEach(e=>{e({wifi:t})})}}let AUTH_RESULT={PERMISSION_CHECK_FAIL:201,PARAM_ERROR:401,FAIL:12500001,OPEN_ERROR:12500002,USER_CANCEL:12500003,TIME_OUT:12500004,TYPE_UNSUPPORTED:12500005,TRUSTED_LEVEL_UNSUPPORTED:12500006,TASK_BUSY:12500007,AUTHENTICATOR_LOCKED:12500009,NOT_ENROLLED:12500010};function toUint8Arr(e){var t,o=[];for(t of e){var a=t.charCodeAt(0);a<128?o.push(a):a<2048?(o.push(192+(a>>6)),o.push(128+(63&a))):a<65536&&(o.push(224+(a>>12)),o.push(128+(a>>6&63)),o.push(128+(63&a)))}return Uint8Array.from(o)}class ASAuthentication{start(n){return new Promise((t,o)=>{if("facial"!==(n&&n.requestAuthModes||""))o({errCode:90003,errMsg:"The authentication type is not supported."});else{var e=toUint8Arr(n.challenge),a=n&&n.authContent||"",r=userIAM_userAuth.UserAuthType.FACE,s=userIAM_userAuth.AuthTrustLevel.ATL1;try{var i=userIAM_userAuth.getAuthInstance(e,r,s);i.on("result",{callback:e=>{console.debug("[AdvancedAPI] authV9 result "+e.result),console.debug("[AdvancedAPI] authV9 token "+e.token),console.debug("[AdvancedAPI] authV9 remainAttempts "+e.remainAttempts),console.debug("[AdvancedAPI] authV9 lockoutDuration "+e.lockoutDuration),e.result===AUTH_RESULT.PERMISSION_CHECK_FAIL?o({errCode:90002,errMsg:"Permission verification failed."}):e.result===AUTH_RESULT.PARAM_ERROR?o({errCode:90004,errMsg:"Incorrect parameters."}):e.result===AUTH_RESULT.FAIL?o({errCode:90009,errMsg:"Authentication failed."}):e.result===AUTH_RESULT.OPEN_ERROR?o({errCode:90009,errMsg:"General operation error."}):e.result===AUTH_RESULT.USER_CANCEL?o({errCode:90008,errMsg:"The operation is canceled."}):e.result===AUTH_RESULT.TIME_OUT?o({errCode:90007,errMsg:"The operation is time-out."}):e.result===AUTH_RESULT.TYPE_UNSUPPORTED?o({errCode:90003,errMsg:"The authentication type is not supported."}):e.result===AUTH_RESULT.TRUSTED_LEVEL_UNSUPPORTED?o({errCode:90003,errMsg:"The authentication trust level is not supported."}):e.result===AUTH_RESULT.TASK_BUSY?o({errCode:90010,errMsg:"The authentication task is busy."}):e.result===AUTH_RESULT.AUTHENTICATOR_LOCKED?o({errCode:90010,errMsg:"The authenticator is locked."}):e.result===AUTH_RESULT.NOT_ENROLLED?o({errCode:90011,errMsg:"The type of credential has not been enrolled."}):t({authMode:"facial",resultJSON:"",resultJSONSignature:"",errCode:0,errMsg:void 0})}}),i.on("tip",{callback:e=>{switch(e.tip){case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_BRIGHT:prompt.showToast({message:"光线太强,获取的图像太亮。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_DARK:prompt.showToast({message:"光线太暗,获取的图像太暗。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_CLOSE:prompt.showToast({message:"人脸距离设备过近。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_FAR:prompt.showToast({message:"人脸距离设备过远。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_HIGH:prompt.showToast({message:"设备太高,仅获取到人脸上部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_LOW:prompt.showToast({message:"设备太低,仅获取到人脸下部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_RIGHT:prompt.showToast({message:"设备太靠右,仅获取到人脸右部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_LEFT:prompt.showToast({message:"设备太靠左,仅获取到人脸左部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_MUCH_MOTION:prompt.showToast({message:"在图像采集过程中,用户人脸移动太快。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_POOR_GAZE:prompt.showToast({message:"没有正视摄像头。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_NOT_DETECTED:prompt.showToast({message:"没有检测到人脸信息。"});break;default:console.debug("[AdvancedAPI] %s",JSON.stringify(e))}}}),a&&(console.debug("[AdvancedAPI] showToast authContent = %s",a),prompt.showToast({message:a})),i.start(),console.debug("[AdvancedAPI] authV9 start success")}catch(e){console.debug("[AdvancedAPI] authV9 start error = %s",e),o({errCode:90007,errMsg:"General operation fail."})}}})}getSupportedType(){return console.debug("[AdvancedAPI] start getSupportedType"),new Promise(e=>{e({supportMode:["facial"]})})}isEnrolled(a){return console.debug("[AdvancedAPI] start isEnrolled"),new Promise((e,t)=>{var o=a&&a.checkAuthMode||"";"fingerPrint"===o?e({isEnrolled:!1,errMsg:""}):"facial"===o&&e({isEnrolled:!1,errMsg:"The type of credential has not been enrolled."})})}}class OhosSensorBase{static ohosSubscribeAccelerometer(e){let{interval:t,callback:o}=e;sensor.on(sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER,e=>{o(e)},{interval:t})}static ohosUnsubscribeAccelerometer(){sensor.off(sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER)}static ohosSubscribeCompass(e){let t=e.callback;sensor.on(sensor.SensorType.SENSOR_TYPE_ID_ORIENTATION,e=>{t(e)})}static ohosUnsubscribeCompass(){sensor.off(sensor.SensorType.SENSOR_TYPE_ID_ORIENTATION)}static ohosSubscribeGyroscope(e){let{intervalValue:t,callback:o}=e;sensor.on(sensor.SensorId.GYROSCOPE,e=>{o(e)},{interval:t})}static ohosUnsubscribeGyroscope(){sensor.off(sensor.SensorId.GYROSCOPE)}}let intervalType=[{label:"game",value:2e7},{label:"ui",value:6e7},{label:"normal",value:2e8}];class ASAccelerometer{constructor(){this.callBackSet=new Set,this.defaultInterval="normal"}onAccelerometerChange(o){return new Promise((e,t)=>{"function"!=typeof o||this.callBackSet.has(o)?t("param is invalid.",ErrorCode$1.PARAMETER_ERROR):(this.callBackSet.add(o),t=intervalType.find(e=>e.label===this.defaultInterval).value,OhosSensorBase.ohosSubscribeAccelerometer({interval:t,callback:e=>{var t,o={x:e.x,y:e.y,z:e.z};for(t of this.callBackSet.keys())t(o)}}),e())})}offAccelerometerChange(o){return new Promise((e,t)=>{"function"!=typeof o?(this.callBackSet.clear(),OhosSensorBase.ohosUnsubscribeAccelerometer(),e()):this.callBackSet.has(o)?(this.callBackSet.delete(o),0===this.callBackSet.size&&OhosSensorBase.ohosUnsubscribeAccelerometer(),e()):t("param is invalid.",ErrorCode$1.COMMON_ERROR)})}startAccelerometer(r){return new Promise((e,t)=>{let o=intervalType.find(e=>e.label===this.defaultInterval).value;var a;r.interval&&"string"==typeof r.interval&&(a=intervalType.find(e=>e.label===r.interval))&&(o=a.value),OhosSensorBase.ohosSubscribeAccelerometer({interval:o,callback:e=>{var t,o={x:e.x,y:e.y,z:e.z};for(t of this.callBackSet.keys())t(o)}}),e()})}stopAccelerometer(){return new Promise((e,t)=>{OhosSensorBase.ohosUnsubscribeAccelerometer(),e()})}}class ASCompass{constructor(){this.callBackCompassSet=new Set}onCompassChange(o){return new Promise(async(e,t)=>{"function"!=typeof o||this.callBackCompassSet.has(o)?t("param is invalid.",ErrorCode$1.PARAMETER_ERROR):(this.callBackCompassSet.add(o),OhosSensorBase.ohosSubscribeCompass({callback:e=>{var t,o={direction:e.alpha,accuracy:e.alpha?3:0};for(t of this.callBackCompassSet.keys())t(o)}}),e())})}offCompassChange(o){return new Promise(async(e,t)=>{"function"==typeof o&&this.callBackCompassSet.has(o)?(this.callBackCompassSet.delete(o),0===this.callBackCompassSet.size&&OhosSensorBase.ohosUnsubscribeCompass(),e("success")):t("param is invalid.",ErrorCode$1.PARAMETER_ERROR)})}startCompass(e){return new Promise(async(e,t)=>{OhosSensorBase.ohosSubscribeCompass({callback:e=>{var t,o={direction:e.alpha,accuracy:e.alpha?3:0};for(t of this.callBackCompassSet.keys())t(o)}}),e("success")})}stopCompass(){return new Promise(async(e,t)=>{OhosSensorBase.ohosUnsubscribeCompass(),e("success")})}}let intervalType$1=[{label:"game",value:2e7},{label:"ui",value:6e7},{label:"normal",value:2e8}];class ASGyroscope{constructor(){this.callBackGyroscopeSet=new Set}onGyroscopeChange(o){return new Promise((e,t)=>{"function"!=typeof o||this.callBackGyroscopeSet.has(o)?t("param is invalid.",ErrorCode$1.PARAMETER_ERROR):(this.callBackGyroscopeSet.add(o),e())})}startGyroscope(r={}){return new Promise((e,t)=>{let o=intervalType$1.find(e=>"normal"===e.label).value;var a;r.interval&&"string"==typeof r.interval&&(a=intervalType$1.find(e=>e.label===r.interval))&&(o=a.value),OhosSensorBase.ohosSubscribeGyroscope({intervalValue:o,callback:e=>{var t,o={x:e.x,y:e.y,z:e.z};for(t of this.callBackGyroscopeSet.keys())t(o)}}),e()})}stopGyroscope(){return new Promise((e,t)=>{OhosSensorBase.ohosUnsubscribeGyroscope(),e()})}}class ASContact{addPhoneContact(D){return new Promise(async(t,o)=>{try{var{authResults:e,dialogShownResults:a}=await abilityAccessCtrl.createAtManager().requestPermissionsFromUser(context,["ohos.permission.WRITE_CONTACTS"]);if(0!==e[0])return void o(["request permission fail",ErrorCode$1.USER_REJECT,e[0],a[0]]);console.debug("[AdvancedAPI] request WRITE_CONTACTS permission success")}catch(e){return void o(["request permission fail",ErrorCode$1.USER_REJECT])}var{photoFilePath:e,nickName:a="",lastName:r="",middleName:s="",firstName:i="",remark:n,mobilePhoneNumber:c,weChatNumber:l,addressCountry:d="",addressState:h="",addressCity:u="",addressStreet:p="",addressPostalCode:f,organization:A,url:g,workPhoneNumber:m,workFaxNumber:y,hostNumber:S,email:v,title:C,workAddressCountry:P="",workAddressState:E="",workAddressCity:b="",workAddressStreet:I="",workAddressPostalCode:T,homeFaxNumber:R,homePhoneNumber:k,homeAddressCountry:_="",homeAddressState:B="",homeAddressCity:O="",homeAddressStreet:w="",homeAddressPostalCode:L}=D;l||console.error("[AdvancedAPI] weChatNumber do not support."),i?(l={name:{familyName:r,middleName:s,givenName:i,fullName:r+s+i},nickName:{nickName:a},emails:[{email:v,displayName:"邮箱"}],phoneNumbers:[{phoneNumber:k,labelId:contact.PhoneNumber.NUM_HOME},{phoneNumber:c,labelId:contact.PhoneNumber.NUM_MOBILE},{phoneNumber:R,labelId:contact.PhoneNumber.NUM_FAX_HOME},{phoneNumber:y,labelId:contact.PhoneNumber.NUM_FAX_WORK},{phoneNumber:m,labelId:contact.PhoneNumber.NUM_WORK},{phoneNumber:S,labelId:contact.PhoneNumber.NUM_COMPANY_MAIN}],portrait:{uri:e},postalAddresses:[{city:O,country:_,postcode:L,street:w,postalAddress:_+B+O+w,labelId:contact.PostalAddress.ADDR_HOME},{city:b,country:P,postcode:T,street:I,postalAddress:P+E+b+I,labelId:contact.PostalAddress.ADDR_WORK},{city:u,country:d,postcode:f,street:p,postalAddress:d+h+u+p,labelId:contact.PostalAddress.CUSTOM_LABEL}],websites:[{website:g}],note:{noteContent:n},organization:{name:A,title:C}},contact.addContact(l).then(e=>{console.debug("[AdvancedAPI] addContact callback: success contactId = "+e),t()}).catch(e=>{console.debug("[AdvancedAPI] addContact callback: err->"+JSON.stringify(e)),o([e.data,e.code])})):(console.error("[AdvancedAPI] firstName is required."),o(["fail Missing required parameter `firstName`",ErrorCode$1.PARAMETER_ERROR]))})}}class ASVibrator{vibrate(){return new Promise((t,o)=>{this.triggerVibrate({duration:200}).then(e=>{t(e)}).catch(e=>{o([e.data,e.code])})})}vibrateLong(){return new Promise((t,o)=>{this.triggerVibrate({duration:400}).then(e=>{t(e)}).catch(e=>{o([e.data,e.code])})})}vibrateShort(){return new Promise((t,o)=>{this.triggerVibrate({duration:15}).then(e=>{t(e)}).catch(e=>{o([e.data,e.code])})})}triggerVibrate(a){return new Promise((t,o)=>{var e={type:"time",duration:a.duration};vibrator.startVibration(e,{id:0,usage:"alarm"}).then(e=>{console.debug("[AdvancedAPI] startVibration success"),t(e)},e=>{console.error("[AdvancedAPI] startVibration fail err = "+JSON.stringify(e)),o(e)}).catch(e=>{console.error("[AdvancedAPI] startVibration fail err = "+JSON.stringify(e)),o(e)})})}}class ASCapture{constructor(){this.captureCallback=null}onUserCaptureScreen(t){if(t)try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e,this.captureCallback&&(this.windowClass.off("screenshot"),this.captureCallback=null),this.captureCallback=t,console.info("[AdvancedAPI] Succeeded in obtaining the top window. Listen to screenshot event.");try{this.windowClass.on("screenshot",function(){t("ohos not support path")})}catch(e){console.error("[AdvancedAPI] Failed to register callback. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}else console.error("[AdvancedAPI] params illegal, empty callback")}offUserCaptureScreen(t){try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e,console.info("[AdvancedAPI] Succeeded in obtaining the top window. Unsubscribe screenshot event.");try{!t||this.captureCallback&&this.captureCallback===t?(this.windowClass.off("screenshot"),this.captureCallback=null):console.info("[AdvancedAPI] Invalid callback.")}catch(e){console.error("[AdvancedAPI] Failed to unregister callback. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}}}class ASKeyboard{constructor(){this.changeCallback=new Map}hideKeyboard(){return new Promise((e,t)=>{try{inputMethod.getController().hideTextInput().then(()=>{console.debug("[AdvancedAPI] Succeeded in hiding softKeyboard."),e()}).catch(e=>{console.error("[AdvancedAPI] Failed to hideSoftKeyboard: "+JSON.stringify(e)),t()})}catch(e){console.error("[AdvancedAPI] Failed to get inputMethod Controller. Cause: "+JSON.stringify(e)),t()}})}onKeyboardHeightChange(o){if(o)try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e;let t=DisplayBase.ohosGetDisplay().densityPixels;this.changeCallback.has(o)||this.changeCallback.set(o,function(e){o({height:Math.round(e/t)})}),console.info("[AdvancedAPI] Succeeded in obtaining the top window. Listen to keyboard height change");try{this.windowClass.on("keyboardHeightChange",this.changeCallback.get(o))}catch(e){console.error("[AdvancedAPI] Failed to enable the listener for keyboard height changes. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}else console.error("[AdvancedAPI] params illegal, empty callback")}offKeyboardHeightChange(t){try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e,console.info("[AdvancedAPI] Succeeded in obtaining the top window. Unsubscribe keyboard change event.");try{t?this.changeCallback.has(t)?(this.windowClass.off("keyboardHeightChange",this.changeCallback.get(t)),this.changeCallback.delete(t)):console.info("[AdvancedAPI] Invalid callback."):(this.windowClass.off("keyboardHeightChange"),this.changeCallback.clear())}catch(e){console.error("[AdvancedAPI] Failed to unregister callback. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}}}class FileioBase{static ohosOpendirSync(e){return new OhosOpendir(e)}static ohosReadSync(e,t){return fs.readSync(e,t)}static ohosUnlinkSync(e){return fs.unlinkSync(e)}static ohosCopy(e,t,o=0){return fs.copyFile(e,t,o)}static ohosMkdirSync(e,t=0){return fs.mkdirSync(e)}static ohosReadTextSync(e,t){return fs.readTextSync(e,t)}static ohosStatSync(e){return fs.statSync(e)}static ohosOpenSync(e,t,o=0){return e&&"string"==typeof e&&e.startsWith("/data/storage/")&&(e=fileuri.getUriFromPath(e)),fs.openSync(e,t)}static ohosWriteSync(e,t,o={}){return fs.writeSync(e,t,o)}static ohosAccessSync(e,t=0){return fs.accessSync(e)}}class OhosOpendir{constructor(e){this.dir=fs.listFileSync(e)}ohosReadsync(){return this.dir}}class WantConstantBase{static getAction(e){return wantConstant.Action[e]}}let version="3.7.7",VERSION=version,_hasBuffer="function"==typeof Buffer,_TD="function"==typeof TextDecoder?new TextDecoder:void 0,_TE="function"==typeof TextEncoder?new TextEncoder:void 0,b64ch="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",b64chs=Array.prototype.slice.call(b64ch),b64tab=(e=>{let o={};return e.forEach((e,t)=>o[e]=t),o})(b64chs),b64re=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,_fromCC=String.fromCharCode.bind(String),_U8Afrom="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):e=>new Uint8Array(Array.prototype.slice.call(e,0)),_mkUriSafe=e=>e.replace(/=/g,"").replace(/[+\/]/g,e=>"+"==e?"-":"_"),_tidyB64=e=>e.replace(/[^A-Za-z0-9\+\/]/g,""),btoaPolyfill=t=>{let o,a,r,s,i="",e=t.length%3;for(let e=0;e>18&63]+b64chs[o>>12&63]+b64chs[o>>6&63]+b64chs[63&o]}return e?i.slice(0,e-3)+"===".substring(e):i},_btoa="function"==typeof btoa?e=>btoa(e):_hasBuffer?e=>Buffer.from(e,"binary").toString("base64"):btoaPolyfill,_fromUint8Array=_hasBuffer?e=>Buffer.from(e).toString("base64"):o=>{var a=[];for(let e=0,t=o.length;et?_mkUriSafe(_fromUint8Array(e)):_fromUint8Array(e),cb_utob=e=>{var t;return e.length<2?(t=e.charCodeAt(0))<128?e:t<2048?_fromCC(192|t>>>6)+_fromCC(128|63&t):_fromCC(224|t>>>12&15)+_fromCC(128|t>>>6&63)+_fromCC(128|63&t):(t=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320),_fromCC(240|t>>>18&7)+_fromCC(128|t>>>12&63)+_fromCC(128|t>>>6&63)+_fromCC(128|63&t))},re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,utob=e=>e.replace(re_utob,cb_utob),_encode=_hasBuffer?e=>Buffer.from(e,"utf8").toString("base64"):_TE?e=>_fromUint8Array(_TE.encode(e)):e=>_btoa(utob(e)),encode=(e,t=!1)=>t?_mkUriSafe(_encode(e)):_encode(e),encodeURI$1=e=>encode(e,!0),re_btou=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,cb_btou=e=>{switch(e.length){case 4:var t=((7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3))-65536;return _fromCC(55296+(t>>>10))+_fromCC(56320+(1023&t));case 3:return _fromCC((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return _fromCC((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},btou=e=>e.replace(re_btou,cb_btou),atobPolyfill=t=>{if(t=t.replace(/\s+/g,""),!b64re.test(t))throw new TypeError("malformed base64.");t+="==".slice(2-(3&t.length));let o,a="",r,s;for(let e=0;e>16&255):64===s?_fromCC(o>>16&255,o>>8&255):_fromCC(o>>16&255,o>>8&255,255&o);return a},_atob="function"==typeof atob?e=>atob(_tidyB64(e)):_hasBuffer?e=>Buffer.from(e,"base64").toString("binary"):atobPolyfill,_toUint8Array=_hasBuffer?e=>_U8Afrom(Buffer.from(e,"base64")):e=>_U8Afrom(_atob(e).split("").map(e=>e.charCodeAt(0))),toUint8Array=e=>_toUint8Array(_unURI(e)),_decode=_hasBuffer?e=>Buffer.from(e,"base64").toString("utf8"):_TD?e=>_TD.decode(_toUint8Array(e)):e=>btou(_atob(e)),_unURI=e=>_tidyB64(e.replace(/[-_]/g,e=>"-"==e?"+":"/")),decode=e=>_decode(_unURI(e)),isValid=e=>"string"==typeof e&&(e=e.replace(/\s+/g,"").replace(/={0,2}$/,""),!/[^\s0-9a-zA-Z\+/]/.test(e)||!/[^\s0-9a-zA-Z\-_]/.test(e)),_noEnum=e=>({value:e,enumerable:!1,writable:!0,configurable:!0}),extendString=function(){var e=(e,t)=>Object.defineProperty(String.prototype,e,_noEnum(t));e("fromBase64",function(){return decode(this)}),e("toBase64",function(e){return encode(this,e)}),e("toBase64URI",function(){return encode(this,!0)}),e("toBase64URL",function(){return encode(this,!0)}),e("toUint8Array",function(){return toUint8Array(this)})},extendUint8Array=function(){var e=(e,t)=>Object.defineProperty(Uint8Array.prototype,e,_noEnum(t));e("toBase64",function(e){return fromUint8Array(this,e)}),e("toBase64URI",function(){return fromUint8Array(this,!0)}),e("toBase64URL",function(){return fromUint8Array(this,!0)})},extendBuiltins=()=>{extendString(),extendUint8Array()},gBase64={version:version,VERSION:VERSION,atob:_atob,atobPolyfill:atobPolyfill,btoa:_btoa,btoaPolyfill:btoaPolyfill,fromBase64:decode,toBase64:encode,encode:encode,encodeURI:encodeURI$1,encodeURL:encodeURI$1,utob:utob,btou:btou,decode:decode,isValid:isValid,fromUint8Array:fromUint8Array,toUint8Array:toUint8Array,extendString:extendString,extendUint8Array:extendUint8Array,extendBuiltins:extendBuiltins};class ASImage{constructor(){_defineProperty(this,"getArrayBuffer",async(e,t,o,a,r)=>{var s,i,n;return void 0!==a||void 0!==r?(a=r||a||0,n=image.createImageSource(t),i=image.createImagePacker(),r=(s=await n.getImageInfo()).size.width/r,n=await n.createPixelMap({desiredSize:{width:a,height:s.size.height/r}}),await i.packing(n,{format:"image/jpeg",quality:e})):(a=image.createImageSource(t),s=image.createImagePacker(),r={format:"image/jpeg",quality:e},i=await a.getImageInfo(),n=await a.createPixelMap({desiredSize:{width:i.size.width,height:i.size.height}}),await s.packing(n,r))})}chooseImage(n){return n=n||{},new Promise(async(e,t)=>{var o=await MediaLibraryBase.getPermissions();if(-1===o.perNum)return t(["permission fail",ErrorCode$1.USER_REJECT,o.perNum,o.dialogShownResults]);if(n.count&&"number"!=typeof n.count)return t(['chooseImage:fail parameter `count`. Expected Number with value NaN, got String with value "'+n.count+'".',ErrorCode$1.PARAMETER_ERROR]);n.count<1&&(n.count=9);let a=[];if(n.sourceType&&1===n.sourceType.length&&n.sourceType.includes("camera")){if(o=await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT),0!==(o=await context.startAbilityForResult({action:WantConstantBase.getAction("ACTION_IMAGE_CAPTURE"),parameters:{uri:"capture",callBundleName:o.name}})).resultCode)return t(["Failed to pull up camera app",ErrorCode$1.SERVICE_UNAVIALABLE]);if(a=[o.want.parameters.resourceUri],!o.want.parameters.resourceUri)return}else(o=new picker.PhotoSelectOptions).MIMEType=picker.PhotoViewMIMETypes.IMAGE_TYPE,o.maxSelectNumber=n.count,o=await(new picker.PhotoViewPicker).select(o),a=o.photoUris;if(!a)return t(["get uri fail",ErrorCode$1.SERVICE_UNAVIALABLE]);if("cancel"!==a){var r,s=[],i=[];for(let e=0;e{try{var o,a,r,s,i,n=c.src;return isFileUri(n)?(a={0:"up",90:"right",180:"down",270:"left"}[(o=await getFileAssetFromUri(n)).orientation],e({width:o.width,height:o.height,path:n,orientation:a,type:o.displayName.split(".").pop()})):isSandboxPath(n)?(r=image.createImageSource(switchInternalToHapSandBox(n)),s=n.split(".").pop(),e({width:(i=await r.getImageInfo()).size.width,height:i.size.height,path:c.src,orientation:"up",type:s})):t(["get uri fail",ErrorCode$1.SERVICE_UNAVIALABLE])}catch(e){return t(["get uri fail",ErrorCode$1.SERVICE_UNAVIALABLE])}})}saveImageToPhotosAlbum(v){return new Promise(async(o,e)=>{try{var t,a,r,s,i,n,c=v.filePath;if("string"!=typeof c)return e(["filePath format is not supported.",ErrorCode$1.PARAMETER_ERROR]);if(isFileUri(c))a=getFdFromUriOrSandBoxPath(t=c),r=fs.statSync(a).size,s=new ArrayBuffer(r),FileioBase.ohosReadSync(a,s),i=await getFileAssetFromUri(t),n="IMAGE_"+(new Date).getTime()+"_"+i.displayName,o({path:await saveMedia(photoAccessHelper.PhotoType.IMAGE,n,t,s)});else if(isSandboxPath(c)){let t=c;if(t.startsWith("internal://")&&(t=switchInternalToHapSandBox(c)),fs.accessSync(t)){var l=fs.openSync(t,fs.OpenMode.READ_ONLY);if(l){var d=l.fd,h=fs.statSync(t).size,u=new ArrayBuffer(h);FileioBase.ohosReadSync(d,u);let e="IMAGE_"+(new Date).getTime()+"_"+t.split("/").splice(-1,1).toString();e.includes(".")||(e+=".jpg"),t=fileuri.getUriFromPath(t),o({path:await saveMedia(photoAccessHelper.PhotoType.IMAGE,e,t,u)})}else e(["saveImageToPhotosAlbum fail, src not exist.",ErrorCode$1.PARAMETER_ERROR])}else e(["saveImageToPhotosAlbum fail, src not exist.",ErrorCode$1.PARAMETER_ERROR])}else{if(c.startsWith("data:image/")){var p=c.split(";");if(2===p.length&&p[1].startsWith("base64")){var f=p[0].replace("data:image/",""),A=gBase64.atob(c.split(",")[1]),g="IMAGE_"+(new Date).getTime()+"."+f,m=new ArrayBuffer(A.length),y=new Uint8Array(m);for(let e=0;e{let n=switchInternalToHapSandBox(p.src),c=0<=(n.split("/").pop()||"").indexOf(".")&&p.src.toLowerCase().split(".").pop()||"jpg",l=p.quality||80,t=await MediaLibraryBase.getPermissions();if(-1===t.perNum)return e(["permission fail",ErrorCode$1.USER_REJECT,t.perNum,t.dialogShownResults]);if(l&&"number"!=typeof l)return e(["compressImage fail, input parameter quality is illegal.",ErrorCode$1.PARAMETER_ERROR]);(100{console.info("AVPlayer seek succeeded, seek time is "+e),this.onSeekedCallback&&this.onSeekedCallback({})}),this.avPlayer.on("error",e=>{console.error(`Invoke avPlayer failed, code is ${e.code}, message is `+e.message),this.avPlayer.reset(),this.onErrorCallback&&this.onErrorCallback(e)}),this.avPlayer.on("stateChange",async(e,t)=>{switch(e){case"idle":console.info("AVPlayer state idle called."),this.stopFlag&&(this.avPlayer.url=this.tempSrc,this.stopFlag=!1);break;case"initialized":console.info("AVPlayerstate initialized called."),this.avPlayer.prepare().then(()=>{console.info("AVPlayer prepare succeeded."),this.onCanplayCallback&&this.onCanplayCallback({})},e=>{console.error(`Invoke prepare failed, code is ${e.code}, message is `+e.message)});break;case"prepared":console.info("AVPlayer state prepared called."),0===this.count&&this.autoplayS&&(this.avPlayer.play(),this.onPlayCallback&&this.onPlayCallback({}),this.startTimeS)&&(this.onSeekingCallback&&this.onSeekingCallback({}),this.avPlayer.seek(this.startTimeS)),this.count++,this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"playing":console.info("AVPlayer state playing called."),this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"paused":console.info("AVPlayer state paused called."),this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"completed":console.info("AVPlayer state completed called."),this.onEndedCallback&&this.onEndedCallback({}),this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"stopped":console.info("AVPlayer state stopped called."),this.avPlayer.reset(),this.stopFlag=!0;break;case"released":console.info("AVPlayer state released called.");break;default:console.info("AVPlayer state unknown called.")}}),this.avPlayer.on("timeUpdate",e=>{this.onTimeUpdateCallback&&this.onTimeUpdateCallback(e/1e3)}),this.avPlayer.on("bufferingUpdate",(e,t)=>{console.info(`[AdvancedAPI] avPlayer bufferingUpdate ${e} `+t),3===e&&0!==t&&(this.bufferedS=t,this.avPlayer.currentTime/1e3>=this.avPlayer.duration*t/1e5)&&this.onWaitingCallback&&this.onWaitingCallback({})}),this.avPlayer.on("audioInterrupt",e=>{console.info("[AdvancedAPI] audioInterrupt:"+JSON.stringify(e)),e.hintType===audio.InterruptHint.INTERRUPT_HINT_PAUSE&&(this.avPlayer.pause(),this.onPauseCallback)&&this.onPauseCallback({})}),this.avPlayer.on("endOfStream",()=>{console.info("[AdvancedAPI] rePlay:endOfStream success"),this.avPlayer.loop&&(this.avPlayer.play(),this.startTimeS)&&(this.onSeekingCallback&&this.onSeekingCallback({}),this.avPlayer.seek(this.startTimeS))})}get duration(){return this.avPlayer?this.avPlayer.duration/1e3:(console.error("[AdvancedAPI] avPlayer is not exist, get duration fail"),0)}get currentTime(){return this.avPlayer?this.avPlayer.currentTime/1e3:(console.error("[AdvancedAPI] avPlayer is not exist, get currentTime fail"),0)}get paused(){return this.avPlayer?this.avPlayer.state===StateType.PAUSED:(console.error("[AdvancedAPI] avPlayer is not exist, get paused fail"),!0)}get loop(){return this.tempLoop}set loop(e){"boolean"!=typeof e?console.error(`[AdvancedAPI] loop: ${e} is invalid`):(this.tempLoop=e,this.avPlayer&&[StateType.PREPARED,StateType.PLAYING,StateType.PAUSED,StateType.COMPLETED].includes(this.avPlayer.state)&&(console.info("current state is "+this.avPlayer.state+" can set loop"),this.avPlayer.loop=e))}get volume(){return this.volumeS}set volume(e){"number"!=typeof e?console.error(`[AdvancedAPI] volume: ${e} is invalid`):(this.volumeS=e,this.avPlayer&&[StateType.PREPARED,StateType.PLAYING,StateType.PAUSED,StateType.COMPLETED].includes(this.avPlayer.state)&&(console.info("current state is "+this.avPlayer.state+" can set volume"),this.avPlayer.setVolume(e)))}get autoplay(){return this.autoplayS}set autoplay(e){"boolean"!=typeof e?console.error(`[AdvancedAPI] autoplay: ${e} is invalid`):this.autoplayS=e}get startTime(){return this.startTimeS/1e3}set startTime(e){"number"!=typeof e?console.error(`[AdvancedAPI] startTIme: ${e} is invalid`):this.startTimeS=1e3*e}get src(){return this.avPlayer?this.avPlayer.url:(console.error("[AdvancedAPI] avPlayer is not exist, get src fail"),"")}set src(e){if("string"!=typeof e)console.error(`[AdvancedAPI] src: ${e} is invalid`);else if(this.avPlayer)if(e&&(e.startsWith("http:")||e.startsWith("https:")||e.startsWith("datashare:")||e.startsWith("internal://")))if(this.avPlayer.state!==StateType.IDLE)console.error("current state is "+this.avPlayer.state+" can not set url");else{let t;if(e.startsWith("http:")||e.startsWith("https:"))t=e;else if(e.startsWith("internal://"))try{var o=switchInternalToHapSandBox(e),a=fs.openSync(o,fs.OpenMode.READ_ONLY).fd;t="fd://"+a}catch(o){console.info(""+JSON.stringify(o))}else if(e.startsWith("datashare:"))try{var r=MediaLibraryBase.getMedia(),s=MediaLibraryBase.getFileKey(),i=MediaLibraryBase.getMediaType("AUDIO"),n={selections:s.MEDIA_TYPE+"= ?",selectionArgs:[i.toString()],uri:e};return void r.getFileAssets(n).then(e=>{e.getFirstObject().then(e=>{MediaLibraryBase.getFd(e).then(e=>{t="fd://"+e,this.avPlayer.url&&t!==this.avPlayer.url&&this.avPlayer.reset(),this.avPlayer.url=t})})})}catch(o){return void console.error(`[AdvancedAPI] src: ${e} is invalid`)}this.avPlayer.url&&t!==this.avPlayer.url&&this.avPlayer.reset(),this.avPlayer.url=t,this.tempSrc=t}else console.error(`[AdvancedAPI] src: ${e} is invalid`);else console.error("[AdvancedAPI] avPlayer is not exist, set src fail")}get buffered(){return this.avPlayer?this.avPlayer.duration*this.bufferedS/1e5:(console.error("[AdvancedAPI] avPlayer is not exist, get buffered fail"),0)}get playbackRate(){return this.playbackRateS}set playbackRate(e){"number"!=typeof e?console.error(`[AdvancedAPI] speed: ${e} is invalid`):(e=e<=.75?media.PlaybackSpeed.SPEED_FORWARD_0_75_X:.75t(["getVideoInfo is not support!"]))}saveVideoToPhotosAlbum(e){return new Promise(async(t,o)=>{var a,r,s,i=e.filePath;if("string"!=typeof i)return o(["filePath format is not supported.",ErrorCode$1.PARAMETER_ERROR]);if(console.debug("[AdvancedAPI] filePath:",i),isFileUri(i))r=getFdFromUriOrSandBoxPath(a=i),s=fs.statSync(r).size,s=new ArrayBuffer(s),FileioBase.ohosReadSync(r,s),r=await getFileAssetFromUri(a),r="VIDEO_"+(new Date).getTime()+"_"+r.displayName,t({path:await saveMedia(photoAccessHelper.PhotoType.VIDEO,r,a,s)});else{if(isSandboxPath(i)){let e=i;return e.startsWith("internal://")&&(e=switchInternalToHapSandBox(e)),fs.accessSync(e)&&(r=fs.openSync(e,fs.OpenMode.READ_ONLY))?(a=r.fd,s=fs.statSync(e).size,r=new ArrayBuffer(s),FileioBase.ohosReadSync(a,r),s="VIDEO_"+(new Date).getTime()+"_"+i.split("/").splice(-1,1).toString(),e=fileuri.getUriFromPath(e),void t({path:await saveMedia(photoAccessHelper.PhotoType.VIDEO,s,e,r)})):void o(["saveVideoToPhotosAlbum fail, src not exist.",ErrorCode$1.PARAMETER_ERROR])}o(["filePath format is not supported.",ErrorCode$1.PARAMETER_ERROR])}})}}let StateType$1={IDLE:"idle",PLAYING:"playing",PAUSED:"paused",STOPPED:"stopped",ERROR:"error"};function createAVSession(t){console.debug("[AdvancedAPI] createAVSession begin"),avSession.createAVSession(context,"player","audio").then(e=>{console.debug("[AdvancedAPI] createAVSession succeed"),t.avSession=e})}function destroyAVSession(e){console.debug("[AdvancedAPI] destroyAVSession begin"),null===e.avSession?console.debug("[AdvancedAPI] avSession is null"):e.avSession.destroy()}function startBackgroundTask(){AbilityBase.getAbilityInfo().then(e=>{e={wants:[{bundleName:e.bundleName,abilityName:e.name}],operationType:wantAgent.OperationType.START_ABILITY,requestCode:0,wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]},wantAgent.getWantAgent(e).then(e=>backgroundTaskManager.startBackgroundRunning(context,backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,e)).then(()=>{console.debug("[AdvancedAPI] start bg operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] start bg operation failed Cause: "+e)})})}function stopBackgroundTask(){backgroundTaskManager.stopBackgroundRunning(context).then(()=>{console.debug("[AdvancedAPI] stop operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] stop operation fail cause: "+JSON.stringify(e))})}class ASBGAudio{constructor(){this.backgroundAudioManager=new BackgroundAudioManager}}class BackgroundAudioManager{constructor(){this.bufferedS=0,this.avSession=null,this.startTimeS=0,this.onWaitingCallback=null,this.titleS=null,this.epnameS=null,this.singerS=null,this.coverImgUrlS=null,this.webUrlS=null,this.protocolS="http",this.onFinishCallback=null,this.tempSrc="",this.onCanplayCallback=null,this.onPlayCallback=null,this.onPauseCallback=null,this.onStopCallback=null,this.onTimeUpdateCallback=null,this.onErrorCallback=null,this.init()}init(){this.audioPlayer=media.createAudioPlayer(),this.audioPlayer.on("finish",()=>{destroyAVSession(this),stopBackgroundTask(),this.onFinishCallback&&this.onFinishCallback({})}),this.audioPlayer.on("dataLoad",()=>{this.onCanplayCallback&&this.onCanplayCallback({})}),this.audioPlayer.on("bufferingUpdate",(e,t)=>{console.info(`[AdvancedAPI] bgAudio bufferingUpdate ${e} `+t),3===e&&0!==t&&(this.bufferedS=t,this.audioPlayer.currentTime/1e3>=this.audioPlayer.duration*t/1e5)&&this.onWaitingCallback&&this.onWaitingCallback({})}),this.audioPlayer.on("audioInterrupt",e=>{console.info("[AdvancedAPI] audioInterrupt:"+JSON.stringify(e)),e.hintType===audio.InterruptHint.INTERRUPT_HINT_PAUSE&&this.audioPlayer.pause(),e.hintType===audio.InterruptHint.INTERRUPT_HINT_RESUME&&this.audioPlayer.play()}),this.audioPlayer.on("play",()=>{this.onPlayCallback&&this.onPlayCallback({})}),this.audioPlayer.on("pause",()=>{this.onPauseCallback&&this.onPauseCallback({})}),this.audioPlayer.on("timeUpdate",e=>{this.onTimeUpdateCallback&&this.onTimeUpdateCallback(e/1e3)}),this.audioPlayer.on("error",e=>{this.onErrorCallback&&this.onErrorCallback(e)})}get duration(){return this.audioPlayer.duration/1e3}get currentTime(){return this.audioPlayer.currentTime/1e3}get paused(){return this.audioPlayer.state===StateType$1.PAUSED}get src(){return this.audioPlayer.src}set src(t){if("string"!=typeof t)console.error(`[AdvancedAPI] src: ${t} is invalid`);else if(t&&(t.startsWith("http:")||t.startsWith("https:")||isFileUri(t)||isSandboxPath(t))){let e;if(t.startsWith("http:")||t.startsWith("https:"))e=t;else if(isFileUri(t)||isSandboxPath(t))try{var o=getFdFromUriOrSandBoxPath(t);e="fd://"+o}catch(e){console.info(""+JSON.stringify(e))}this.audioPlayer.src&&e!==this.audioPlayer.src&&this.audioPlayer.reset(),this.audioPlayer.src=e,this.tempSrc=t,this.audioPlayer.play(),this.startTimeS&&this.audioPlayer.seek(this.startTimeS),startBackgroundTask(),createAVSession(this)}else console.error(`[AdvancedAPI] src: ${t} is invalid`)}get startTime(){return this.startTimeS/1e3}set startTime(e){this.startTimeS=1e3*e}get buffered(){return this.audioPlayer.duration*this.bufferedS/1e5}get title(){return this.titleS}set title(e){this.titleS=e}get epname(){return this.epnameS}set epname(e){this.epnameS=e}get singer(){return this.singerS}set singer(e){this.singerS=e}get coverImgUrl(){return this.coverImgUrlS}set coverImgUrl(e){this.coverImgUrlS=e}get webUrl(){return this.webUrlS}set webUrl(e){this.webUrlS=e}get protocol(){return this.protocolS}set protocol(e){this.protocolS=e}play(){var e=this.audioPlayer.state;[StateType$1.PAUSED,StateType$1.STOPPED,StateType$1.IDLE].includes(e)&&(this.tempSrc&&""===this.audioPlayer.src&&(this.src=this.tempSrc),this.audioPlayer.play(),startBackgroundTask(),createAVSession(this))}pause(){var e=this.audioPlayer.state;StateType$1.PLAYING===e&&this.audioPlayer.pause()}stop(){var e=this.audioPlayer.state;[StateType$1.PAUSED,StateType$1.PLAYING].includes(e)&&(this.audioPlayer.stop(),this.onStopCallback&&this.onStopCallback({}),this.audioPlayer.release(),this.init(),destroyAVSession(this),stopBackgroundTask())}seek(e){var t=this.audioPlayer.state;[StateType$1.PAUSED,StateType$1.PLAYING].includes(t)&&this.audioPlayer.seek(1e3*e)}onCanplay(e){this.onCanplayCallback=e}onPlay(e){this.onPlayCallback=e}onPause(e){this.onPauseCallback=e}onStop(e){this.onStopCallback=e}onEnded(e){this.onFinishCallback=e}onTimeUpdate(e){this.onTimeUpdateCallback=e}onError(e){this.onErrorCallback=e}onPrev(e){console.info("ios only")}onNext(e){console.info("ios only")}onWaiting(e){this.onWaitingCallback=e}}class SecurityBase{static rsa(a,r){return new Promise(async(e,t)=>{var o;try{await(o=cryptoFramework.createMd(a)).update(r),e((await o.digest()).data)}catch(e){console.error("[QAFAPI]: rsa fail error code: "+e.code+", message is: "+e.message),t(e)}})}}class FileCallback{constructor({success:e,fail:t,complete:o}){checkDataType(e,!1,"function")&&(this.successFn=e),checkDataType(t,!1,"function")&&(this.failFn=t),checkDataType(o,!1,"function")&&(this.completeFn=o)}success(...e){if(this.successFn)try{this.successFn(...e)}catch(e){console.error(e)}if(this.completeFn)try{this.completeFn(...e)}catch(e){console.error(e)}}fail(...e){if(this.failFn)try{this.failFn(...e)}catch(e){console.error(e)}if(this.completeFn)try{this.completeFn(...e)}catch(e){console.error(e)}}}let openMode=fs.OpenMode,ERROR={PARAMETER_ERROR:1001},modeReflect={ax:"a","ax+":"a+",wx:"w","wx+":"w+"},ENCODING=["utf8","utf-8","ascii","base64","binary","hex","ucs2","ucs-2","utf16le","utf-16le","latin1"];function getOpenMode(e){let t;switch(e){case"a":t=openMode.CREATE|openMode.APPEND;break;case"a+":t=openMode.CREATE|openMode.READ_WRITE|openMode.APPEND;break;case"as":t=openMode.SYNC|openMode.CREATE|openMode.APPEND;break;case"as+":t=openMode.SYNC|openMode.CREATE|openMode.READ_WRITE|openMode.APPEND;break;case"r":t=openMode.READ_ONLY;break;case"r+":t=openMode.READ_WRITE;break;case"w":t=openMode.CREATE|openMode.WRITE_ONLY|openMode.TRUNC;break;case"w+":t=openMode.CREATE|openMode.READ_WRIT|openMode.TRUNC}return t}function getFileTypeMode(e){return e.isBlockDevice()?24576:e.isCharacterDevice()?8192:e.isDirectory()?16384:e.isFIFO()?4096:e.isFile()?32768:e.isSocket()?49152:e.isSymbolicLink()?40960:void 0}function mkdirRecursive(e,t){var o=t.shift();e=e||o?e+"/"+o:"",o&&!fs.accessSync(e)&&fs.mkdirSync(e),0{e?(console.debug("[AdvancedAPI] file access exist"),r.success({errMsg:"access:ok"})):r.fail({errMsg:"access:fail no such file or directory"})},e=>{console.debug("[AdvancedAPI] access failed with error message: %s, code = %d",e.message,e.code)}):r.fail({errMsg:"access:fail parameter error: parameter.path should be String",errno:ERROR$1.PARAMETER_ERROR})}accessSync(e){if(!checkDataType(e,!0,"string"))throw new Error("accessSync:fail path must be a string");if(!fs.accessSync(e))throw new Error("accessSync:fail no such file or directory")}appendFile({filePath:e,data:o,encoding:t=DEFAULT_ENCODING,success:a,fail:r,complete:s}){let i=new FileCallback({success:a,fail:r,complete:s});if(checkDataType(e,!0,"string"))if(checkDataType(o,!0,["string","arraybuffer"]))if(fs.accessSync(e)){let t=fs.openSync(e,fs.OpenMode.READ_WRITE|fs.OpenMode.APPEND);fs.write(t.fd,o).then(e=>{i.success({errMsg:"appendFile:ok"}),fs.closeSync(t)}).catch(e=>{console.error("[AdvancedAPI] appendFile failed with error message: "+e.message+", error code: "+e.code),i.fail({errMsg:"appendFile:fail "+e.message})})}else i.fail({errMsg:`appendFile:fail no such file or directory, open "${e}"`});else i.fail({errMsg:"access:fail parameter error: parameter.data should be String/ArrayBuffer",errno:ERROR$1.PARAMETER_ERROR});else i.fail({errMsg:"access:fail parameter error: parameter.filePath should be String",errno:ERROR$1.PARAMETER_ERROR})}appendFileSync(e,t,o=DEFAULT_ENCODING){if(!checkDataType(e,!0,"string"))throw new Error("access:fail parameter error: parameter.filePath should be String");if(!checkDataType(t,!0,["string","arraybuffer"]))throw new Error("access:fail parameter error: parameter.data should be String/ArrayBuffer");if(!fs.accessSync(e))throw new Error(`appendFile:fail no such file or directory, open "${e}"`);e=fs.openSync(e,fs.OpenMode.READ_WRITE|fs.OpenMode.APPEND),fs.writeSync(e.fd,t)}open({filePath:e,flag:t=DEFAULT_FLAG,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});if(checkDataType(e,!0,"string")){if(FLAG.includes(t)||(t=DEFAULT_FLAG),Object.keys(modeReflect).includes(t)){if(fs.accessSync(e))return void s.fail({errMsg:"open:fail EXIST: file already exists"});console.debug("[AdvancedAPI] access fail"),t=modeReflect[t]}fs.open(e,getOpenMode(t),(e,t)=>{e?(console.error("[AdvancedAPI] open failed with error message: "+e.message+", error code: "+e.code),s.fail({errMsg:"open:fail "+e.message,errno:ERROR$1.NO_SUCH_FILE_OR_DIRECTORY})):s.success({fd:t.fd.toString(),errMsg:"open:ok"})})}else s.fail({errMsg:"open:fail parameter error: parameter.filePath should be String",errno:ERROR$1.PARAMETER_ERROR})}openSync({filePath:e,flag:t}){if(!checkDataType(e,!0,"string"))throw new Error("openSync:fail parameter error: parameter.filePath should be String");if(FLAG.includes(t)||(t=DEFAULT_FLAG),Object.keys(modeReflect).includes(t)){if(fs.accessSync(e))throw new Error("openSync:fail EXIST: file already exists");console.debug("[AdvancedAPI] access fail"),t=modeReflect[t]}return fs.openSync(e,getOpenMode(t)).fd.toString()}close({fd:e,success:t,fail:o,complete:a}){let r=new FileCallback({success:t,fail:o,complete:a});""!==e&&checkDataType(e,!0,"string")?(e=Number(e),isNaN(e)?r.fail({errMsg:"close:fail bad file descriptor"}):fs.close(e,e=>{e?r.fail({errMsg:"close:fail bad file descriptor"}):r.success({errMsg:"close:ok"})})):r.fail({errMsg:"close:fail invalid fd",errno:ERROR$1.PARAMETER_ERROR})}closeSync({fd:e}){if(""===e||!checkDataType(e,!0,"string"))throw new Error("closeSync:fail invalid fd");if(e=Number(e),isNaN(e))throw new Error("closeSync:fail invalid fd");fs.closeSync(e)}copyFile({srcPath:e,destPath:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});if((o=checkPathExistence("copyFile","srcPath",e)).isValid)if((a=checkPath("copyFile","destPath",t)).isValid)if(fs.statSync(e).isDirectory())s.fail({errMsg:"copyFile: fail illegal operation on a directory, open: "+e});else{if(fs.accessSync(t)){if((r=fs.statSync(t)).isDirectory())t+=obtainFileName(e).fileName;else if(r.isFile()&&e!==t)return void s.fail({errMsg:"copyFile: fail copyFile failed"})}else if(r=obtainUpperPath(t),!fs.accessSync(r.upperPath))return void s.fail({errMsg:"copyFile: fail no such file or directory, open: "+t});fs.copyFile(e,t).then(()=>{s.success({errMsg:"copyFile: ok"})}).catch(e=>{s.fail({errMsg:`copyFile: failed with error message: ${e.message}, error code: `+e.code})})}else s.fail(a.checkMsg);else s.fail(o.checkMsg)}copyFileSync(e,t){var o=checkPathExistenceSync("copyFileSync","srcPath",e);if(!o.isValid)throw new Error(o.errMsg);if(!(o=checkPathSync("copyFileSync","destPath",t)).isValid)throw new Error(o.errMsg);if(fs.statSync(e).isDirectory())throw new Error("copyFileSync: fail illegal operation on a directory: "+e);if(fs.accessSync(t)){if((o=fs.statSync(t)).isDirectory()){var a=t.lastIndexOf("/");let e=t.substring(a);t.endsWith("/")&&(e=t.substring(t.lastIndexOf("/",t.length-2)+1,t.length-1)),t+=e}else if(o.isFile()&&e!==t)throw new Error("copyFileSync: fail copyFile failed")}else if(a=obtainUpperPath(t),!fs.accessSync(a.upperPath))throw new Error("copyFileSync: fail no such file or directory: "+t);try{fs.copyFileSync(e,t)}catch(e){throw new Error("copyFileSync: "+e.message)}}fstat({fd:e,success:t,fail:o,complete:a}){let r=new FileCallback({success:t,fail:o,complete:a});(t=checkFd("fstat",e)).isValid?(e=t.fd,fs.stat(e,(e,t)=>{e?r.fail({errMsg:`fstat: failed with error message: ${e.message}, error code: `+e.code}):(e=getFileTypeMode(t)|t.mode,r.success({stat:{mode:e,size:t.size,lastAccessedTime:t.atime,lastModifiedTime:t.mtime,isDirectory:()=>t.isDirectory(),isFile:()=>t.isFile()},errMsg:"fstat: ok"}))})):r.fail(t.checkMsg)}fstatSync({fd:t}){var e=checkFdSync("fstatSync",t);if(!e.isValid)throw new Error(e.errMsg);t=e.fd;try{let e=fs.statSync(t);return{stat:{mode:getFileTypeMode(e)|e.mode,size:e.size,lastAccessedTime:e.atime,lastModifiedTime:e.mtime,isDirectory:()=>e.isDirectory(),isFile:()=>e.isFile()}}}catch(e){throw new Error("fstatSync: "+e.message)}}ftruncate({fd:e,length:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});(o=checkFd("ftruncate",e)).isValid?(e=o.fd,(!checkDataType(t,!0,"number")||t<0)&&(t=DEFAULT_LENGTH),fs.truncate(e,t).then(()=>{s.success({errMsg:"ftruncate: ok"})}).catch(e=>{s.fail({errMsg:`ftruncate: failed with error message: ${e.message}, error code: `+e.code})})):s.fail(o.checkMsg)}ftruncateSync({fd:e,length:t}){var o=checkFdSync("ftruncateSync",e);if(!o.isValid)throw new Error(o.errMsg);e=o.fd,(!checkDataType(t,!0,"number")||t<0)&&(t=DEFAULT_LENGTH);try{fs.truncateSync(e,t)}catch(e){throw new Error("ftruncateSync: "+e.message)}}mkdir({dirPath:e,recursive:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});checkDataType(t,!1,"boolean")||(t=Boolean(t)),(o=checkPath("mkdir","dirPath",e)).isValid?fs.accessSync(e)?s.fail({errMsg:"mkdir: dirPath already exists: "+e}):t?(mkdirRecursive("",e.split("/")),s.success({errMsg:"mkdir: ok"})):(a=obtainUpperPath(e),fs.accessSync(a.upperPath)?fs.mkdir(e).then(()=>{s.success({errMsg:"mkdir: ok"})}).catch(e=>{s.fail({errMsg:`mkdir: failed with error message: ${e.message}, error code: `+e.code})}):s.fail({errMsg:"mkdir: failed"})):s.fail(o.checkMsg)}mkdirSync(e,t){checkDataType(t,!1,"boolean")||(t=Boolean(t));var o=checkPathSync("mkdirSync","dirPath",e);if(!o.isValid)throw new Error(o.errMsg);if(fs.accessSync(e))throw new Error("mkdirSync: dirPath already exists: "+e);if(!t&&!fs.accessSync(obtainUpperPath(e).upperPath))throw new Error("mkdirSync: fail, recursive is false and upper path does not exist");if(t)try{mkdirRecursive("",e.split("/"))}catch(e){throw new Error("mkdirSync: "+e.message)}else try{fs.mkdirSync(e)}catch(e){throw new Error("mkdirSync: "+e.message)}}read({fd:e,arrayBuffer:r,offset:t=DEFAULT_OFFSET,length:s,position:i,success:o,fail:a,complete:n}){let c=new FileCallback({success:o,fail:a,complete:n});if(!checkDataType(e,!0,"string")||""===e||isNaN(Number(e)))c.fail({errMsg:"read: fail invalid fd"});else if(e=Number(e),checkDataType(r,!0,"arraybuffer"))if((!checkDataType(t,!1,"number")||t<0)&&(t=Number(t),isNaN(t)||t<0)&&(t=DEFAULT_OFFSET),(!checkDataType(s,!1,"number")||s<0)&&(s=Number(s),isNaN(s)||s<0)&&(s=DEFAULT_LENGTH),(o=r.byteLength-t){var t=new Uint8Array(a);new Uint8Array(r).set(t,o),console.debug("[AdvancedAPI] the content of arrayBuffer: %s",String.fromCharCode.apply(null,new Uint8Array(a.slice(0,e)))),c.success({bytesRead:e,arrayBuffer:r,errMsg:"read: ok"})}).catch(e=>{c.fail({errMsg:`read: failed with error message: ${e.message},error code: `+e.code})})}else c.fail({errMsg:"read: fail invalid arrayBuffer: "+r})}readSync({fd:e,arrayBuffer:t,offset:o,length:a,position:r}){if(!checkDataType(e,!0,"string")||""===e||isNaN(Number(e)))throw new Error("readSync:fail invalid fd");if(e=Number(e),!checkDataType(t,!0,"arraybuffer"))throw new Error("readSync: fail invalid arrayBuffer");(!checkDataType(o,!1,"number")||o<0)&&(o=Number(o),isNaN(o)||o<0)&&(o=DEFAULT_OFFSET),(!checkDataType(a,!1,"number")||a<0)&&(a=Number(a),isNaN(a)||a<0)&&(a=DEFAULT_LENGTH);var s=t.byteLength-o;if(s{r.success({files:e,errMsg:"readdir: ok"})}).catch(e=>{r.fail({errMsg:`readdir: failed with error message: ${e.message}, error code: `+e.code})}):r.fail(t.checkMsg)}readdirSync(e){var t=checkPathExistence("readdirSync","dirPath",e);if(!t.isValid)throw new Error(t.errMsg);if(fs.statSync(e).isFile())throw new Error("readdirSync: fail not a directory: ${dirPath}");try{return{files:fs.listFileSync(e)}}catch(e){throw new Error("readdirSync: "+e.message)}}readFile({filePath:o,encoding:a,position:r=DEFAULT_POSITION,length:s,success:e,fail:t,complete:i}){o=isSandboxPath(o)?switchInternalToHapSandBox(o):o;let n=new FileCallback({success:e,fail:t,complete:i});if((e=checkPathExistence("readFile","filePath",o)).isValid)if((t=fs.statSync(o)).isDirectory())n.fail({errMsg:"readFile:fail not absolute path: "+o});else if((i=checkEncoding("readFile",a)).isValid)if(t=t.size,s=null==s?t:s,checkDataType(r,!1,"number"))if(checkDataType(s,!1,"number"))if(r<0||t{var e=a?buffer.from(t).toString(a):t;n.success({data:e,errMsg:"readFile:ok"})}).catch(e=>{n.fail({errMsg:`readFile:fail error message: ${e.message}, error code: `+e.code})}).finally(()=>{fs.closeSync(e)})}else n.fail({errMsg:"readFile:fail invalid length: "+s});else n.fail({errMsg:"readFile:fail invalid position: "+r});else n.fail({errMsg:i.checkMsg});else n.fail(e.checkMsg)}readFileSync(e,t,o=DEFAULT_POSITION,a){var r=checkPathExistenceSync("readFileSync","filePath",e=isSandboxPath(e)?switchInternalToHapSandBox(e):e);if(!r.isValid)throw new Error(r.errMsg);if((r=fs.statSync(e)).isDirectory())throw new Error("readFileSync:fail illegal operation on a directory, open: "+e);var s=checkEncoding("readFile",t);if(!s.isValid)throw new Error(s.checkMsg);if(s=r.size,a=null==a?s:a,!checkDataType(o,!1,"number"))throw new Error("readFileSync:fail invalid position: "+o);if(!checkDataType(a,!1,"number"))throw new Error("readFileSync:fail invalid length: "+a);if(o<0||s{s.success({errMsg:"rename: ok"})}).catch(e=>{s.fail({errMsg:`rename: failedwith error message: ${e.message}, error code: `+e.code})})}else s.fail(a.checkMsg);else s.fail(o.checkMsg)}renameSync(e,t){var o=checkPathExistenceSync("renameSync","oldPath",e);if(!o.isValid)throw new Error(o.errMsg);if(!(o=checkPathSync("renameSync","newPath",t)).isValid)throw new Error(o.errMsg);if(!(o=fs.accessSync(t))&&!fs.accessSync(obtainUpperPath(t).upperPath))throw new Error("renameSync: fail no such file or directory, open: "+t);if(o&&e!==t)throw new Error("renameSync: fail");try{fs.renameSync(e,t)}catch(e){throw new Error("renameSync: "+e.message)}}rmdir({dirPath:e,recursive:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});checkDataType(t,!1,"boolean")||(t=Boolean(t)),(o=checkPathExistence("rmdir","dirPath",e)).isValid?fs.statSync(e).isDirectory()?!t&&fs.listFileSync(e).length?s.fail({errMsg:"rmdir: fail directory not empty"}):fs.rmdir(e).then(()=>{console.debug("[AdvanceAPI] rmdir succeed"),s.success({errMsg:"rmdir: ok"})}).catch(e=>{console.error(`[AdvanceAPI] rmdir failed with error message: ${e.message}, error code: `+e.code),s.fail({errMsg:"rmdir: failed"})}):s.fail({errMsg:"rmdir: fail no such directory, open: "+e}):s.fail(o.checkMsg)}rmdirSync(e,t){checkDataType(t,!1,"boolean")||(t=Boolean(t));var o=checkPathExistenceSync("rmdirSync","dirPath",e);if(!o.isValid)throw new Error(o.errMsg);if(!fs.statSync(e).isDirectory())throw new Error("rmdirSync: fail no such directory, open: "+e);if(!t&&0{console.debug("[AdvancedAPI] truncate: success, the read length is: %d",t),s.success({errMsg:"truncate: ok"})}).catch(e=>{console.error(`[AdvancedAPI] truncate: fail with error message: ${e.message}, error code: `+e.code),s.fail({errMsg:`truncate: failed with error message: ${e.message}, error code: `+e.code})})):s.fail(o.checkMsg)}truncateSync({filePath:e,length:t}){var o=checkPathExistenceSync("truncateSync","filePath",e);if(!o.isValid)throw new Error(o.errMsg);if(fs.statSync(e).isDirectory())throw new Error("truncateSync: fail, illegal operation on a directory, open: "+e);(!checkDataType(t,!0,"number")||t<0)&&(t=DEFAULT_LENGTH);try{fs.truncateSync(e,t)}catch(e){throw new Error("truncateSync: "+e.message)}}getFileInfo({filePath:e,success:t,fail:o,complete:a}){t=new FileCallback({success:t,fail:o,complete:a}),(e=isSandboxPath(e)?switchInternalToHapSandBox(e):e)&&checkDataType(e,!0,"string")?fs.accessSync(e)?(o=fs.statSync(e),t.success({size:o.size,errMsg:"getFileInfo:ok "})):t.fail({errMsg:"getFileInfo: fail no such file or directory : "+e}):t.fail({errMsg:"getFileInfo:fail invalid filePath "})}}class ASFile{constructor(){this.DIGESTALGORITHM_VALUES=["MD5","SHA1"],this.saveFileDir=context.filesDir+"/saveFiles",this.fileSystemManager=new FileSystemManager,this.init()}init(){try{FileioBase.ohosMkdirSync(this.saveFileDir)}catch(e){console.debug("[AdvancedAPI] %s 已存在",this.saveFileDir)}}saveFile(e){return new Promise(async(s,i)=>{var n=e.tempFilePath;if(n)try{let e=n.substr(n.lastIndexOf("/")),t=e&&e.split(".").pop(),o=(new Date).getTime(),a=(t&&(o+="."+t),getFdFromUriOrSandBoxPath(isSandboxPath(n)?fileuri.getUriFromPath(switchInternalToHapSandBox(n)):n)),r=this.saveFileDir+"/"+o;FileioBase.ohosCopy(a,r).then(()=>{console.debug("[AdvancedAPI] saveFile succeed"),s({savedFilePath:r})}).catch(e=>{console.error("[AdvancedAPI] saveFile failed with error message: "+e.message+", error code: "+e.code),i([e.message,ErrorCode$1.IO_ERROR])})}catch(e){console.error("[AdvancedAPI] tempFilePath does not exist"),i(["tempFilePath does not exist",ErrorCode$1.PARAMETER_ERROR])}else console.error("[AdvancedAPI] invalid tempFilePath."),i(["tempFilePath is required.",ErrorCode$1.PARAMETER_ERROR])})}getSavedFileList(){return new Promise((e,t)=>{var o=[],a=FileioBase.ohosOpendirSync(this.saveFileDir).ohosReadsync();for(let e=0;e{var o=a.filePath;o?(o=getFdFromUriOrSandBoxPath(isSandboxPath(o)?fileuri.getUriFromPath(switchInternalToHapSandBox(o)):o),e({createTime:(e=FileioBase.ohosStatSync(o)).mtime,size:e.size,errMsg:"getSavedFileInfo:ok"})):(console.error("[AdvancedAPI] filePath is required."),t(["filePath is required",ErrorCode$1.PARAMETER_ERROR]))})}removeSavedFile(r){return new Promise((e,t)=>{var o=r.filePath;if(o)try{var a=isSandboxPath(o)?switchInternalToHapSandBox(o):o;FileioBase.ohosUnlinkSync(a),e("success")}catch(e){t(["removeSavedFile is fail",ErrorCode$1.IO_ERROR])}else console.error("[AdvancedAPI] filePath is required."),t(["filePath is required",ErrorCode$1.PARAMETER_ERROR])})}getFileInfo(t){return new Promise((r,e)=>{let s=t.filePath,{digestAlgorithm:i="MD5"}=t;if(s){"string"==typeof i&&(i=i.toUpperCase()),this.DIGESTALGORITHM_VALUES.includes(i)||(console.error("[AdvancedAPI] digestAlgorithm is invalid."),i="MD5");try{let e=isSandboxPath(s)?fileuri.getUriFromPath(switchInternalToHapSandBox(s)):s,t=FileioBase.ohosOpenSync(e,2).fd,o=FileioBase.ohosStatSync(t),a=new ArrayBuffer(o.size);FileioBase.ohosReadSync(t,a),SecurityBase.rsa(i,{data:new Uint8Array(a)}).then(e=>{var t=new util.TextDecoder("utf-8",{ignoreBOM:!0});r({size:o.size,digest:t.decodeWithStream(e,{stream:!1})})})}catch(s){console.error("[AdvancedAPI] getFileInfo fail err = "+JSON.stringify(s)),e(["getFileInfo is fail",ErrorCode$1.IO_ERROR])}}else console.error("[AdvancedAPI] filePath is required."),e(["filePath is required",ErrorCode$1.PARAMETER_ERROR])})}openDocument(a){return new Promise((e,t)=>{var{showMenu:o=!1}=a;o&&console.error("[AdvancedAPI] showMenu do not support.")})}getFileSystemManager(){return this.fileSystemManager}}let name=settings.display.SCREEN_BRIGHTNESS_STATUS;class BrightnessBase{static ohoGetValue(){try{var e=settings.getValueSync(context,name,"1");return console.log("[AdvancedAPI] success to get brightness. value:"+e),Math.round(2.55*e),e}catch(e){console.log("[QAFAPI] Failed to get brightness. Cause:"+JSON.stringify(e))}}}_dec$2=jsMethod({alias:"getValue",common:!1,callback:!0}),_dec2$2=jsMethod({alias:"setValue",common:!1,callback:!0}),_dec3$1=jsMethod({alias:"setKeepScreenOn",common:!1,callback:!0}),_applyDecoratedDescriptor((_class$2=class{getValue(){return new Promise((o,t)=>{try{window.getLastWindow(context).then(e=>{let t=e.getWindowProperties().brightness;(!t||t<0)&&(t=Number(BrightnessBase.ohoGetValue())/255),e={value:Math.round(255*t)},console.debug("[QAFAPI] getValue success, brightness = "+JSON.stringify(e)),o([e])})}catch(e){t([["Failed to get brightness"]]),console.error("Failed to obtain the window properties. Cause: "+JSON.stringify(e))}})}setValue(e){return new Promise((o,a)=>{var r,s=e.value;if(s||0===s)if(isNumber(r=s)){let e=Math.floor(r),t=(e<0?e=1:255{e.setWindowBrightness(t,e=>{e.code?(a([["setWindowBrightness fail"]]),console.error("[QAFAPI] Failed to set the brightness. Cause: "+JSON.stringify(e))):(o("successed to set"),console.info("[QAFAPI] Succeeded in setting the brightness."))})})}catch(s){console.error("[QAFAPI] Failed to set setting of brightness. Cause:"+JSON.stringify(s)),a([["setWindowBrightness fail"]])}}else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]]);else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]])})}setKeepScreenOn(e){return new Promise((o,a)=>{if(e&&""!==e.keepScreenOn&&null!==e.keepScreenOn){let t=e.keepScreenOn;if("boolean"==typeof t)try{window.getLastWindow(context).then(e=>{e.setWindowKeepScreenOn(t,e=>{e.code?(console.error("[QAFAPI] Failed to set the screen to be always on. Cause: "+JSON.stringify(e)),a([["handling failed"]])):(o(["handling success"]),console.info("[QAFAPI] Succeeded in setting the screen to be always on."))})})}catch(e){console.error("[QAFAPI] Failed to set the screen to be always on. exception: "+JSON.stringify(e)),a([["handling failed"]])}else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]])}else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]])})}}).prototype,"getValue",[_dec$2],Object.getOwnPropertyDescriptor(_class$2.prototype,"getValue"),_class$2.prototype),_applyDecoratedDescriptor(_class$2.prototype,"setValue",[_dec2$2],Object.getOwnPropertyDescriptor(_class$2.prototype,"setValue"),_class$2.prototype),_applyDecoratedDescriptor(_class$2.prototype,"setKeepScreenOn",[_dec3$1],Object.getOwnPropertyDescriptor(_class$2.prototype,"setKeepScreenOn"),_class$2.prototype);let BrightnessBaseModule=_class$2;class ASBrightness extends BrightnessBaseModule{setScreenBrightness(e){if(console.info("[AdvancedAPI] params = "+JSON.stringify(e)),e&&void 0!==e.value&&"number"==typeof e.value){var t=e.value;if(t<=1&&0<=t)return this.setValue({value:Math.round(255*e.value)})}return new Promise((e,t)=>{t(["param is invalid.",ErrorCode$1.PARAMETER_ERROR])})}getScreenBrightness(){return this.getValue()}asSetKeepScreenOn(e){return this.setKeepScreenOn(e)}}class ASInterceptor{constructor(){this.apiLists={},this.globals=[]}checkApiName(e){return"addInterceptor"!==e&&"removeInterceptor"!==e}invoke(e,t){this.globals.forEach(e=>{"function"==typeof(e=e.invoke)&&e(...t)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.invoke)&&e(...t)})}success(e,o){let a=[];if(this.globals.forEach(e=>{"function"==typeof(e=e.success)&&a.push(e)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.success)&&a.push(e)}),a.length){let t=o&&JSON.parse(JSON.stringify(o));return a.forEach(e=>{e(...t)}),t}}fail(e,o){let a=[];if(this.globals.forEach(e=>{"function"==typeof(e=e.fail)&&a.push(e)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.fail)&&a.push(e)}),a.length){let t=o&&JSON.parse(JSON.stringify(o));return a.forEach(e=>{e(...t)}),t}}complete(e,o){let a=[];if(this.globals.forEach(e=>{"function"==typeof(e=e.complete)&&a.push(e)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.complete)&&a.push(e)}),a.length){let t=o&&JSON.parse(JSON.stringify(o));return a.forEach(e=>{e(...t)}),t}}returnValue(e,t){this.globals.forEach(e=>{"function"==typeof(e=e.returnValue)&&e(t)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.returnValue)&&e(t)})}}let SCAN_TYPE_AS_TO_HM={barCode:null==scanCore?void 0:scanCore.ScanType.ONE_D_CODE,qrCode:null==scanCore?void 0:scanCore.ScanType.TWO_D_CODE,datamatrix:null==scanCore?void 0:scanCore.ScanType.DATAMATRIX_CODE,pdf417:null==scanCore?void 0:scanCore.ScanType.PDF417_CODE};class ASScan{scanCode(i={}){return new Promise((t,o)=>{var{onlyFromCamera:e=!1,hideAlbum:a=!1,scanType:r=[]}=i,s=[];for(let e=0;e{t({result:e.originalValue,scanType:this.scanTypeHmToAs(e.scanType),rawData:gBase64.btoa(e.originalValue),charSet:"utf-8"})}).catch(e=>{o(["scanCode fail!",ErrorCode$1.COMMON_ERROR])})}catch(e){o(["scanCode fail!",ErrorCode$1.COMMON_ERROR])}}else o(["Parameter hideAlbum invalid!",ErrorCode$1.PARAMETER_ERROR]);else o(["Parameter onlyFromCamera invalid!",ErrorCode$1.PARAMETER_ERROR])})}scanTypeHmToAs(e){let t="UNKNOWN";switch(e){case scanCore.ScanType.DATAMATRIX_CODE:t="DATA_MATRIX";break;case scanCore.ScanType.PDF417_CODE:t="PDF_417";break;case scanCore.ScanType.AZTEC_CODE:t="AZTEC";break;case scanCore.ScanType.CODABAR_CODE:t="CODABAR";break;case scanCore.ScanType.CODE39_CODE:t="CODE_39";break;case scanCore.ScanType.CODE93_CODE:t="CODE_93";break;case scanCore.ScanType.CODE128_CODE:t="CODE_128";break;case scanCore.ScanType.EAN8_CODE:t="EAN_8";break;case scanCore.ScanType.EAN13_CODE:t="EAN_13";break;case scanCore.ScanType.ITF14_CODE:t="ITF";break;case scanCore.ScanType.QR_CODE:t="QR_CODE";break;case scanCore.ScanType.UPC_A_CODE:t="UPC_A";break;case scanCore.ScanType.UPC_E_CODE:t="UPC_E";break;case scanCore.ScanType.MULTIFUNCTIONAL_CODE:t="MULTIFUNCTIONAL";break;case scanCore.ScanType.ONE_D_CODE:t="CODABAR";break;case scanCore.ScanType.TWO_D_CODE:t="QR_CODE"}return t}}let asModulesMap=new Map,moduleInstance=(asModulesMap.set("ASDevice",ASDevice),asModulesMap.set("ASLocation",ASLocation),asModulesMap.set("ASPhone",ASPhone),asModulesMap.set("ASRequest",ASRequest),asModulesMap.set("ASRouter",ASRouter),asModulesMap.set("ASBluetooth",ASBluetooth),asModulesMap.set("ASWifi",ASWifi),asModulesMap.set("ASAuthentication",ASAuthentication),asModulesMap.set("ASAccelerometer",ASAccelerometer),asModulesMap.set("ASCompass",ASCompass),asModulesMap.set("ASGyroscope",ASGyroscope),asModulesMap.set("ASContact",ASContact),asModulesMap.set("ASVibrator",ASVibrator),asModulesMap.set("ASCapture",ASCapture),asModulesMap.set("ASKeyboard",ASKeyboard),asModulesMap.set("ASImage",ASImage),asModulesMap.set("ASBrightness",ASBrightness),asModulesMap.set("ASFile",ASFile),asModulesMap.set("ASAudio",ASAudio),asModulesMap.set("ASBGAudio",ASBGAudio),asModulesMap.set("ASVideo",ASViedo),asModulesMap.set("ASInterceptor",ASInterceptor),asModulesMap.set("ASScan",ASScan),{});function requireAPI$1(e){var t;return moduleInstance[e]||(console.debug("[AdvancedAPI] create %s",e),t=asModulesMap.get(e),moduleInstance[e]=new t),moduleInstance[e]}class CallbackManager{constructor(e){this.lastCallbackId=0,this.callbacks=[]}add(e){return this.lastCallbackId++,(this.callbacks[this.lastCallbackId]=e).__callbackId=this.lastCallbackId,this.lastCallbackId}consume(e,t,o){var a=this.callbacks[e];return void 0===o||!1===o?this.callbacks[e]=void 0:a.isKeepAlive=!0,"function"==typeof a?a(t):new Error(`invalid callback id "${e}"`)}close(){this.callbacks=this.callbacks.map(e=>{})}}let callbackManager=new CallbackManager;function interceptCallback(e,a,t=!0,o=!0){if(!(t||0!==e.length&&o))return{args:e};let r=e[0],s={},i=!1;if("object"==typeof r&&"[object object]"===Object.prototype.toString.call(r).toLowerCase()&&1===e.length)for(var n in r){var c=r[n];"function"==typeof c?s[n]=c:i=!0}else i=!0;"function"==typeof r&&(t=!1,r.isConnected?r.cb&&(e[0]=r.cb.id):(((o=e=>{r.apply(null,e.arguments)}).originFn=r).cb=o,e[0]=o));let l;var d,o=Object.keys(s).length;if(t&&o<=0){class h{constructor(){this.promise=new Promise((e,t)=>{this.reject=t,this.resolve=e})}}l=new h}return(0{let t=s[e.method];advancedResult(a,e);var o=triggerMethodIntercept(a,e.method,e.arguments)||e.arguments,{ignoreComplete:o=!1}=(void 0!==t&&t.apply(null,o),e);o||(o=triggerMethodIntercept(a,"complete",e.arguments)||e.arguments,void 0!==(t=s.complete)&&t.apply(null,o)),l&&(o=(o=e.arguments)&&0normalize(e))),r&&r.cb&&(r.isConnected=!0),{args:e,promise:l,needPromise:t}}function normalize(e){var t;return"function"==typeof e?(t=callbackManager.add(e),e.id=t):e}function advancedResult(e,t){var o;"success"===t.method?(t.arguments[0]&&"object"==typeof t.arguments[0]||(t.arguments[0]={}),void 0===(o=t.arguments[0]).errMsg&&(o.errMsg=e+":ok"),void 0===o.errCode&&(o.errCode=0)):"fail"===t.method&&(o=t.arguments||[],t.arguments=[{moduleName:""+e,errMsg:e+":fail:"+o.shift(),errCode:o.shift(),grantStatus:o.shift(),dialogShownResults:o.shift()}])}function triggerMethodIntercept(e,t,o){var a=requireAPI("ASInterceptor");if("function"==typeof(t=a[t]))return t.call(a,e,o)}class JSCallback{constructor(e){this.id=e.id,this._valid=!0}invoke(e){this._valid?callbackManager.consume(this.id,e,e.ifKeepAlive):console.error(`[AdvancedAPI] callback ${this.id} had be destroyed.`)}invokeAndKeepAlive(e){this._valid?callbackManager.consume(this.id,e,!0):console.error(`[AdvancedAPI] callback ${this.id} had be destroyed.`)}destroy(){this.id=void 0,this._valid=!1}}let jsCallbackMap=new Map;function getSystemInfoSync(){return console.debug("[AdvancedAPI] start getSystemInfoSync"),requireAPI("ASDevice").getSystemInfoSync()}function getDeviceInfo(...e){return console.debug("[AdvancedAPI] start getDeviceInfo"),e.pop(),e=requireAPI("ASDevice"),console.debug("[AdvancedAPI] device.getInfo"),e=e.getDeviceInfo()}function getWindowInfo(...e){return console.debug("[AdvancedAPI] start getWindowInfo"),e.pop(),requireAPI("ASDevice").getWindowInfo()}function getAppBaseInfo(...e){return console.debug("[AdvancedAPI] start getAppBaseInfo"),e.pop(),requireAPI("ASDevice").getAppBaseInfo()}function getAppAuthorizeSetting(...e){return console.debug("[AdvancedAPI] start getAppAuthorizeSetting"),e.pop(),requireAPI("ASDevice").getAppAuthorizeSetting()}function getSystemSetting(...e){return console.debug("[AdvancedAPI] start getSystemSetting"),e.pop(),e=requireAPI("ASDevice"),console.debug("[AdvancedAPI] device.getSystemSetting"),e=e.getSystemSetting()}function openAppAuthorizeSetting(...e){console.debug("[AdvancedAPI] start getSystemSetting");var e=e.pop(),t=requireAPI("ASDevice");try{t.openAppAuthorizeSetting(),e.invoke(Result.success("success"))}catch(t){e.invoke(Result.fail(["fail"],201))}}function navigateTo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASRouter").navigateTo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function redirectTo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASRouter").redirectTo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function navigateBack(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASRouter").navigateBack(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getLocation(...e){console.debug("[AdvancedAPI] start getLocation");let o=e.pop();var e=e.pop(),t=requireAPI("ASLocation");console.debug("[AdvancedAPI] geolocation.getLocation"),t.getLocation(e).then(e=>{console.debug("[AdvancedAPI] geolocation.getLocation success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.getLocation fail"),o.invoke(Result.fail(e))})}function onLocationChange(...e){console.debug("[AdvancedAPI] start onLocationChange"),e=e.pop(),requireAPI("ASLocation").onLocationChange(e)}function offLocationChange(...e){console.debug("[AdvancedAPI] start offLocationChange");let t=e.pop();(e=requireAPI("ASLocation")).offLocationChange(t),e.getLocation({timeout:5e3,coordType:"wgs86"}).then(e=>{console.debug("[AdvancedAPI] geolocation.offLocationChange callback"),t.invokeAndKeepAlive(Result.success(e))},e=>{t.invokeAndKeepAlive(Result.fail([e[0][0],e[0][1]]))})}function onLocationChangeError(...e){console.debug("[AdvancedAPI] start onLocationChangeError");let t=e.pop();requireAPI("ASLocation").onLocationChangeError(e=>{console.debug("[AdvancedAPI] geolocation.onLocationChange success"),t.invokeAndKeepAlive(Result.callback(e))})}function offLocationChangeError(...e){console.debug("[AdvancedAPI] start offLocationChangeError"),e=e.pop(),requireAPI("ASLocation").offLocationChangeError(),e.invoke(Result.success())}function startLocationUpdate(...e){console.debug("[AdvancedAPI] start startLocationUpdate");let o=e.pop();requireAPI("ASLocation").startLocationUpdate().then(e=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdate success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdate fail"),o.invoke(Result.fail([e[0][0],e[0][1]]))})}function startLocationUpdateBackground(...e){console.debug("[AdvancedAPI] start startLocationUpdateBackground");let o=e.pop();requireAPI("ASLocation").startLocationUpdateBackground().then(e=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdateBackground success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdateBackground fail"),o.invoke(Result.fail([e[0][0],e[0][1]]))})}function stopLocationUpdate(...e){console.debug("[AdvancedAPI] start stopLocationUpdate");let o=e.pop();requireAPI("ASLocation").stopLocationUpdate(o).then(e=>{console.debug("[AdvancedAPI] geolocation.stopLocationUpdate success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.stopLocationUpdate fail"),o.invoke(Result.fail([e[0][0],e[0][1]]))})}function makePhoneCall(...e){let t=e.pop();e=e.pop(),requireAPI("ASPhone").makePhoneCall(e).then(()=>{t.invoke(Result.success())},e=>{console.error("[AdvancedAPI] start makePhoneCall fail"),t.invoke(Result.fail([e,-1]))})}function request(...e){var t=e.pop(),e=e.pop(),o=requireAPI("ASRequest"),o=(console.debug("[AdvancedAPI] request"),o.request(e));if(!e||e.success||e.fail||e.complete)return e||t.invoke(Result.fail(["illegal params",-1])),o;t.invoke(Result.success(o))}function uploadFile(...e){var t=e.pop(),e=e.pop(),o=requireAPI("ASRequest"),o=(console.debug("[AdvancedAPI] uploadFile"),o.uploadFile(e));if(!e||e.success||e.fail||e.complete)return e||t.invoke(Result.fail(["illegal params",-1])),o;t.invoke(Result.success(o))}function downloadFile(...e){var t=e.pop(),e=e.pop(),o=requireAPI("ASRequest"),o=(console.debug("[AdvancedAPI] downloadFile"),o.downloadFile(e));if(!e||e.success||e.fail||e.complete)return e||t.invoke(Result.fail(["illegal params",-1])),o;t.invoke(Result.success(o))}function openBluetoothAdapter(...e){let t=e.pop();requireAPI("ASBluetooth").openBluetoothAdapter().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function closeBluetoothAdapter(...e){let t=e.pop();requireAPI("ASBluetooth").closeBluetoothAdapter().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function startBluetoothDevicesDiscovery(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").startBluetoothDevicesDiscovery(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function stopBluetoothDevicesDiscovery(...e){let t=e.pop();requireAPI("ASBluetooth").stopBluetoothDevicesDiscovery().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function onBluetoothDeviceFound(...e){e=e.pop(),requireAPI("ASBluetooth").onBluetoothDeviceFound(e)}function offBluetoothDeviceFound(...e){e=e.pop(),requireAPI("ASBluetooth").offBluetoothDeviceFound(e)}function onBluetoothAdapterStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").onBluetoothAdapterStateChange(e)}function offBluetoothAdapterStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").offBluetoothAdapterStateChange(e)}function getBluetoothDevices(...e){let t=e.pop();requireAPI("ASBluetooth").getBluetoothDevices().then(e=>{e=e&&e[0]&&e[0][0]||{},t.invoke(Result.success(e))},e=>{console.info("[AdvancedAPI] getBluetoothDevices fail"+JSON.stringify(e)),t.invoke(Result.fail(...e))})}function getConnectedBluetoothDevices(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").getConnectedBluetoothDevices(e).then(e=>{console.info("[AdvancedAPI] getConnectedBluetoothDevices success"+JSON.stringify(e)),t.invoke(Result.success(e))},e=>{console.info("[AdvancedAPI] getConnectedBluetoothDevices fail"+JSON.stringify(e)),t.invoke(Result.fail(...e))})}function getBluetoothAdapterState(...e){let t=e.pop();requireAPI("ASBluetooth").getBluetoothAdapterState().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function setBLEMTU(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asSetBLEMTU(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function writeBLECharacteristicValue(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asWriteBLECharacteristicValue(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function readBLECharacteristicValue(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asReadBLECharacteristicValue(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function onBLEConnectionStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOnBLEConnectionStateChange(e)}function offBLEConnectionStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOffBLEConnectionStateChange(e)}function onBLECharacteristicValueChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOnBLECharacteristicValueChange(e)}function offBLECharacteristicValueChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOffBLECharacteristicValueChange(e)}function notifyBLECharacteristicValueChange(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asNotifyBLECharacteristicValueChange(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function getBLEDeviceServices(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asGetBLEDeviceServices(e).then(e=>{t.invoke(Result.success(e[0][0]))},e=>{t.invoke(Result.fail(...e))})}function getBLEDeviceRSSI(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asGetBLEDeviceRSSI(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function getBLEDeviceCharacteristics(...e){console.debug("[AdvancedAPI] enter getBLEDeviceCharacteristics");let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asGetBLEDeviceCharacteristics(e).then(e=>{t.invoke(Result.success(e[0]))},e=>{t.invoke(Result.fail(...e))})}function createBLEConnection(...e){let t=e.pop();var{deviceId:e,timeout:o}=e.pop()||{};requireAPI("ASBluetooth").asCreateBLEConnection({deviceId:e,timeout:o}).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function closeBLEConnection(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asCloseBLEConnection({deviceId:e?e.deviceId:void 0}).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function startWifi(...e){let t=e.pop();requireAPI("ASWifi").startWifi().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function stopWifi(...e){let t=e.pop();requireAPI("ASWifi").stopWifi().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getConnectedWifi(...e){let t=e.pop();e=e.pop(),requireAPI("ASWifi").getConnectedWifi(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getWifiList(...e){let t=e.pop();e=e.pop(),requireAPI("ASWifi").getWifiList(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onGetWifiList(...e){e=e.pop(),requireAPI("ASWifi").onGetWifiList(e)}function offGetWifiList(...e){e=e.pop(),requireAPI("ASWifi").offGetWifiList(e)}function connectWifi(...e){let t=e.pop();e=e.pop(),requireAPI("ASWifi").connectWifi(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onWifiConnected(...e){e=e.pop(),requireAPI("ASWifi").onWifiConnected(e)}function offWifiConnected(...e){e=e.pop(),requireAPI("ASWifi").offWifiConnected(e)}function onWifiConnectedWithPartialInfo(...e){e=e.pop(),requireAPI("ASWifi").onWifiConnectedWithPartialInfo(e)}function offWifiConnectedWithPartialInfo(...e){e=e.pop(),requireAPI("ASWifi").offWifiConnectedWithPartialInfo(e)}function startSoterAuthentication(...e){console.debug("[AdvancedAPI] start startSoterAuthentication");let t=e.pop();e=e.pop(),console.debug("[AdvancedAPI] params = %s",JSON.stringify(e)),requireAPI("ASAuthentication").start(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function checkIsSupportSoterAuthentication(...e){console.debug("[AdvancedAPI] start checkIsSupportSoterAuthentication");let t=e.pop();requireAPI("ASAuthentication").getSupportedType().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function checkIsSoterEnrolledInDevice(...e){console.debug("[AdvancedAPI] start checkIsSoterEnrolledInDevice");let t=e.pop();e=e.pop(),console.debug("[AdvancedAPI] params = %s",JSON.stringify(e)),requireAPI("ASAuthentication").isEnrolled(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onAccelerometerChange(...e){console.debug("[AdvancedAPI] start onAccelerometerChange"),e=e.pop(),requireAPI("ASAccelerometer").onAccelerometerChange(e).then(e=>{console.debug("[AdvancedAPI] onAccelerometerChange success")},(e,t)=>{console.debug("[AdvancedAPI] onAccelerometerChange fail errMsg = %o, code = %d",e,t)})}function offAccelerometerChange(...e){console.debug("[AdvancedAPI] start offAccelerometerChange"),e=e.pop(),requireAPI("ASAccelerometer").offAccelerometerChange(e).then(e=>{console.debug("[AdvancedAPI] offAccelerometerChange success")},(e,t)=>{console.debug("[AdvancedAPI] offAccelerometerChange fail errMsg = %o, code = %d",e,t)})}function startAccelerometer(...e){console.debug("[AdvancedAPI] start startAccelerometer");let o=e.pop();requireAPI("ASAccelerometer").startAccelerometer(e[0]).then(e=>{console.debug("[AdvancedAPI] startAccelerometer success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startAccelerometer fail errMsg = %o, code = %d",e,t),o.invoke(Result.fail([e,t]))})}function stopAccelerometer(...e){console.debug("[AdvancedAPI] start stopAccelerometer");let o=e.pop();requireAPI("ASAccelerometer").stopAccelerometer().then(e=>{console.debug("[AdvancedAPI] startAccelerometer success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startAccelerometer fail"),o.invoke(Result.fail([e,t]))})}function onCompassChange(...e){console.debug("[AdvancedAPI] start onCompassChange"),e=e.pop(),requireAPI("ASCompass").onCompassChange(e).then(e=>{console.debug("[AdvancedAPI] onCompassChange success")},(e,t)=>{console.debug("[AdvancedAPI] onCompassChange fail errMsg = %o, code = %d",e,t)})}function offCompassChange(...e){console.debug("[AdvancedAPI] start offCompassChange"),e=e.pop(),requireAPI("ASCompass").offCompassChange(e).then(e=>{console.debug("[AdvancedAPI] offCompassChange success")},(e,t)=>{console.debug("[AdvancedAPI] offCompassChange fail errMsg = %o, code = %d",e,t)})}function startCompass(...e){console.debug("[AdvancedAPI] start startCompass");let o=e.pop();requireAPI("ASCompass").startCompass().then(e=>{console.debug("[AdvancedAPI] startCompass success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startCompass fail"),o.invoke(Result.fail([e,t]))})}function stopCompass(...e){console.debug("[AdvancedAPI] start stopCompass");let o=e.pop();requireAPI("ASCompass").stopCompass().then(e=>{console.debug("[AdvancedAPI] stopCompass success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] stopCompass fail"),o.invoke(Result.fail([e,t]))})}function onGyroscopeChange(...e){console.debug("[AdvancedAPI] start onGyroscopeChange"),e=e.pop(),requireAPI("ASGyroscope").onGyroscopeChange(e).then(e=>{console.debug("[AdvancedAPI] onGyroscopeChange success")},(e,t)=>{console.debug("[AdvancedAPI] onGyroscopeChange fail errMsg = %o, code = %d",e,t)})}function startGyroscope(...e){console.debug("[AdvancedAPI] start startCompass");let o=e.pop();requireAPI("ASGyroscope").startGyroscope(e[0]).then(e=>{console.debug("[AdvancedAPI] startCompass success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startCompass fail errMsg = %o, code = %d",e,t),o.invoke(Result.fail([e,t]))})}function stopGyroscope(...e){console.debug("[AdvancedAPI] start stopGyroscope");let o=e.pop();requireAPI("ASGyroscope").stopGyroscope().then(e=>{console.debug("[AdvancedAPI] stopGyroscope success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] stopGyroscope fail errMsg = %o, code = %d",e,t),o.invoke(Result.fail([e,t]))})}function addPhoneContact(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASContact").addPhoneContact(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function vibrate(...e){let t=e.pop();requireAPI("ASVibrator").vibrate().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function vibrateLong(...e){let t=e.pop();requireAPI("ASVibrator").vibrateLong().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function vibrateShort(...e){let t=e.pop();requireAPI("ASVibrator").vibrateShort().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onUserCaptureScreen(...e){e=e.pop(),requireAPI("ASCapture").onUserCaptureScreen(e)}function offUserCaptureScreen(...e){e=e.pop(),requireAPI("ASCapture").offUserCaptureScreen(e)}function hideKeyboard(...e){let t=requireAPI("ASKeyboard"),o=e.pop();t.hideKeyboard().then(()=>{console.debug("[AdvancedAPI] hideKeyboard success"),o.invoke(Result.success())},(e,t)=>{console.debug("[AdvancedAPI] hideKeyboard fail, code: %d, error: %s",t,e),o.invoke(Result.fail())})}function onKeyboardHeightChange(...e){e=e.pop(),requireAPI("ASKeyboard").onKeyboardHeightChange(e)}function offKeyboardHeightChange(...e){e=e.pop(),requireAPI("ASKeyboard").offKeyboardHeightChange(e)}function login(...e){let t=e.pop();var e=e.pop(),o=requireAPI("ASAccount");console.debug("[AdvancedAPI] ASAccount login"),o.login(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getUserInfo(...e){let t=e.pop();var e=e.pop(),o=requireAPI("ASAccount");console.debug("[AdvancedAPI] ASAccount getUserInfo"),o.getUserInfo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function chooseImage(...e){console.debug("[AdvancedAPI] start chooseImage");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.chooseImage(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getImageInfo(...e){console.debug("[AdvancedAPI] start getImageInfo");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.getImageInfo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function saveImageToPhotosAlbum(...e){console.debug("[AdvancedAPI] start saveImageToPhotosAlbum");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.saveImageToPhotosAlbum(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function compressImage(...e){console.debug("[AdvancedAPI] start compressImage");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.compressImage(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function setScreenBrightness(...e){let t=e.pop();e=e.pop(),requireAPI("ASBrightness").setScreenBrightness(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getScreenBrightness(...e){let t=e.pop();requireAPI("ASBrightness").getScreenBrightness().then(e=>{console.info("[AdvancedAPI] getScreenBrightness raw = "+e[0].value),e=e[0].value/255,console.info("[AdvancedAPI] getScreenBrightness = "+e),t.invoke(Result.success({value:e}))},e=>{t.invoke(Result.fail(e))})}function setKeepScreenOn(...e){let t=e.pop();e=e.pop(),requireAPI("ASBrightness").asSetKeepScreenOn(e).then(()=>{t.invoke(Result.success())},()=>{t.invoke(Result.fail())})}function saveFile(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").saveFile(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getSavedFileList(...e){let t=e.pop();requireAPI("ASFile").getSavedFileList().then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getSavedFileInfo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").getSavedFileInfo(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function removeSavedFile(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").removeSavedFile(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getFileInfo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").getFileInfo(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function openDocument(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").openDocument(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getFileSystemManager(){return requireAPI("ASFile").getFileSystemManager()}function createInnerAudioContext(){return console.debug("[AdvancedAPI] start createInnerAudioContext"),requireAPI("ASAudio").createInnerAudioContext()}function saveVideoToPhotosAlbum(...e){console.debug("[AdvancedAPI] start saveVideoToPhotosAlbum");let t=e.pop();var o=requireAPI("ASVideo"),e=e[0];o.saveVideoToPhotosAlbum(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getVideoInfo(...e){console.debug("[AdvancedAPI] start getVideoInfo");let t=e.pop();var o=requireAPI("ASVideo"),e=e[0];o.getVideoInfo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function scanCode(...e){console.debug("[AdvancedAPI] start scanCode");let t=e.pop();e=e[0],requireAPI("ASScan").scanCode(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}let asInterfaceList={getSystemInfoSync:{method:getSystemInfoSync,needPromise:!1,needCallback:!1},getDeviceInfo:{method:getDeviceInfo,needPromise:!1},getWindowInfo:{method:getWindowInfo,needPromise:!1},getAppBaseInfo:{method:getAppBaseInfo,needPromise:!1},getAppAuthorizeSetting:{method:getAppAuthorizeSetting,needPromise:!1},getSystemSetting:{method:getSystemSetting,needPromise:!1},openAppAuthorizeSetting:{method:openAppAuthorizeSetting},getLocation:{method:getLocation},onLocationChange:{method:onLocationChange},offLocationChange:{method:offLocationChange,needPromise:!1},startLocationUpdate:{method:startLocationUpdate},startLocationUpdateBackground:{method:startLocationUpdateBackground},stopLocationUpdate:{method:stopLocationUpdate},onLocationChangeError:{method:onLocationChangeError},offLocationChangeError:{method:offLocationChangeError},makePhoneCall:{method:makePhoneCall},request:{method:request},uploadFile:{method:uploadFile},downloadFile:{method:downloadFile},navigateTo:{method:navigateTo},redirectTo:{method:redirectTo},navigateBack:{method:navigateBack},openBluetoothAdapter:{method:openBluetoothAdapter},startBluetoothDevicesDiscovery:{method:startBluetoothDevicesDiscovery},onBluetoothDeviceFound:{method:onBluetoothDeviceFound,needPromise:!1,needCallback:!1},offBluetoothDeviceFound:{method:offBluetoothDeviceFound,needPromise:!1,needCallback:!1},stopBluetoothDevicesDiscovery:{method:stopBluetoothDevicesDiscovery},onBluetoothAdapterStateChange:{method:onBluetoothAdapterStateChange,needPromise:!1,needCallback:!1},offBluetoothAdapterStateChange:{method:offBluetoothAdapterStateChange,needPromise:!1,needCallback:!1},getConnectedBluetoothDevices:{method:getConnectedBluetoothDevices},getBluetoothAdapterState:{method:getBluetoothAdapterState},closeBluetoothAdapter:{method:closeBluetoothAdapter},getBluetoothDevices:{method:getBluetoothDevices},setBLEMTU:{method:setBLEMTU},writeBLECharacteristicValue:{method:writeBLECharacteristicValue},readBLECharacteristicValue:{method:readBLECharacteristicValue},onBLEConnectionStateChange:{method:onBLEConnectionStateChange,needPromise:!1,needCallback:!1},offBLEConnectionStateChange:{method:offBLEConnectionStateChange,needPromise:!1,needCallback:!1},onBLECharacteristicValueChange:{method:onBLECharacteristicValueChange,needPromise:!1,needCallback:!1},offBLECharacteristicValueChange:{method:offBLECharacteristicValueChange,needPromise:!1,needCallback:!1},notifyBLECharacteristicValueChange:{method:notifyBLECharacteristicValueChange},getBLEDeviceServices:{method:getBLEDeviceServices},getBLEDeviceRSSI:{method:getBLEDeviceRSSI},getBLEDeviceCharacteristics:{method:getBLEDeviceCharacteristics},createBLEConnection:{method:createBLEConnection},closeBLEConnection:{method:closeBLEConnection},onAccelerometerChange:{method:onAccelerometerChange,needPromise:!1,needCallback:!1},offAccelerometerChange:{method:offAccelerometerChange,needPromise:!1,needCallback:!1},startAccelerometer:{method:startAccelerometer},stopAccelerometer:{method:stopAccelerometer},onCompassChange:{method:onCompassChange,needPromise:!1,needCallback:!1},offCompassChange:{method:offCompassChange,needPromise:!1,needCallback:!1},startCompass:{method:startCompass},stopCompass:{method:stopCompass},onGyroscopeChange:{method:onGyroscopeChange,needPromise:!1,needCallback:!1},startGyroscope:{method:startGyroscope},stopGyroscope:{method:stopGyroscope},startWifi:{method:startWifi},stopWifi:{method:stopWifi},getConnectedWifi:{method:getConnectedWifi},getWifiList:{method:getWifiList},onGetWifiList:{method:onGetWifiList,needPromise:!1,needCallback:!1},offGetWifiList:{method:offGetWifiList,needPromise:!1,needCallback:!1},connectWifi:{method:connectWifi},onWifiConnected:{method:onWifiConnected,needPromise:!1,needCallback:!1},offWifiConnected:{method:offWifiConnected,needPromise:!1,needCallback:!1},onWifiConnectedWithPartialInfo:{method:onWifiConnectedWithPartialInfo,needPromise:!1,needCallback:!1},offWifiConnectedWithPartialInfo:{method:offWifiConnectedWithPartialInfo,needPromise:!1,needCallback:!1},startSoterAuthentication:{method:startSoterAuthentication},checkIsSupportSoterAuthentication:{method:checkIsSupportSoterAuthentication},checkIsSoterEnrolledInDevice:{method:checkIsSoterEnrolledInDevice},addPhoneContact:{method:addPhoneContact},vibrate:{method:vibrate},vibrateLong:{method:vibrateLong},vibrateShort:{method:vibrateShort},onUserCaptureScreen:{method:onUserCaptureScreen,needPromise:!1,needCallback:!1},offUserCaptureScreen:{method:offUserCaptureScreen,needPromise:!1,needCallback:!1},hideKeyboard:{method:hideKeyboard},onKeyboardHeightChange:{method:onKeyboardHeightChange,needPromise:!1,needCallback:!1},offKeyboardHeightChange:{method:offKeyboardHeightChange,needPromise:!1,needCallback:!1},login:{method:login},getUserInfo:{method:getUserInfo},chooseImage:{method:chooseImage},getImageInfo:{method:getImageInfo},saveImageToPhotosAlbum:{method:saveImageToPhotosAlbum},compressImage:{method:compressImage},setScreenBrightness:{method:setScreenBrightness},getScreenBrightness:{method:getScreenBrightness},setKeepScreenOn:{method:setKeepScreenOn},saveFile:{method:saveFile},getSavedFileList:{method:getSavedFileList},getSavedFileInfo:{method:getSavedFileInfo},removeSavedFile:{method:removeSavedFile},getFileInfo:{method:getFileInfo},openDocument:{method:openDocument},getFileSystemManager:{method:getFileSystemManager,needPromise:!1,needCallback:!1},createInnerAudioContext:{method:createInnerAudioContext,needPromise:!1,needCallback:!1},saveVideoToPhotosAlbum:{method:saveVideoToPhotosAlbum},getVideoInfo:{method:getVideoInfo},scanCode:{method:scanCode}};function invokeModule(e,...t){console.debug("[AdvancedAPI] invokeModule moduleName = %s",e);var o=t.pop();if("number"==typeof o){let e=jsCallbackMap.get(o);e||(e=new JSCallback({id:o}),jsCallbackMap.set(o,e)),t.push(e)}else t.push(o);return o=asInterfaceList[e],triggerInterceptInvoke(e,t),triggerInterceptReturnValue(e,o=o.method.apply(null,t)),o}function triggerInterceptInvoke(e,t){var o=requireAPI("ASInterceptor");!1!==asInterfaceList[e].needCallback&&((t=[...t]).pop(),o.invoke(e,t))}function triggerInterceptReturnValue(e,t){requireAPI("ASInterceptor").returnValue(e,t)}function createAs(){let e={};return Object.keys(asInterfaceList).forEach(o=>{Object.defineProperty(e,o,{get:()=>(...e)=>{e=(t=interceptCallback(e,o,asInterfaceList[o].needPromise,asInterfaceList[o].needCallback)).args||[];var t=t.promise,e=invokeModule(o,...e);return t?t.promise:e}})}),e}let as=createAs(),AdvancedApi={init:function(e,t){var o;globalThis.as&&globalThis.requireAPI||(console.debug("[AdvancedAPI] init"),globalThis.as=as,globalThis.requireAPI=requireAPI$1,globalThis.isStageModel=!0,globalThis.abilityContext=e,media.createAVRecorder().then(e=>{globalThis.commonAvRecorder=e}),o=bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO|bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION,globalThis.bundleInfoForSelf=bundleManager.getBundleInfoForSelfSync(o),globalThis.lastWindow=t,initContextOnStageModel(e))}};export default AdvancedApi;export{as,createAs}; diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/module.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/module.json5 new file mode 100644 index 0000000000..a480c86e62 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/module.json5 @@ -0,0 +1,11 @@ +{ + "module": { + "name": "advanced_api_har", + "type": "har", + "deviceTypes": [ + "default", + "tablet", + "2in1" + ] + } +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/base/element/string.json b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..f51a9c8461 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from package" + } + ] +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/en_US/element/string.json b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/en_US/element/string.json new file mode 100644 index 0000000000..f51a9c8461 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/en_US/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from package" + } + ] +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/zh_CN/element/string.json b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/zh_CN/element/string.json new file mode 100644 index 0000000000..f51a9c8461 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "page_show", + "value": "page from package" + } + ] +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/Ability.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000..85c78f6757 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/List.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000..794c7dc4ed --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/module.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/module.json5 new file mode 100644 index 0000000000..a0cfc76227 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/ohosTest/module.json5 @@ -0,0 +1,13 @@ +{ + "module": { + "name": "advanced_api_har_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/List.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/List.test.ets new file mode 100644 index 0000000000..bb5b5c3731 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/LocalUnit.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000..165fc1615e --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_har/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/.gitignore b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/.gitignore new file mode 100644 index 0000000000..e2713a2779 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/Index.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/Index.ets new file mode 100644 index 0000000000..8b8666f85f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/Index.ets @@ -0,0 +1,2 @@ +import AdvancedAPI,{ as } from './src/main/ets/utils/advancedapi.min' +export { AdvancedAPI, as } \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/build-profile.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/build-profile.json5 new file mode 100644 index 0000000000..ce80db2a16 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/build-profile.json5 @@ -0,0 +1,28 @@ +{ + "apiType": "stageMode", + "buildOption": { + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": false, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest" + } + ] +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/hvigorfile.ts b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/hvigorfile.ts new file mode 100644 index 0000000000..d993120bd7 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hspTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hspTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/obfuscation-rules.txt b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/obfuscation-rules.txt new file mode 100644 index 0000000000..272efb6ca3 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/obfuscation-rules.txt @@ -0,0 +1,23 @@ +# Define project specific obfuscation rules here. +# You can include the obfuscation configuration files in the current module's build-profile.json5. +# +# For more details, see +# https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 + +# Obfuscation options: +# -disable-obfuscation: disable all obfuscations +# -enable-property-obfuscation: obfuscate the property names +# -enable-toplevel-obfuscation: obfuscate the names in the global scope +# -compact: remove unnecessary blank spaces and all line feeds +# -remove-log: remove all console.* statements +# -print-namecache: print the name cache that contains the mapping from the old names to new names +# -apply-namecache: reuse the given cache file + +# Keep options: +# -keep-property-name: specifies property names that you want to keep +# -keep-global-name: specifies names that you want to keep in the global scope + +-enable-property-obfuscation +-enable-toplevel-obfuscation +-enable-filename-obfuscation +-enable-export-obfuscation \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/oh-package.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/oh-package.json5 new file mode 100644 index 0000000000..d622e6b473 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/oh-package.json5 @@ -0,0 +1,11 @@ +{ + "name": "advanced_api_hsp", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "Index.ets", + "author": "", + "license": "Apache-2.0", + "packageType": "InterfaceHar", + "dependencies": { + } +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/ets/pages/Index.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000..423b4276ec --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/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/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/ets/utils/advancedapi.min.js b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/ets/utils/advancedapi.min.js new file mode 100644 index 0000000000..2d410ec514 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/ets/utils/advancedapi.min.js @@ -0,0 +1,48 @@ +var global,_dec,_dec2,_dec3,_dec4,_dec5,_dec6,_dec7,_dec8,_dec9,_dec10,_dec11,_dec12,_dec13,_dec14,_class,_dec$1,_dec2$1,_class$1,_dec$2,_dec2$2,_dec3$1,_class$2;void 0===global&&(global=globalThis); +import abilityFeatureAbility from "@ohos.ability.featureAbility"; +import deviceInfo from "@ohos.deviceInfo"; +import display from "@ohos.display"; +import I18n from "@ohos.i18n"; +import abilityAccessCtrl from "@ohos.abilityAccessCtrl"; +import bluetooth from "@ohos.bluetooth"; +import geoLocationManager from "@ohos.geoLocationManager"; +import wifiManager from "@ohos.wifiManager"; +import window from "@ohos.window"; +import mapCommon from "@hms.core.map.mapCommon"; +import map from "@hms.core.map.map"; +import wantAgent from "@ohos.app.ability.wantAgent"; +import backgroundTaskManager from "@ohos.resourceschedule.backgroundTaskManager"; +import call from "@ohos.telephony.call"; +import http from "@ohos.net.http"; +import request$1 from "@ohos.request"; +import fs from "@ohos.file.fs"; +import photoAccessHelper from "@ohos.file.photoAccessHelper"; +import dataSharePredicates from "@ohos.data.dataSharePredicates"; +import bluetoothManager from "@ohos.bluetoothManager"; +import access from "@ohos.bluetooth.access"; +import ble from "@ohos.bluetooth.ble"; +import connection from "@ohos.bluetooth.connection"; +import promptAction from "@ohos.promptAction"; +import router from "@ohos.router"; +import wifi from "@ohos.wifi"; +import userIAM_userAuth from "@ohos.userIAM.userAuth"; +import prompt from "@ohos.prompt"; +import sensor from "@ohos.sensor"; +import contact from "@ohos.contact"; +import vibrator from "@ohos.vibrator"; +import inputMethod from "@ohos.inputMethod"; +import fileuri from "@ohos.file.fileuri"; +import wantConstant from "@ohos.ability.wantConstant"; +import bundleManager from "@ohos.bundle.bundleManager"; +import image from "@ohos.multimedia.image"; +import picker from "@ohos.file.picker"; +import media from "@ohos.multimedia.media"; +import audio from "@ohos.multimedia.audio"; +import avSession from "@ohos.multimedia.avsession"; +import cryptoFramework from "@ohos.security.cryptoFramework"; +import buffer from "@ohos.buffer"; +import util from "@ohos.util"; +import settings from "@ohos.settings"; +import scanCore from "@hms.core.scan.scanCore"; +import scanBarcode from "@hms.core.scan.scanBarcode"; +function _applyDecoratedDescriptor(o,a,e,t,r){var s={};return Object.keys(t).forEach(function(e){s[e]=t[e]}),s.enumerable=!!s.enumerable,s.configurable=!!s.configurable,("value"in s||s.initializer)&&(s.writable=!0),s=e.slice().reverse().reduce(function(e,t){return t(o,a,e)||e},s),r&&void 0!==s.initializer&&(s.value=s.initializer?s.initializer.call(r):void 0,s.initializer=void 0),void 0===s.initializer?(Object.defineProperty(o,a,s),null):s}function _defineProperty(e,t,o){return(t=_toPropertyKey(t))in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function _toPrimitive(e,t){if("object"!=typeof e||!e)return e;var o=e[Symbol.toPrimitive];if(void 0===o)return("string"===t?String:Number)(e);if("object"!=typeof(o=o.call(e,t||"default")))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}function _toPropertyKey(e){return"symbol"==typeof(e=_toPrimitive(e,"string"))?e:e+""}let context=abilityFeatureAbility.getContext();function initContextOnStageModel(e){(context=e).startAbilityForResult||(context.startAbilityForResult=context.startAbility),context.getAbilityInfo=function(){return new Promise((e,t)=>{try{e(this.abilityInfo)}catch(e){t(e)}})},context.getFilesDir=function(){return new Promise((e,t)=>{try{e(this.filesDir)}catch(e){t(e)}})},context.getCacheDir=function(){return new Promise((e,t)=>{try{e(this.cacheDir)}catch(e){t(e)}})}}class AbilityBase{static getAbilityInfo(){return new Promise((t,o)=>{this.hasAbilityInfo?t(this.abilityInfo):context.getAbilityInfo().then(e=>{this.hasAbilityInfo=!0,this.abilityInfo=e,console.log("[QAFAPI] getAbilityInfo successful. "),t(e)}).catch(e=>{console.error("[QAFAPI] getAbilityInfo failed. Cause: "+JSON.stringify(e)),o(e)})})}}_defineProperty(AbilityBase,"abilityInfo",{}),_defineProperty(AbilityBase,"hasAbilityInfo",!1);class DeivceBase{static getDeviceInfo(){return deviceInfo}}class DisplayBase{static ohosGetDisplay(){let e=null;try{e=display.getDefaultDisplaySync()}catch(e){console.error("[QAFAPI] display error message: "+JSON.stringify(e))}return e}}class ASDevice{getSystemInfoSync(){var{brand:e,productModel:t,osFullName:o,deviceType:a,udid:r,sdkApiVersion:s}=DeivceBase.getDeviceInfo(),i=o.split("-")[0],n=i,c=o.split("-")[1],l=c,d=I18n.System.getSystemLanguage(),{rotation:h,densityPixels:u}=p=DisplayBase.ohosGetDisplay(),{width:p,height:f}=p,p=Math.round(p/u),f=Math.round(f/u),h=1===h||3===h?"landscape":"portrait",{signatureInfo:A,versionName:g,versionCode:m,appInfo:y}=globalThis.bundleInfoForSelf,y=context.resourceManager.getStringSync(y.labelId),A=A.appId,S=context.config.language,{width:v,height:C,top:P}=null==(v=globalThis.lastWindow.getWindowProperties())?void 0:v.windowRect,{isFullScreen:E,isLayoutFullScreen:b}=globalThis.lastWindow.getWindowProperties(),I=globalThis.lastWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM),I=Math.round(((null==I||null==(I=I.topRect)?void 0:I.height)||0)/u),E=E||b?Math.round(C/u):Math.round((C+I)/u),P=Math.round(P/u),b={deviceType:a,deviceBrand:e,brand:e,deviceModel:t,platform:n,model:t,deviceOrientation:h,devicePixelRatio:u,pixelRatio:u,system:o,osName:n,osVersion:l,version:l,osLanguage:d,language:d,ohosAPILevel:s,romName:i,romVersion:c,appId:A,appName:y,appVersion:g,appVersionCode:m,appLanguage:S,screenWidth:p,screenHeight:f,windowWidth:Math.round(v/u),windowHeight:Math.round(C/u),windowTop:P,windowBottom:E,statusBarHeight:I};return r&&(b.deviceId=r),b}getDeviceInfo(){console.debug("[AdvancedAPI] start ASDevice getDeviceInfo");var{brand:e,productModel:t,osFullName:o,deviceType:a,osFullName:r,udid:s}=DeivceBase.getDeviceInfo(),i=e,n=t,r=r.split("-")[0],{densityPixels:c,rotation:l}=DisplayBase.ohosGetDisplay(),r={platform:r,deviceBrand:i,deviceModel:t,deviceType:a,deviceOrientation:1===l||3===l?"landscape":"portrait",devicePixelRatio:c,system:o,brand:e,model:n};return s&&(r.deviceId=s),r}getWindowInfo(){console.debug("[AdvancedAPI] start ASDevice getWindowInfo");var e=(t=DisplayBase.ohosGetDisplay()).densityPixels,{width:t,height:o}=t,{width:a,height:r,top:s}=null==(a=globalThis.lastWindow.getWindowProperties())?void 0:a.windowRect,{isFullScreen:i,isLayoutFullScreen:n}=globalThis.lastWindow.getWindowProperties(),c=globalThis.lastWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM),c=Math.round(((null==c||null==(c=c.topRect)?void 0:c.height)||0)/e),i=i||n?Math.round(r/e):Math.round((r+c)/e),s=Math.round(s/e),a=Math.round(a/e),r=Math.round(r/e);return{pixelRatio:e,screenWidth:Math.round(t/e),screenHeight:Math.round(o/e),windowWidth:a,windowHeight:r,windowTop:s,windowBottom:i,statusBarHeight:c}}getAppBaseInfo(){console.debug("[AdvancedAPI] start ASDevice getAppBaseInfo");var{signatureInfo:e,versionName:t,versionCode:o,appInfo:a}=globalThis.bundleInfoForSelf,r=a.debug,a=context.resourceManager.getStringSync(a.labelId),e=e.appId,s=context.config.language,i=(Environment.envProp("colorMode",-1),AppStorage.get("colorMode"));return{appId:e,appName:a,appVersion:t,appVersionCode:o,appLanguage:s,enableDebug:r,theme:0===i?"light":1===i?"dark":"auto"}}getAppAuthorizeSetting(){console.debug("[AdvancedAPI] start ASDevice getAppAuthorizeSetting");var e=abilityAccessCtrl.createAtManager(),t=globalThis.bundleInfoForSelf.appInfo.accessTokenId,o=e=>-1===e?"denied":0===e?"authorized":"config error";let a="not determined";try{a=o(a=e.checkAccessTokenSync(t,"ohos.permission.WRITE_IMAGEVIDEO"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken album fail")}let r="not determined";try{r=o(r=e.checkAccessTokenSync(t,"ohos.permission.USE_BLUETOOTH"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken bluetooth fail")}let s="not determined";try{s=o(s=e.checkAccessTokenSync(t,"ohos.permission.CAMERA"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken camera fail")}let i="not determined";try{i=o(i=e.checkAccessTokenSync(t,"ohos.permission.LOCATION"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken location fail")}let n="not determined";try{n=0===e.checkAccessTokenSync(t,"ohos.permission.APPROXIMATELY_LOCATION")?"full":"reduced"}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken locationAccuracy fail")}let c="not determined";try{c=o(c=e.checkAccessTokenSync(t,"ohos.permission.MICROPHONE"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken microphone fail")}let l="not determined";try{l=o(l=e.checkAccessTokenSync(t,"ohos.permission.NOTIFICATION_CONTROLLER"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken notification fail")}let d="not determined";try{d=o(d=e.checkAccessTokenSync(t,"ohos.permission.READ_CALENDAR"))}catch(e){console.debug("[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken phoneCalendar fail")}return{albumAuthorized:a,bluetoothAuthorized:r,cameraAuthorized:s,locationAuthorized:i,locationAccuracy:n,microphoneAuthorized:c,notificationAuthorized:l,phoneCalendarAuthorized:d}}getSystemSetting(){let e,t,o,a,r;try{e=!(2!==(e=bluetooth.getState())&&5!==e)}catch(e){console.error("errCode:"+e.code+",errMessage:"+e.message),a=e.message}try{t=geoLocationManager.isLocationEnabled()}catch(e){console.error("errCode:"+e.code+",errMessage:"+e.message),r=e.message}try{o=wifiManager.isWifiActive()}catch(e){console.error("errCode:"+e.code+",errMessage:"+e.message)}var s=DisplayBase.ohosGetDisplay().rotation;return{bluetoothEnabled:e,bluetoothError:a,locationEnabled:t,locationError:r,wifiEnabled:o,deviceOrientation:1===s||3===s?"landscape":"portrait"}}openAppAuthorizeSetting(){var e={bundleName:"com.huawei.hmos.settings",abilityName:"com.huawei.hmos.settings.MainAbility",uri:"application_info_entry",parameters:{pushParams:context.applicationInfo.name}};return context.startAbilityForResult(e)}}let ErrorCode$1={SHARE_INSTALLED_ERROR:-1001,SUCCESS:0,COMMON_ERROR:200,USER_REJECT:201,PARAMETER_ERROR:202,SERVICE_UNAVIALABLE:203,SERVICE_TIMEOUT:204,NOT_SUPPORT_SERVICE_COUNTRY:205,NOT_IN_WHITE_LIST:206,SYSTEM_PERMISSION_DENIAL:207,IO_ERROR:300,FILE_NOT_FOUND:301,FILE_EXIST:302,FILE_EXTENSION_NOT_EXIST:303,FILE_PATH_NOT_LEGAL:304,WEB_PAGE_NOT_FOUND:404,QUICKAPP_IN_BACKGROUND:500,LOCATION_SWITCH_CLOSED:1e3,PAY_CHECKKEY_FAIL:1001,SIM_NOT_FOUND:1001,SIGNIN_AUTH_FAIL:1002,OPERATORS_GET_FAIL:1002,ALARM_SYSTEM_ERROR:1003,AGD_COMMON_ERROR:2001,WIDGET_NOT_SUPPORT:2001,CARD_CALL_QUICK_APP_CENTER_FAIL:2003,BI_REPORT_ERROR:4001,PAY_CANCEL_CODE:3e4,PAY_CERTIFICATION_CODE:30102},BLHErrorCode={OK:0,OTHER_ERRORS:200,NOT_INIT:1e4,NOT_AVAILABLE:10001,NO_DEVICE:10002,CONNECTION_FAIL:10003,NO_SERVICE:10004,NO_CHARACTERISTIC:10005,NO_CONNECTION:10006,PROPERTY_NOT_SUPPORT:10007,SYSTEM_ERROR:10008,SYSTEM_NOT_SUPPORT:10009,LOCATION_NOT_TURN_ON:10010,NO_SUCH_INTERFACE:10100,DEVICE_DOES_NOT_EXIST:10101,NOT_AVAILABLE_TIRAMISU:10102},WifiErrorCode={PASSWORD_ERROR:1e3,CONNECTION_TIMEOUT:1001,DUPLICATE_REQUEST:1002,WIFI_NOT_TURNED_ON:1003,GPS_NOT_TURNED_ON:1004,INVALID_SSID:1005};function dataToArray(e){return Array.isArray(e)?e:[e]}class Result{static success(e,t=!1,o=!1){return{method:"success",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static fail(e,t=!1,o=!1){return{method:"fail",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static cancel(e,t=!1,o=!1){return{method:"cancel",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static callback(e,t=!1,o=!1){return{method:"callback",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}static destroy(e,t=!1,o=!1){return{method:"destroy",arguments:dataToArray(e),ignoreComplete:t,ifKeepAlive:o}}}class ASLocation{constructor(){this.locationChangeCallbacks=[],this.locationChangeErrorCallback=(e,t)=>{},this.bothCallback=(t,e)=>{if(e)this.locationChangeErrorCallback({errMsg:e[2].arguments[0],errCode:e[2].arguments[1]});else for(let e=0;e{var o=t.authResults,a=t.dialogShownResults,r=o.length;for(let e=0;e{var e;return console.debug("[AdvancedAPI] current location: %s",JSON.stringify(t)),"gcj02"===(null==s?void 0:s.type)?(e={latitude:t.latitude,longitude:t.longitude},map.convertCoordinate(mapCommon.CoordinateType.WGS84,mapCommon.CoordinateType.GCJ02,e).then(e=>(t.latitude=e.latitude,t.longitude=e.longitude,Promise.resolve(t))).catch(e=>(console.debug("[AdvancedAPI] promise, convertCoordinate: error= %s",JSON.stringify(e)),Promise.reject([[e.message,ErrorCode$1.SERVICE_UNAVIALABLE]])))):Promise.resolve(t)}).catch(e=>(console.debug("[AdvancedAPI] promise, getCurrentLocation: error= %s",JSON.stringify(e)),Promise.reject([[e.message,ErrorCode$1.SERVICE_UNAVIALABLE]])))}catch(e){return console.error("[AdvancedAPI] errCode:"+e.code+",errMessage:"+e.message),Promise.reject([[e.message,ErrorCode$1.SERVICE_UNAVIALABLE]])}})}onLocationChange(e){console.debug("[AdvancedAPI] start ASLocation onLocationChange"),this.locationChangeCallbacks.push(e)}offLocationChange(e){console.debug("[AdvancedAPI] start ASLocation offLocationChange"),e?0<=(e=this.locationChangeCallbacks.indexOf(e))&&this.locationChangeCallbacks.splice(e,1):this.locationChangeCallbacks=[]}onLocationChangeError(e){console.debug("[AdvancedAPI] start ASLocation onLocationChangeError"),this.locationChangeErrorCallback=e}offLocationChangeError(){console.debug("[AdvancedAPI] start ASLocation offLocationChangeError"),this.locationChangeErrorCallback=(e,t)=>{}}startLocationUpdate(){console.debug("[AdvancedAPI] start ASLocation startLocationUpdate");var e=abilityAccessCtrl.createAtManager();try{return e.requestPermissionsFromUser(context,["ohos.permission.APPROXIMATELY_LOCATION","ohos.permission.LOCATION"]).then(t=>{var o=t.authResults,a=o.length;for(let e=0;e{var o=t.authResults,a=o.length;for(let e=0;e{e={wants:[{bundleName:e.bundleName,abilityName:e.name}],operationType:wantAgent.OperationType.START_ABILITY,requestCode:0,wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]},wantAgent.getWantAgent(e).then(e=>backgroundTaskManager.startBackgroundRunning(context,backgroundTaskManager.BackgroundMode.LOCATION,e)).then(()=>{console.debug("[AdvancedAPI] start bg operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] start bg operation failed Cause: "+e)})});try{return geoLocationManager.on("locationChange",{priority:515,scenario:768,timeInterval:0,distanceInterval:0,maxAccuracy:0},this.bothCallback),Promise.resolve("SUCCESS")}catch(e){return Promise.reject([[e.message,e.code]])}})}catch(e){return Promise.reject([["startLocationUpdateBackground failed",ErrorCode$1.COMMON_ERROR]])}}stopLocationUpdate(e){console.debug("[AdvancedAPI] start ASLocation stopLocationUpdate"),backgroundTaskManager.stopBackgroundRunning(context).then(()=>{console.debug("[AdvancedAPI] stop operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] stop operation fail cause: "+JSON.stringify(e))});try{return geoLocationManager.off("locationChange"),Promise.resolve("SUCCESS")}catch(e){return Promise.reject([["stopLocationUpdate failed",ErrorCode$1.COMMON_ERROR]])}}}class ASPhone{makePhoneCall(e){return e&&e.phoneNumber&&"string"==typeof e.phoneNumber&&""!==e?call.makeCall(e.phoneNumber):new Promise((e,t)=>{t(["param is invalid.",ErrorCode$1.PARAMETER_ERROR])})}}function isMac(e){return/^[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}$/.test(e)}function isUuid(e){return/^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$/.test(e)}function isLower(e){return e===e.toLowerCase()}function isNumber(e){return"number"==typeof e&&!Number.isNaN(e)&&Number.isFinite(e)}function isString(e){return"string"==typeof e}function isBoolean(e){return"boolean"==typeof e}function isFunction(e){return"function"==typeof e}function isArrayBuffer(e){return"[object ArrayBuffer]"===Object.prototype.toString.call(e)}function isNull(e){return null===e}function isUndefined(e){return void 0===e}function isArray(e){return Array.isArray(e)}function isHexcolor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)||/^#[0-9a-fA-F]{3}$/i.test(e)}function checkDataType(t,e,o,a){let r=!1;try{if(e&&(isNull(t)||isUndefined(t)))throw new Error("The param data is required");if(!isString(o)&&!isArray(o))throw new Error("The param dataType should be a String or an Array");if(!isNull(a)&&!isUndefined(a)&&!isFunction(a))throw new Error("If customCheck exist,it should be a Function");if(!e&&(isNull(t)||isUndefined(t)))return!0;isString(o)?r=checkSingleDataType(t,o):isArray(o)&&(r=o.some(e=>checkSingleDataType(t,e))),r&&isFunction(a)&&(r=a(t))}catch(e){return console.log(e),!1}return r}function checkSingleDataType(e,t){let o=!1;switch(t){case"string":o=isString(e);break;case"number":o=isNumber(e);break;case"boolean":o=isBoolean(e);break;case"function":o=isFunction(e);break;case"arraybuffer":o=isArrayBuffer(e);break;case"array":o=isArray(e);break;case"hexcolor":o=isHexcolor(e);break;case"null":o=isNull(e);break;case"undefined":o=isUndefined(e);break;default:throw new Error("The param dataType is unsupport")}return o}class MediaLibraryBase{static getPermissions(){try{let e=["ohos.permission.SHORT_TERM_WRITE_IMAGEVIDEO"],t=abilityAccessCtrl.createAtManager();return new Promise(o=>{t.requestPermissionsFromUser(context,e).then(e=>{var t=e.authResults[0],e=e.dialogShownResults[0];o({perNum:t,dialogShownResults:e})})})}catch(e){console.error("[AdvancedAPI] getPermissions is fail!",JSON.stringify(e))}}static getMediaType(e){return photoAccessHelper.PhotoType[e]}static getFileKey(){return photoAccessHelper.PhotoKeys}static getMedia(){return photoAccessHelper.getPhotoAccessHelper(context)}static async createAsset(e,t,o){var a=o.split(".").pop().toString(),o=o.split(".").shift().toString();return e.createAsset(t,a,{title:o})}static closeAsset(e,o){return new Promise(t=>{e.close(o,e=>{t(void 0===e)})})}static getFd(e){return new Promise(t=>{e.open("rw").then(e=>{t(e)}).catch(()=>{t(!1)})})}}function switchInternalToHapSandBox(e){return e.startsWith("internal://bundle/")?e.replace("internal://bundle",context.bundleCodeDir):e.startsWith("internal://cache/")?e.replace("internal://cache",context.cacheDir):e.startsWith("internal://files/")?e.replace("internal://files",context.filesDir):e.startsWith("internal://preferences/")?e.replace("internal://preferences",context.preferencesDir):e.startsWith("internal://temp/")?e.replace("internal://temp",context.tempDir):e.startsWith("internal://database/")?e.replace("internal://database",context.databaseDir):e.startsWith("internal://distributedFiles/")?e.replace("internal://distributedFiles",context.distributedFilesDir):e}function switchHapSandBoxToInternal(e){return e.startsWith(context.bundleCodeDir)?e.replace(context.bundleCodeDir,"internal://bundle"):e.startsWith(context.cacheDir)?e.replace(context.cacheDir,"internal://cache"):e.startsWith(context.filesDir)?e.replace(context.filesDir,"internal://files"):e.startsWith(context.preferencesDir)?e.replace(context.preferencesDir,"internal://preferences"):e.startsWith(context.tempDir)?e.replace(context.tempDir,"internal://temp"):e.startsWith(context.databaseDir)?e.replace(context.databaseDir,"internal://database"):e.startsWith(context.distributedFilesDir)?e.replace(context.distributedFilesDir,"internal://distributedFiles"):e}function isFileUri(e){return e&&"string"==typeof e&&(e.startsWith("file://")||e.startsWith("datashare://"))}function isSandboxPath(e){return e&&"string"==typeof e&&(e.startsWith("/data/storage/")||e.startsWith("internal://"))}function getFdFromUriOrSandBoxPath(t){try{return fs.openSync(t,fs.OpenMode.READ_ONLY).fd}catch(e){console.info(`[AdvancedAPI] Can not get file from uri: ${t} `)}throw new Error("file is not exist")}async function getFileAssetFromUri(e){try{-1===(await MediaLibraryBase.getPermissions()).perNum&&console.debug("[AdvancedAPI] permission fail");var t=photoAccessHelper.getPhotoAccessHelper(context),o=new dataSharePredicates.DataSharePredicates,a=(console.debug(`[AdvancedAPI] getFileAssetFromUri uri: ${e} `),o.equalTo(photoAccessHelper.PhotoKeys.URI,e.toString()),{fetchColumns:[photoAccessHelper.PhotoKeys.URI,photoAccessHelper.PhotoKeys.PHOTO_TYPE,photoAccessHelper.PhotoKeys.SIZE,photoAccessHelper.PhotoKeys.DURATION,photoAccessHelper.PhotoKeys.WIDTH,photoAccessHelper.PhotoKeys.HEIGHT,photoAccessHelper.PhotoKeys.TITLE,photoAccessHelper.PhotoKeys.ORIENTATION],predicates:o}),r=await t.getAssets(a),s=(console.debug(`[AdvancedAPI] getFileAssetFromUri fetchResult: ${JSON.stringify(r)} `),await r.getFirstObject());return console.debug(`[AdvancedAPI] getFileAssetFromUri asset: ${JSON.stringify(s)} `),r.close(),s}catch(e){console.debug("[AdvancedAPI] getAsset is fail!,"+e)}}function pathToCache(e){try{var t=switchInternalToHapSandBox(e),o=t.slice(t.lastIndexOf("/")),a=context.cacheDir+o;return fs.copyFile(t,a,e=>{e&&console.info("[AdvancedAPI] Failed to copy: "+JSON.stringify(e))}),switchHapSandBoxToInternal(a)}catch(e){console.error("[AdvancedAPI] to copy: "+JSON.stringify(e))}}async function saveMedia(e,t,o,a){try{var r=photoAccessHelper.getPhotoAccessHelper(context),s=t.split(".").pop().toString(),i=[{title:t.split(".").shift().toString().toString(),fileNameExtension:s.toString(),photoType:e}],n=[o.toString()],c=(await r.showAssetsCreationDialog(n,i))[0],l=fs.openSync(c,fs.OpenMode.READ_WRITE);return await fs.write(l.fd,a),fs.closeSync(l),c}catch(e){console.error("[AdvancedAPI] saveMedia is fail!: "+JSON.stringify(e))}}function arrayBufferToBase64(e){return requireAPI("ASBuffer").arrayBufferToBase64(e)}let errMsgMap=new Map([[401,"Parameter error"],[201,"Permission denied"],[2300003,"URL using bad/illegal format or missing URL"],[2300006,"Could not resolve host name"],[2300007,"Couldn not connect to server"],[2300009,"Access denied to remote resource"],[2300023,"Failed writing received data to disk/application"],[2300025,"Upload failed"],[2300026,"Failed to open/read local data from file/application"],[2300028,"Timeout was reached"],[2300073,"Remote file already exists"],[2300078,"Remote file not found"],[2300999,"Unknown Other Error"]]);class ASRequest{request(e){return console.debug("[AdvancedAPI] ASRequest request"),new RequestTask(e)}uploadFile(e){return console.debug("[AdvancedAPI] ASRequest uploadFile : %s",JSON.stringify(e)),new UploadTask(e)}downloadFile(e){return console.debug("[AdvancedAPI] ASRequest downloadFile %s",JSON.stringify(e)),new DownloadTask(e)}}class RequestTask{constructor(s){let{url:i,header:a,method:n="GET",timeout:c,responseType:l,enableCache:d}=s||{},h=(s||{}).data,{success:u,fail:p,complete:f}=s||{};if(this.abortFlag=!1,this.fail=p,this.complete=f,this.httpRequest=http.createHttp(),this.headersCallback=new Map,s){let e=!1;for(var A in a)if("content-type"===A.toLowerCase()){a[A].toLowerCase().includes("application/x-www-form-urlencoded")&&(e=!0);break}if(h&&(e||["GET","OPTIONS","DELETE","TRACE","CONNECT"].includes(n))){var g,m=[];for(g in h)m.push(encodeURIComponent(g)+"="+encodeURIComponent(h[g]));h=m.join("&")}if(a)for(var y in a)a[y]=""+a[y];let t={method:n,extraData:h||{},header:a,expectDataType:l&&"arraybuffer"===l?http.HttpDataType.ARRAY_BUFFER:http.HttpDataType.STRING,usingCache:d||!1},o=!1,r=setTimeout(()=>{var e;console.error("[AdvancedAPI] request error: Timeout was reached"),o=!0,p&&!this.abortFlag&&(this.result=e={errMsg:"Timeout was reached"},p(e)),f&&!this.abortFlag&&f(this.result),this.httpRequest&&(this.httpRequest.destroy(),this.httpRequest=void 0)},c||6e4);this.httpRequest.request("string"==typeof i?i:"",t).then(a=>{if(clearTimeout(r),console.debug("[AdvancedAPI] request url %s success",i),u&&!this.abortFlag){let e=a.result,t=!1,o=(s||{}).responseType;if(o&&"json"!==o)"[object ArrayBuffer]"===Object.prototype.toString.call(e)&&(e=arrayBufferToBase64(e),t=!0);else if("string"==typeof a.result)try{e=JSON.parse(e)}catch(e){}o={isArrayBuffer:!1,data:e,statusCode:a.responseCode,header:a.header,cookies:"string"==typeof a.cookies?a.cookies?[a.cookies]:[]:a.cookies,errMsg:"request:ok"},t&&(o.isArrayBuffer=!0),this.result=o,u(o)}}).catch(e=>{clearTimeout(r),o||(console.error("[AdvancedAPI] request error: "+JSON.stringify(e)),p&&!this.abortFlag&&(e={errMsg:errMsgMap.has(e.code)?errMsgMap.get(e.code):"Unknown Error"},this.result=e,p(e)))}).finally(()=>{o||(f&&!this.abortFlag&&f(this.result),this.httpRequest&&(this.httpRequest.destroy(),this.httpRequest=void 0))})}else console.error("[AdvancedAPI] request error: params illegal")}abort(){console.debug("[AdvancedAPI] request abort"),this.abortFlag=!0,this.httpRequest&&(this.httpRequest.destroy(),this.httpRequest=void 0,this.res={errMsg:"request:fail abort"},this.fail&&this.fail(this.res),this.complete)&&this.complete(this.res)}onHeadersReceived(t){var e=e=>{this.abortFlag||t({header:e})};t?this.headersCallback.has(t)||(this.headersCallback.set(t,e),this.httpRequest&&this.httpRequest.on("headersReceive",e)):console.error("[AdvancedAPI] Invalid, callback is null")}offHeadersReceived(e){e?this.headersCallback.has(e)?(this.httpRequest&&this.httpRequest.off("headersReceive",this.headersCallback.get(e)),this.headersCallback.delete(e)):console.debug("[AdvancedAPI] offHeadersReceived callback invalid"):(this.headersCallback.clear(),this.httpRequest&&this.httpRequest.off("headersReceive"))}}class UploadTask{constructor(e){var{url:t,files:o,filePath:a,name:r,header:s,formData:i}=e||{};let{success:n,fail:c,complete:l}=e||{},d=(e=a.startsWith("internal://cache/")?a:pathToCache(a),this.progressCallback=new Map,this.headersCallback=new Map,[]);o?o.forEach(function(e){var t,o;"string"==typeof e.uri&&(t=e.uri.substring(e.uri.lastIndexOf("/")+1),o=e.uri.substring(e.uri.lastIndexOf(".")+1),d.push({filename:t,name:e.name,uri:e.uri,type:o}))}):"string"==typeof e&&(a=e.substring(e.lastIndexOf("/")+1),o=e.substring(e.lastIndexOf(".")+1),d.push({filename:a,name:r,uri:e,type:o}));var h,u,p=[];for([h,u]of Object.entries(i||{}))p.push({name:h,value:"string"==typeof u?u:JSON.stringify(u)});a={url:t,header:s||{},method:"POST",files:d,data:p},this.successHandle=e=>{n&&n(e),l&&l(e)},this.failHandle=e=>{c&&c(e),l&&l(e)};try{console.debug("[AdvancedAPI] request upload"),request$1.uploadFile(globalThis.abilityContext,a).then(e=>{if(this.uploadTask=e,this.abortFlag&&(this.abortFlag=!1,this.uploadTask.delete(()=>{this.res={errMsg:"uploadFile:fail abort"},this.failHandle(this.res)})),this.progressFlag){this.progressFlag=!1;for(var t of this.progressCallback.values())this.uploadTask.on("progress",t)}if(this.headersFlag){this.headersFlag=!1;for(var o of this.headersCallback.values())this.uploadTask.on("headerReceive",o)}this.uploadTask.on("headerReceive",this.headersReceivedHandle.bind(this)),this.uploadTask.on("complete",()=>{var e;console.debug("[AdvancedAPI] upload success"),this.res={data:(null==(e=this.receivedData)?void 0:e.body)||{},header:(null==(e=this.receivedData)?void 0:e.headers)||{},cookies:[],statusCode:200,errMsg:"uploadFile:ok"},this.successHandle(this.res)}),this.uploadTask.on("fail",()=>{console.debug("[AdvancedAPI] upload fail"),this.res={errMsg:"uploadFile:fail"},this.failHandle(this.res)})}).catch(e=>{console.error("[AdvancedAPI] upload request error: "+e.message),this.res={errMsg:"uploadFile:fail "+e.message},this.failHandle(this.res)})}catch(e){console.error("[AdvancedAPI] upload request err.code : "+e.code+", err.message : "+e.message),this.res={errMsg:"uploaddFile:fail "+e.message},this.failHandle(this.res)}}abort(){this.res={errMsg:"uploadFile:fail abort"},this.uploadTask?this.uploadTask.delete(()=>{this.failHandle(this.res)}):this.abortFlag=!0}onProgressUpdate(o){function e(e,t){o({progress:Math.ceil(100*e/t),totalBytesSent:e,totalBytesExpectedToSend:t})}o?this.progressCallback.has(o)||(this.progressCallback.set(o,e),this.uploadTask?this.uploadTask.on("progress",e):this.progressFlag=!0):console.error("[AdvancedAPI] Invalid, callback is null")}offProgressUpdate(e){e?this.progressCallback.has(e)?(this.uploadTask&&this.uploadTask.off("progress",this.progressCallback.get(e)),this.progressCallback.delete(e)):console.debug("[AdvancedAPI] offProgressUpdate callback invalid"):(this.progressCallback.clear(),this.uploadTask&&this.uploadTask.off("progress"))}headersReceivedHandle(e){this.receivedData=e}onHeadersReceived(t){var e=e=>{this.abortFlag||t({header:e.headers||{}})};t?this.headersCallback.has(t)||(this.headersCallback.set(t,e),this.uploadTask?this.uploadTask.on("headerReceive",e):this.headersFlag=!0):console.error("[AdvancedAPI] Invalid, callback is null")}offHeadersReceived(e){e?this.headersCallback.has(e)?(this.uploadTask&&this.uploadTask.off("headerReceive",this.headersCallback.get(e)),this.headersCallback.delete(e)):console.debug("[AdvancedAPI] offHeadersReceived callback invalid"):(this.headersCallback.clear(),this.uploadTask&&(this.uploadTask.off("headerReceive"),this.uploadTask.on("headerReceive",this.headersReceivedHandle.bind(this))))}}class DownloadTask{constructor(e){let{url:t,header:o,filePath:a}=e||{},{success:r,fail:s,complete:i}=e||{},n=(this.progressCallback=new Map,"string"==typeof t&&(e=(new Date).getTime(),this.filename="Download_"+e+"_"+t.substring(t.lastIndexOf("/")+1).replace(/[^a-zA-Z0-9.]/,"").slice(-16)),a||"internal://cache/"+this.filename);e=switchInternalToHapSandBox(n),e={url:this.isEncodeUri(t)?t:encodeURI(t),header:o||{},filePath:e},this.successHandle=e=>{r&&r(e),i&&i(e)},this.failHandle=e=>{s&&s(e),i&&i(e)};try{console.debug("[AdvancedAPI] request download"),request$1.downloadFile(globalThis.abilityContext,e).then(e=>{if(this.downloadTask=e,this.abortFlag&&(this.abortFlag=!1,this.downloadTask.delete(()=>{console.debug("[AdvancedAPI] download fail"),this.res={errMsg:"downloadFile:fail abort"},this.failHandle(this.res)})),this.progressFlag){this.progressFlag=!1;for(var t of this.progressCallback.values())this.downloadTask.on("progress",t)}this.downloadTask.on("complete",()=>{console.debug("[AdvancedAPI] download success"),this.res={tempFilePath:n,statusCode:200,errMsg:"downloadFile:ok"},a&&Object.assign(this.res,{filePath:a}),this.downloadTask.getTaskInfo().then(e=>{console.debug("[AdvancedAPI] download info: %s",JSON.stringify(e)),e.downloadTotalBytes&&Object.assign(this.res,{dataLength:e.downloadTotalBytes})}).catch(e=>{console.error("[AdvancedAPI] download request get task info error: "+e.message)}).finally(()=>{this.successHandle(this.res)})}),this.downloadTask.on("fail",()=>{console.debug("[AdvancedAPI] download fail"),this.res={errMsg:"downloadFile:fail"},this.failHandle(this.res)})}).catch(e=>{console.error("[AdvancedAPI] download request error: "+e.message),this.res={errMsg:"downloadFile:fail "+e.message},this.failHandle(this.res)})}catch(e){console.error("[AdvancedAPI] download request err.code : "+e.code+", err.message : "+e.message),this.res={errMsg:"downloadFile:fail "+e.message},this.failHandle(this.res)}}abort(){this.downloadTask?this.downloadTask.delete(()=>{console.debug("[AdvancedAPI] download fail"),this.res={errMsg:"downloadFile:fail abort"},this.failHandle(this.res)}):this.abortFlag=!0}onProgressUpdate(o){function e(e,t){o({progress:Math.ceil(100*e/t),totalBytesWritten:e,totalBytesExpectedToWrite:t})}o?this.progressCallback.has(o)||(this.progressCallback.set(o,e),this.downloadTask?this.downloadTask.on("progress",e):this.progressFlag=!0):console.error("[AdvancedAPI] Invalid, callback is null")}offProgressUpdate(e){e?this.progressCallback.has(e)?this.downloadTask&&(this.downloadTask.off("progress",this.progressCallback.get(e)),this.progressCallback.delete(e)):console.debug("[AdvancedAPI] offProgressUpdate callback invalid"):(this.progressCallback.clear(),this.downloadTask&&this.downloadTask.off("progress"))}onHeadersReceived(e){console.debug("[AdvancedAPI] onHeadersReceived not support")}offHeadersReceived(e){console.debug("[AdvancedAPI] offHeadersReceived not support")}isEncodeUri(e){return!e||/^[a-zA-Z0-9-_.!~*'();/?:@&=+$,#]+$/.test(e)}}let SCAN_MODE={LIMITED:5,DURATION:0};class BluetoothBase{static getPermissions(){let t=["ohos.permission.ACCESS_BLUETOOTH"],o=abilityAccessCtrl.createAtManager();return new Promise(async e=>{0===(await o.requestPermissionsFromUser(context,t)).authResults[0]?e(!0):e(!1)})}static onStateChange(e){try{return access.on("stateChange",e)}catch(e){console.warn("[AdvancedAPI] on bondStateChange fail")}}static on(e){try{return connection.on("bluetoothDeviceFind",e)}catch(e){console.warn("[AdvancedAPI] on fail")}}static onBLE(e){try{ble.on("BLEDeviceFind",e)}catch(e){console.warn("[AdvancedAPI] BLE.on.BLEDeviceFind fail")}}static createGattClientDevice(e){try{return ble.createGattClientDevice(e)}catch(e){console.warn("[AdvancedAPI] createGattClientDevice fail")}}static enableBluetooth(){try{return access.enableBluetooth()}catch(e){console.warn("[AdvancedAPI] enableBluetooth fail")}}static disableBluetooth(){try{return access.disableBluetooth()}catch(e){console.warn("[AdvancedAPI] disableBluetooth fail")}}static bluetoothState(){try{return access.getState()}catch(e){console.error("[AdvancedAPI] getState fail, errCode: "+e.code+", errMessage: "+e.message)}}static startBluetoothDiscovery(){connection.setBluetoothScanMode(connection.ScanMode.SCAN_MODE_LIMITED_DISCOVERABLE,SCAN_MODE.DURATION);try{return connection.startBluetoothDiscovery()}catch(e){console.warn("[AdvancedAPI] startBluetoothDiscovery fail")}}static off(){try{return connection.off("bluetoothDeviceFind")}catch(e){console.warn("[AdvancedAPI] off fail")}}static getRemoteDeviceName(e){try{return connection.getRemoteDeviceName(e)}catch(e){console.warn("[AdvancedAPI] getRemoteDeviceName fail")}}static stopBluetoothDiscovery(){try{return connection.stopBluetoothDiscovery()}catch(e){console.warn("[AdvancedAPI] no need to stop")}}static startBLEScan(e){try{ble.startBLEScan(null,{interval:e,dutyMode:ble.ScanDuty.SCAN_MODE_LOW_POWER,matchMode:ble.MatchMode.MATCH_MODE_AGGRESSIVE})}catch(e){console.error("[QAFAPI] startBLEScan errCode:"+e.code+",errMessage:"+e.message)}}static stopBLEScan(){try{ble.stopBLEScan()}catch(e){console.error("[QAFAPI] stopBLEScan errCode:"+e.code+",errMessage:"+e.message)}}static offBLE(){try{ble.off("BLEDeviceFind")}catch(e){console.warn("[AdvancedAPI] BLE.off.BLEDeviceFind fail")}}static getProfile(e){try{return bluetoothManager.getProfileInstance(e).getConnectionDevices()}catch(e){console.warn("[AdvancedAPI] getProfileInstance fail")}}static getConnectedBLEDevices(){try{return ble.getConnectedBLEDevices()}catch(e){console.error("[AdvancedAPI]getConnectedBLEDevices errCode:"+e.code+",errMessage:"+e.message)}}}function jsMethod(s){return(e,t,o)=>{var a=s&&s.common?e.constructor._jsBaseMethods=e.constructor._jsBaseMethods||{}:e.constructor._jsMethods=e.constructor._jsMethods||{},e=void 0!==(s=void 0!==s?s:{}).alias?s.alias:t,r=void 0===s.callback||s.callback;a[e]={methodName:t,callback:r}}}class PromptBase{static showToast(o){return new Promise((e,t)=>{promptAction.showToast(o),e()})}static showDialog(o,a){return new Promise((e,t)=>{promptAction.showDialog(o,a)})}static showActionMenu(o,a){return new Promise((e,t)=>{promptAction.showActionMenu(o,a)})}static ohosShowDialog(e){return promptAction.showDialog(e)}}let BLESTATE={STATE_ON:2,STATE_OFF:0,INDEX:1,STATE_CONNECTED:2,STATE_DISCONNECTED:0},DEFAULT={OPEN:!1,OPEN_MSG:"快应用加载器想要开启蓝牙",CLOSE_MSG:"快应用加载器请求关闭蓝牙",ALLOW_BUTTON:"允许",REFUSE_BUTTON:"拒绝"},BluetoothBaseModule=(_dec=jsMethod({alias:"openAdapter",common:!1,callback:!0}),_dec2=jsMethod({alias:"closeAdapter",common:!1,callback:!0}),_dec3=jsMethod({alias:"getAdapterState",common:!1,callback:!0}),_dec4=jsMethod({alias:"startDevicesDiscovery",common:!1,callback:!0}),_dec5=jsMethod({alias:"stopDevicesDiscovery",common:!1,callback:!0}),_dec6=jsMethod({alias:"getDevices",common:!1,callback:!0}),_dec7=jsMethod({alias:"getConnectedDevices",common:!1,callback:!0}),_dec8=jsMethod({alias:"createBLEConnection",common:!1,callback:!0}),_dec9=jsMethod({alias:"closeBLEConnection",common:!1,callback:!0}),_dec10=jsMethod({alias:"getBLEDeviceServices",common:!1,callback:!0}),_dec11=jsMethod({alias:"getBLEDeviceCharacteristics",common:!1,callback:!0}),_dec12=jsMethod({alias:"readBLECharacteristicValue",common:!1,callback:!0}),_dec13=jsMethod({alias:"writeBLECharacteristicValue",common:!1,callback:!0}),_dec14=jsMethod({alias:"notifyBLECharacteristicValueChange",common:!1,callback:!0}),_applyDecoratedDescriptor((_class=class{constructor(){_defineProperty(this,"BLECharacteristicCallback",e=>{console.debug("[AdvancedAPI] characteristicChange triger valueChange:"+JSON.stringify(e));var t,{serviceUuid:o,characteristicUuid:a}=e,e=new Uint8Array(e.characteristicValue),r={deviceId:this.deviceIdBle,serviceId:o,characteristicId:a,value:e};for(t of this.BLECharacteristicListeners)t(r)}),this.onadapterstatechange,this.ondevicefound,this.allowDuplicatesKey=!1,this.interval=0,this.state={available:BluetoothBase.bluetoothState()===BLESTATE.STATE_ON,discovering:!1},this.deviceIdBle,this.scanResult=[],this.gattClient=null,this.isOnBle={mode:!1},this.stateBLE={},this.services=[],this.bleCharacteristic={},this.characteristicValue=null,this.isInit=!1,this.devicesFoundListeners=[],this.adapterStateChangeListeners=[],this.BLEConnectionStateListeners=[],this.BLECharacteristicListeners=[]}openAdapter(e){let{operateAdapter:a=DEFAULT.OPEN}=e||{},r=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise((t,o)=>{r?t([["bluetooth is turned"]]):a?this.promptTemp(DEFAULT.OPEN_MSG).then(e=>{e.index===BLESTATE.INDEX?(BluetoothBase.enableBluetooth()&&t([[BLHErrorCode.OK]]),this.state.available=!0):o([["user reject",BLHErrorCode.SYSTEM_ERROR]])}):o([["not available",BLHErrorCode.NOT_AVAILABLE]])})}closeAdapter(e){let{operateAdapter:o=DEFAULT.OPEN}=e||{},a=BluetoothBase.bluetoothState()===BLESTATE.STATE_OFF;return new Promise((t,e)=>{a?e([["bluetooth is not turned",BLHErrorCode.NOT_INIT]]):o?this.promptTemp(DEFAULT.CLOSE_MSG).then(e=>{if(e.index===BLESTATE.INDEX){BluetoothBase.disableBluetooth()&&t([[BLHErrorCode.OK]]),this.state.available=!1;try{BluetoothBase.offBLE()}catch(e){console.error("[QAFAPI] OpenHarmony Error ondevicefound,error Message:"+e)}}}):t([["closeBluetoothAdapter success"]])})}getAdapterState(){let t=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise(e=>{e({discovering:this.state.discovering,available:t})})}startDevicesDiscovery(i){let t=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise((e,o)=>{if(t){if(i){var{services:a,allowDuplicatesKey:r,interval:s}=i;if(a&&!isArray(a)||r&&!isBoolean(r)||s&&!isNumber(s))return void o([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);let t=[];if(a){if(!a.every(e=>(t.push({serviceUuid:e}),isUuid(e.toLowerCase()))))return void o([["uuid invalid",BLHErrorCode.NO_DEVICE]]);this.isOnBle.mode=!0}else t=null;r&&(this.allowDuplicatesKey=r),s&&(this.interval=s)}BluetoothBase.startBLEScan(this.interval),BluetoothBase.startBluetoothDiscovery()?(this.state.discovering=!0,e("ok")):o([["[QAFAPI] openHarmony startBluetoothDiscovery fail",BLHErrorCode.CONNECTION_FAIL]])}else o([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}stopDevicesDiscovery(){return new Promise((e,t)=>{var o;BluetoothBase.bluetoothState()?(BluetoothBase.stopBLEScan(),o=BluetoothBase.stopBluetoothDiscovery(),this.state.discovering=!1,o?(e("ok"),this.devicesFoundListeners=[],this.isOnBle.mode=!1,this.interval=0,this.allowDuplicatesKey=!1):e("ok")):t(["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE])})}getDevices(){let o=BluetoothBase.bluetoothState()===BLESTATE.STATE_ON;return new Promise((e,t)=>{o?e([[{devices:this.scanResult}]]):t([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}saveDevice(e){!this.allowDuplicatesKey&&this.isRepeat(this.scanResult,e.deviceId)||this.scanResult.push(e)}onFoundEvent(e){let a=this.getTemp();if(e[0]&&e[0].deviceId){var{deviceId:t,rssi:o,data:r}=e[0];a.deviceId=t,a.RSSI=o,a.serviceData=r;try{let o=BluetoothBase.createGattClientDevice(t);o.connect(),o.getDeviceName((e,t)=>{a.name=t,a.localName=t;try{o.disconnect(),o.close()}catch(e){console.warn("[QAFAPI] close client fail: "+JSON.stringify(e))}this.saveDevice(a)})}catch(e){console.warn("[QAFAPI] close client fail: "+JSON.stringify(e))}}else a.deviceId=e[0],a.name=BluetoothBase.getRemoteDeviceName(a.deviceId),a.localName=a.name,console.debug("[QAFAPI] onFoundEvent:"+JSON.stringify(a)),this.saveDevice(a)}getConnectedDevices(a){return new Promise((e,t)=>{if(BluetoothBase.bluetoothState()===BLESTATE.STATE_ON)if(a&&a.services&&isArray(a.services)&&0!==a.services.length){console.debug("[QAFAPI] services : "+JSON.stringify(a.services));var o=a.services.every(e=>isUuid(e.toLowerCase()))||!1;if(a&&o){let o=[];try{o=BluetoothBase.getConnectedBLEDevices()}catch(e){console.error("[QAFAPI] errCode:"+e.code+",errMessage:"+e.message)}console.debug("[QAFAPI] BleDeviceIds = "+JSON.stringify(o));try{[1,4,6,7].forEach(e=>{e=BluetoothBase.getProfile(e),console.error("[QAFAPI] profiles"+JSON.stringify(e)),e&&(o=[...o,...e])})}catch(e){console.error("[QAFAPI] getProfile fail"+e)}if((o=o.reduce((e,t)=>e.includes(t)?e:[...e,t],[]))&&0!==o.length){let t=[];o.forEach(e=>{t.push({name:BluetoothBase.getRemoteDeviceName(e),deviceId:e})}),e([[{devices:t}]])}else t([["no device",BLHErrorCode.NO_DEVICE]])}else console.debug("[QAFAPI] invalidParam services "),t([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else t([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);else t([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}createBLEConnection(e){let{deviceId:a,timeout:r}=e||{};return new Promise((t,o)=>{if(BluetoothBase.bluetoothState()===BLESTATE.STATE_ON)if(r&&!isNumber(r))o([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);else if(a&&isString(a)){this.gattClient=BluetoothBase.createGattClientDevice(a),this.gattClient.on("BLEConnectionStateChange",e=>{var t=2===e.state;this.stateBLE[e.deviceId]!==t&&(this.stateBLE[e.deviceId]=t)});try{this.gattClient.on("BLECharacteristicChange",this.BLECharacteristicCallback),console.debug("[AdvancedAPI] BLECharacteristicChange Registration succeeded.")}catch(e){console.error("AdvancedAPI BLECharacteristicChange Registration fail "+e.message)}let e=this.gattClient.connect();r?setTimeout(()=>{e?(t("ok"),this.deviceIdBle=a):o([["connection timed out",BLHErrorCode.CONNECTION_FAIL]])},r):e?(t("ok"),this.deviceIdBle=a):o([["fail connection",BLHErrorCode.CONNECTION_FAIL]])}else o([["invalidParam",BLHErrorCode.SYSTEM_ERROR]]);else o([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]])})}closeBLEConnection(e){let o=(e||{}).deviceId;return new Promise((e,t)=>{if(o&&isString(o))try{this.gattClient.disconnect(),this.gattClient.close(),this.gattClient=null,this.stateBLE[o]=!1,e("ok")}catch(e){t([["Failed to disconnect the Bluetooth connection",BLHErrorCode.SYSTEM_ERROR]])}else t([["Deviceid must be written",BLHErrorCode.SYSTEM_ERROR]])})}getBLEDeviceServices(e){let o=(e||{}).deviceId;return new Promise((t,e)=>{if(o&&isString(o))if(isMac(o))if(BluetoothBase.bluetoothState()===BLESTATE.STATE_ON){console.debug("[QAFAPI] getServices deviceId:"+o+" this.deviceIdBLE = "+this.deviceIdBle);let e;this.gattClient&&o===this.deviceIdBle?(console.debug("[QAFAPI] getServices deviceId:"+o),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(o)).connect(),this.gattClient=e,this.deviceIdBle=o),e.getServices().then(e=>{let o=[];e.forEach(e=>{console.debug("[QAFAPI] getServices services = "+JSON.stringify(e));var{serviceUuid:e,isPrimary:t}=e,e={uuid:e,isPrimary:t};o.push(e)}),this.services=e,t([[{services:o}]])}).catch(e=>{console.error("[QAFAPI] getServices fail:"+JSON.stringify(e)),t([[{services:[]}]])})}else e([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]]);else e([["deviceId is not MAC",BLHErrorCode.SYSTEM_ERROR]]);else e([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}getBLEDeviceCharacteristics(e){return new Promise((r,s)=>{if(e){let{deviceId:t,serviceId:a}=e;if(console.info("[QAFAPI] getBLEDeviceCharacteristics deviceId:"+t+" serviceId = "+a),t&&isString(t)&&a&&isString(a)){console.info("[QAFAPI] getBLEDeviceCharacteristics deviceId:"+t+" this.deviceIdBLE = "+this.deviceIdBle);let e;this.gattClient&&t===this.deviceIdBle?(console.info("[QAFAPI] getBLEDeviceCharacteristics deviceId:"+t),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(t)).connect(),this.gattClient=e,this.deviceIdBle=t),e.getServices().then(e=>{let o;if(this.services.forEach(e=>{console.info("[QAFAPI] serviceId = "+JSON.stringify(e)),e.serviceUuid===a&&(o=e)}),o){let t=[];(this.bleDescriptor=o).characteristics.forEach(e=>{console.info("[QAFAPI] Servicesfound item = "+JSON.stringify(e)),t.push({uuid:e.characteristicUuid,properties:e.properties})}),r([[{characteristics:t}]])}else s([["Service not found",BLHErrorCode.NO_SERVICE]])}).catch(e=>{console.error("[QAFAPI] OpenHarmony Error getServices value,error Message:"+e),s([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])})}else s([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else s([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}readBLECharacteristicValue(e){return new Promise((i,n)=>{if(e){let{deviceId:a,serviceId:r,characteristicId:s}=e;isString(a)&&isString(r)&&isString(s)&&a&&r&&isUuid(r.toLowerCase())&&s&&isUuid(s.toLowerCase())?isMac(a.toLowerCase())?this.queryBLECharacteristic(a,r).then(e=>{var t=[],e={serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),descriptorUuid:e.descriptorUuid,descriptorValue:e.descriptorValue},e=(t.push(e),{serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),characteristicValue:this.characteristicValue,descriptors:t}),t=(console.debug("[QAFAPI] characteristicIn = "+JSON.stringify(e)),null);let o;if(this.gattClient&&this.deviceIdBle===a)try{o=this.gattClient.readCharacteristicValue(e)}catch(e){n([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]readBLECharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}else try{t=BluetoothBase.createGattClientDevice(a),o=t.readCharacteristicValue(e)}catch(e){n([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]readBLECharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}o?o.then(e=>{i([e])}).catch(e=>{console.error("[AdvancedAPI] Failed to read characteristic value"+e.message),n([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}):n([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}).catch(e=>{n([["Bluetooth not available",BLHErrorCode.SYSTEM_ERROR]])}):n([["deviceId is not MAC",BLHErrorCode.SYSTEM_ERROR]]):n([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else n([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}writeBLECharacteristicValue(e){return new Promise((n,c)=>{if(e){let{deviceId:a,serviceId:r,characteristicId:s,value:i}=e;isString(a)&&isString(r)&&isString(s)&&isArrayBuffer(i)&&isMac(a)&&a&&r&&isUuid(r.toLowerCase())&&s&&isUuid(s.toLowerCase())&&isLower(s.toLowerCase())&&i?this.queryBLECharacteristic(a,r).then(e=>{var t=[],e={serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),descriptorUuid:e.descriptorUuid,descriptorValue:e.descriptorValue},e=(t.push(e),{serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),characteristicValue:i,descriptors:t}),t=(console.debug("[QAFAPI] characteristicIn = "+JSON.stringify(e)),null);let o;if(this.gattClient&&this.deviceIdBle===a)try{o=this.gattClient.writeCharacteristicValue(e)}catch(e){c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]writeCharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}else try{t=BluetoothBase.createGattClientDevice(a),o=t.writeCharacteristicValue(e)}catch(e){c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),console.error("[QAFAPI]readBLECharacteristicValue errCode:"+e.code+",errMessage:"+e.message)}o?n("ok"):c([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}).catch(e=>{c([["Bluetooth not available",BLHErrorCode.SYSTEM_ERROR]])}):c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}queryBLECharacteristic(t,r){return new Promise((o,a)=>{if(this.descriptors&&t.toLowerCase()===this.deviceIdBle.toLowerCase())o(this.descriptors);else{let e;this.gattClient&&t.toLowerCase()===this.deviceIdBle.toLowerCase()?(console.info("[QAFAPI] queryBLECharacteristic deviceId:"+t),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(t)).connect(),this.gattClient=e,this.deviceIdBle=t),e.getServices().then(e=>{let t;e.forEach(e=>{e.serviceUuid.toLowerCase()===r.toLowerCase()&&(t=e)}),t?t.characteristics.forEach(e=>{e.serviceUuid.toLowerCase()===r.toLowerCase()?(this.characteristicValue=e.characteristicValue,e.descriptors.forEach(e=>{e.serviceUuid.toLowerCase()===r.toLowerCase()?(this.descriptors=e,console.info("[QAFAPI] Servicesfound descriptor = "+JSON.stringify(e)),o(this.descriptors)):a([["characteristics not found",BLHErrorCode.NO_SERVICE]])})):(console.error("[AdvancedAPI] characteristics not found"),a([["characteristics not found",BLHErrorCode.NO_SERVICE]]))}):a([["Service not found",BLHErrorCode.NO_SERVICE]])}).catch(e=>{console.error("[AdvancedAPI] getServices fail:"+e.message),a([["Service not found",BLHErrorCode.NO_SERVICE]])})}})}notifyBLECharacteristicValueChange(e){return new Promise((n,c)=>{if(e){let{deviceId:a,serviceId:r,characteristicId:s,state:i}=e;a&&isString(a)&&r&&isString(r)&&isUuid(r.toLowerCase())&&s&&isString(s)&&isUuid(s.toLowerCase())&&i&&isBoolean(i)?isMac(a.toLowerCase())?this.queryBLECharacteristic(a,r).then(e=>{console.debug("[QAFAPI] desc = "+JSON.stringify(e));var t=[],e={serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),descriptorUuid:e.descriptorUuid,descriptorValue:e.descriptorValue},e=(t.push(e),{serviceUuid:r.toLowerCase(),characteristicUuid:s.toLowerCase(),characteristicValue:this.characteristicValue,descriptors:t}),t=(console.debug("[QAFAPI] BLECharacteristic = "+JSON.stringify(e)),null);let o;if(this.gattClient&&this.deviceIdBle===a)try{o=this.gattClient.setNotifyCharacteristicChanged(e,i)}catch(e){return c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),void console.error("[QAFAPI]setNotifyCharacteristicChanged errCode:"+e.code+",errMessage:"+e.message)}else try{t=BluetoothBase.createGattClientDevice(a),o=t.setNotifyCharacteristicChanged(e,i)}catch(e){return c([[e.message,ErrorCode$1.PARAMETER_ERROR]]),void console.error("[QAFAPI]setNotifyCharacteristicChanged errCode:"+e.code+",errMessage:"+e.message)}o?(console.debug("[QAFAPI] notify success"),n("ok")):c([["property not support",BLHErrorCode.PROPERTY_NOT_SUPPORT]])}):c([["deviceId is not MAC",BLHErrorCode.SYSTEM_ERROR]]):c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])}else c([["invalidParam",BLHErrorCode.SYSTEM_ERROR]])})}getBLEDeviceRSSI(a){return new Promise((t,o)=>{if(this.gattClient&&this.deviceIdBle===a)this.gattClient.getRssiValue().then(e=>{t(e)}).catch(e=>{o(e.message)});else try{var e=BluetoothBase.createGattClientDevice(a);e.connect(),this.gattClient=e,this.deviceIdBle=a,e.getRssiValue().then(e=>{t(e)}).catch(e=>{o(e.message)})}catch(e){o(e.message)}})}getTemp(){return{RSSI:"",localName:"",advertisData:"",advertisServiceUUIDs:"",name:"",serviceData:"",deviceId:""}}isRepeat(e,t){return e.some(e=>e.deviceId===t)}promptTemp(e){return PromptBase.ohosShowDialog({message:e,buttons:[{text:DEFAULT.REFUSE_BUTTON,color:"#1358e7"},{text:DEFAULT.ALLOW_BUTTON,color:"#1358e7"}]})}}).prototype,"openAdapter",[_dec],Object.getOwnPropertyDescriptor(_class.prototype,"openAdapter"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"closeAdapter",[_dec2],Object.getOwnPropertyDescriptor(_class.prototype,"closeAdapter"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getAdapterState",[_dec3],Object.getOwnPropertyDescriptor(_class.prototype,"getAdapterState"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"startDevicesDiscovery",[_dec4],Object.getOwnPropertyDescriptor(_class.prototype,"startDevicesDiscovery"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"stopDevicesDiscovery",[_dec5],Object.getOwnPropertyDescriptor(_class.prototype,"stopDevicesDiscovery"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getDevices",[_dec6],Object.getOwnPropertyDescriptor(_class.prototype,"getDevices"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getConnectedDevices",[_dec7],Object.getOwnPropertyDescriptor(_class.prototype,"getConnectedDevices"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"createBLEConnection",[_dec8],Object.getOwnPropertyDescriptor(_class.prototype,"createBLEConnection"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"closeBLEConnection",[_dec9],Object.getOwnPropertyDescriptor(_class.prototype,"closeBLEConnection"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getBLEDeviceServices",[_dec10],Object.getOwnPropertyDescriptor(_class.prototype,"getBLEDeviceServices"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"getBLEDeviceCharacteristics",[_dec11],Object.getOwnPropertyDescriptor(_class.prototype,"getBLEDeviceCharacteristics"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"readBLECharacteristicValue",[_dec12],Object.getOwnPropertyDescriptor(_class.prototype,"readBLECharacteristicValue"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"writeBLECharacteristicValue",[_dec13],Object.getOwnPropertyDescriptor(_class.prototype,"writeBLECharacteristicValue"),_class.prototype),_applyDecoratedDescriptor(_class.prototype,"notifyBLECharacteristicValueChange",[_dec14],Object.getOwnPropertyDescriptor(_class.prototype,"notifyBLECharacteristicValueChange"),_class.prototype),_class);class ASBluetooth extends BluetoothBaseModule{constructor(){super(),this.deviceFoundCallback=void 0,this.adapterStateCallback=void 0,this.BLEConnectionStateCallback=void 0,this.initBluetoothDeviceFound(),this.initBluetoothAdapterStateChange(),this.initBLEConnectionStateChange()}openBluetoothAdapter(){return new Promise(async(e,t)=>{if(!await BluetoothBase.getPermissions())return t(["permission fail",ErrorCode.USER_REJECT]);BluetoothBase.bluetoothState()===BLESTATE.STATE_ON?(this.isInit=!0,e("ok")):t([["not available",BLHErrorCode.NOT_AVAILABLE]])})}closeBluetoothAdapter(){let o=BluetoothBase.bluetoothState()===BLESTATE.STATE_OFF;return new Promise((e,t)=>{if(o)t([["bluetooth is not turned",BLHErrorCode.NOT_AVAILABLE]]);else{if(this.isInit=!1,BluetoothBase.stopBluetoothDiscovery(),this.state.discovering=!1,this.deviceIdBle="",this.scanResult=[],this.gattClient)try{this.gattClient.disconnect(),this.gattClient.close(),this.gattClient=null}catch(e){}this.isOnBle={mode:!1},this.stateBLE={},this.services=[],this.bleCharacteristic={},this.characteristicValue=null,this.devicesFoundListeners=[],this.adapterStateChangeListeners=[],this.BLEConnectionStateListeners=[],this.BLECharacteristicListeners=[],e("ok")}})}startBluetoothDevicesDiscovery(e){return this.isInit?this.startDevicesDiscovery(e):new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}stopBluetoothDevicesDiscovery(e){return this.isInit?this.stopDevicesDiscovery(e):new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}initBluetoothDeviceFound(){this.deviceFoundCallback=e=>{this.onFoundEvent(e);for(let e of this.devicesFoundListeners)setTimeout(()=>{e([this.scanResult])},this.interval)};try{BluetoothBase.on(this.deviceFoundCallback),BluetoothBase.onBLE(this.deviceFoundCallback)}catch(e){console.error("[AdvancedAPI] openHarmony ondevicefound fail "+e)}}onBluetoothDeviceFound(e){this.devicesFoundListeners.push(e)}offBluetoothDeviceFound(e){void 0===e?this.devicesFoundListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBluetoothAdapterStateChange, param is invalid:"+typeof e):-1<(e=this.devicesFoundListeners.indexOf(e))&&this.devicesFoundListeners.splice(e,1)}initBluetoothAdapterStateChange(){this.adapterStateCallback=e=>{var t=this.state.available;if(2===e?this.state.available=!0:0===e&&(this.state.available=!1),t!==this.state.available)for(var o of this.adapterStateChangeListeners)o(t)};try{BluetoothBase.onStateChange(e=>{this.adapterStateCallback(e)})}catch(e){console.error("[AdvancedAPI] onBluetoothAdapterStateChange errCode:"+e.code+",errMessage:"+e.message)}}onBluetoothAdapterStateChange(e){this.adapterStateChangeListeners.push(e)}offBluetoothAdapterStateChange(e){void 0===e?this.devicesFoundListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBluetoothAdapterStateChange, param is invalid:"):-1<(e=this.adapterStateChangeListeners.indexOf(e))&&this.adapterStateChangeListeners.splice(e,1)}getConnectedBluetoothDevices(e){return this.isInit?this.getConnectedDevices(e):new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}getBluetoothDevices(){return this.isInit?this.getDevices():new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}getBluetoothAdapterState(){return this.isInit?this.getAdapterState():new Promise((e,t)=>{console.warn("[AdvancedAPI] bluetooth is no init"),t([["not init",BLHErrorCode.NOT_INIT]])})}asSetBLEMTU(a){return new Promise((t,o)=>{if(a&&a.deviceId&&a.mtu)if(isString(a.deviceId)&&isNumber(a.mtu))try{console.debug("[AdvancedAPI] asSetBLEMTU deviceId:"+a.deviceId+" this.deviceIdBLE = "+this.deviceIdBle);let e;this.gattClient&&a.deviceId.toLowerCase()===this.deviceIdBle.toLowerCase()?(console.debug("[AdvancedAPI] asSetBLEMTU deviceId:"+a.deviceId),e=this.gattClient):((e=BluetoothBase.createGattClientDevice(a.deviceId)).connect(),this.gattClient=e,this.deviceIdBle=a.deviceId),this.gattClient.setBLEMtuSize(a.mtu),t("ok")}catch(e){console.error("[AdvancedAPI] setBLEMtuSize fail, errCode:"+e.code+",errMessage:"+e.message),o([[e.message,BLHErrorCode.SYSTEM_ERROR]])}else console.error("[AdvancedAPI] setBLEMTU fail, params error"),o([["param error",BLHErrorCode.SYSTEM_ERROR]]);else console.error("[AdvancedAPI] setBLEMTU fail, params error"),o([["param error",BLHErrorCode.SYSTEM_ERROR]])})}asWriteBLECharacteristicValue(e){return this.writeBLECharacteristicValue(e)}asReadBLECharacteristicValue(e){return this.readBLECharacteristicValue(e)}initBLEConnectionStateChange(){this.BLEConnectionStateCallback=t=>{this.BLEConnectionStateListeners.forEach(e=>{e(t)})},this.stateBLE=new Proxy({},{get:(e,t)=>e[t],set:(e,t,o)=>(e={deviceId:t,connected:e[t]=o},console.debug("AdvancedAPI bleConnectionStateChange"),this.BLEConnectionStateCallback(e),!0)})}asOnBLEConnectionStateChange(e){this.BLEConnectionStateListeners.push(e)}asOffBLEConnectionStateChange(e){void 0===e?this.BLEConnectionStateListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBLEConnectionStateChange, param is invalid:"):-1<(e=this.BLEConnectionStateListeners.indexOf(e))&&this.BLEConnectionStateListeners.splice(e,1)}asOnBLECharacteristicValueChange(e){this.BLECharacteristicListeners.push(e)}asOffBLECharacteristicValueChange(e){void 0===e?this.BLECharacteristicListeners.splice(0):"function"!=typeof e?console.error("[AdvancedAPI] offBLECharacteristicValueChange, param is invalid:"):-1<(e=this.BLECharacteristicListeners.indexOf(e))&&this.BLECharacteristicListeners.splice(e,1)}asNotifyBLECharacteristicValueChange(e){return console.debug("[AdvancedAPI] params = "+JSON.stringify(e)),this.notifyBLECharacteristicValueChange(e)}asGetBLEDeviceServices(e){return this.getBLEDeviceServices(e)}asGetBLEDeviceRSSI(e){return new Promise((t,o)=>{e&&e.deviceId&&"string"==typeof e.deviceId?this.getBLEDeviceRSSI(e.deviceId).then(e=>{t({rssi:e})}).catch(e=>{o([[e,BLHErrorCode.SYSTEM_ERROR]])}):o([["invalidParams",BLHErrorCode.SYSTEM_ERROR]])})}asGetBLEDeviceCharacteristics(e){return this.getBLEDeviceCharacteristics(e)}asCreateBLEConnection(e){return e&&console.info("[AdvancedAPI] asCreateBLEConnection params = "+JSON.stringify(e)),this.createBLEConnection(e)}asCloseBLEConnection(e){return this.closeBLEConnection(e)}}class ASRouter{navigateTo(r){return new Promise((e,t)=>{var o,a;"string"!=typeof r.url?t(["param url",ErrorCode$1.PARAMETER_ERROR]):({url:o,urlParams:a}=getUrlParams(r.url),console.debug("[AdvancedAPI] navigateTo urlParams = %s",JSON.stringify(a)),router.pushUrl({url:o,params:a}).then(()=>{e()}).catch(e=>{console.error(`[AdvancedAPI] pushUrl failed, code is ${e.code}, message is `+e.message),t([e.message,e.code])}))})}redirectTo(r){return new Promise((e,t)=>{var o,a;"string"!=typeof r.url?t(["param url",ErrorCode$1.PARAMETER_ERROR]):({url:o,urlParams:a}=getUrlParams(r.url),console.debug("[AdvancedAPI] redirectTo urlParams = "+JSON.stringify(a)),router.replaceUrl({url:o,params:a}).then(()=>{e()}).catch(e=>{console.error(`[AdvancedAPI] replaceUrl failed, code is ${e.code}, message is `+e.message),t([e.message,e.code])}))})}switchTab(e){return new Promise(async(e,t)=>{t("[AdvancedAPI] switchTab do not support")})}navigateBack(r){return new Promise((e,t)=>{let{delta:o=1}=r;if("number"!=typeof(o=null===o?1:o))t(["parameter delta",ErrorCode$1.PARAMETER_ERROR]);else{var a=Number(router.getLength());o>a&&(o=a-1);try{for(let e=0;e{e=e.split("="),t[e[0]]=e[1]}),{url:e,urlParams:t}}class WifiBase{static isWifiActive(){return wifi.isWifiActive()}static scan(){return wifi.scan()}static ohoGetLinkedInfo(){return new Promise((o,a)=>{wifi.getLinkedInfo((e,t)=>{e?(console.log("[QAFAPI] get linked info error:"+e),a(e)):(console.log("[QAFAPI] get wifi linked info: "+JSON.stringify(t)),o(t))})})}static connectionChange(e){wifi.on("wifiConnectionChange",e)}static scanStateChange(e){wifi.on("wifiScanStateChange",e)}static getScanInfos(){return new Promise((t,o)=>{wifi.getScanInfos().then(e=>{t(e)}).catch(e=>{console.info("[QAFAPI] getScanInfos error "+JSON.stringify(e)),o(e)})})}}_defineProperty(WifiBase,"ConnState",{SCANNING:0,CONNECTING:1,AUTHENTICATING:2,OBTAINING_IPADDR:3,CONNECTED:4,DISCONNECTING:5,DISCONNECTED:6,UNKNOWN:7}),_defineProperty(WifiBase,"StateType",{OFF:0,ON:1}),_defineProperty(WifiBase,"ScanState",{SUCCESS:1,FAIL:0}),_dec$1=jsMethod({alias:"scan",common:!1}),_dec2$1=jsMethod({alias:"getConnectedWifi",common:!1}),_applyDecoratedDescriptor((_class$1=class{constructor(){this.SecureType={WPA:"wpa",WEP:"wep"}}isSecure(e=""){return!(!(e=e.toLowerCase()).includes(this.SecureType.WPA)&&!e.includes(this.SecureType.WEP))}getSignalStrength(e){return e+100}scan(){return new Promise((e,t)=>{WifiBase.isWifiActive()?WifiBase.scan()?e([["scan success"]]):t([["scan fail",WifiErrorCode.WIFI_NOT_TURNED_ON]]):t([["wifi not turned on",WifiErrorCode.WIFI_NOT_TURNED_ON]])})}getConnectedWifi(a){return new Promise((s,o)=>{WifiBase.isWifiActive()?WifiBase.ohoGetLinkedInfo().then(async e=>{if(e.connState===WifiBase.ConnState.DISCONNECTED)o([["wifi is not connected",ErrorCode$1.COMMON_ERROR]]);else if(a){var t={SSID:e.ssid};s([[t]])}else{let t={BSSID:e.bssid,SSID:e.ssid,frequency:e.frequency,signalStrength:this.getSignalStrength(e.rssi),secure:!1},o,a=await WifiBase.getScanInfos(),r=a.length;for(let e=0;e{wifi.isWifiActive()||wifi.enableWifi()?(console.debug("[AdvancedAPI] enableWifi success"),e()):(console.debug("[AdvancedAPI] enableWifi fail"),t(["wifi not turned on",WifiErrorCode.WIFI_NOT_TURNED_ON]))})}stopWifi(){return new Promise((e,t)=>{!wifi.isWifiActive()||wifi.disableWifi()?(console.debug("[AdvancedAPI] stopWifi success"),e()):(console.debug("[AdvancedAPI] stopWifi fail"),t(["system not support",ErrorCode$1.COMMON_ERROR]))})}getConnectedWifi(a={}){return new Promise((t,o)=>{var{partialInfo:e=!1}=a;super.getConnectedWifi(e).then(([[e]])=>{t({wifi:e})},e=>{o(...e)})})}getWifiList(e){return new Promise((t,o)=>{super.scan().then(([e=[]]=[])=>{t(...e)},e=>{o(...e)})})}onGetWifiList(e){"function"!=typeof e?console.error("[AdvancedAPI] param is invalid."):this.wifiScanCallbacks.push(e)}offGetWifiList(e){0<=(e=this.wifiScanCallbacks.indexOf(e))?this.wifiScanCallbacks.splice(e,1):this.wifiScanCallbacks=[]}connectWifi(n){return new Promise(async(t,o)=>{let{SSID:a,BSSID:e="",password:r="",maunal:s=!1}=n;if(isString(a))if(isString(e))if(isString(r)){try{if((await this.getConnectedWifi()).wifi.SSID===a)return void t()}catch(e){console.debug("[AdvancedAPI] wifi is not connected.")}try{var i=await wifi.addDeviceConfig({ssid:a,bssid:e,preSharedKey:r,securityType:3,isHiddenSsid:!1});console.debug("[AdvancedAPI] addDeviceConfig success netId = %d",i),this._connectByNetId.push(e=>{(e.wifi.SSID===a?t:o)()}),s?console.error("[AdvancedAPI] 不支持跳转系统wlan页面"):wifi.connectToNetwork(i)}catch(e){console.error("[AdvancedAPI] connectWifi addDeviceConfig fail err = "+e),o(["system not support",ErrorCode$1.COMMON_ERROR])}}else console.error("[AdvancedAPI] connectWifi invalid password"),o(["wifi password error",WifiErrorCode.PASSWORD_ERROR]);else console.error("[AdvancedAPI] connectWifi invalid BSSID"),o(["wifi BSSID error",WifiErrorCode.PASSWORD_ERROR]);else console.error("[AdvancedAPI] connectWifi invalid SSID"),o(["wifi SSID error",WifiErrorCode.PASSWORD_ERROR])})}onWifiConnected(e){"function"!=typeof e?console.error("[AdvancedAPI] param is invalid."):this.connectCallbacks.push(e)}offWifiConnected(e){0<=(e=this.connectCallbacks.indexOf(e))?this.connectCallbacks.splice(e,1):this.connectCallbacks=[]}connectionChange(){WifiBase.connectionChange(e=>{e===WifiBase.StateType.ON?this.getConnectedWifi().then(({wifi:e})=>{e.state=WifiBase.StateType.ON,this.triggerConnectCallbacks({wifi:e}),this.triggerConnectWithPartialInfo({wifi:e}),this.triggerConnectById({wifi:e})},()=>{var e={BSSID:"",signalStrength:0,state:WifiBase.StateType.ON,secure:!1,SSID:""};this.triggerConnectCallbacks({wifi:e}),this.triggerConnectWithPartialInfo({wifi:e})}):e===WifiBase.StateType.OFF&&(e={BSSID:"",signalStrength:0,state:WifiBase.StateType.OFF,secure:!1,SSID:""},this.triggerConnectCallbacks({wifi:e}),this.triggerConnectWithPartialInfo({wifi:e}))})}scanChange(){WifiBase.scanStateChange(e=>{e===WifiBase.ScanState.SUCCESS&&WifiBase.getScanInfos().then(e=>{console.debug("[AdvancedAPI] onGetWifiList getScanInfos success"),e=e.map(e=>({BSSID:e.bssid,SSID:e.ssid,frequency:e.frequency,signalStrength:super.getSignalStrength(e.rssi),secure:super.isSecure(e.capabilities)})),this.triggerScanCallbacks({wifiList:e})})})}triggerConnectCallbacks(t){console.debug("[AdvancedAPI] triggerConnectCallbacks"),t.errMsg="onWifiConnected:ok",t.errCode=0,this.connectCallbacks.forEach(e=>{e(t)})}triggerConnectById(t){console.debug("[AdvancedAPI] triggerConnectById"),this._connectByNetId.forEach(e=>{e(t)}),this._connectByNetId=[]}triggerScanCallbacks(t){console.debug("[AdvancedAPI] wifiScanCallbacks"),this.wifiScanCallbacks.forEach(e=>{e(t)})}onWifiConnectedWithPartialInfo(e){"function"!=typeof e?console.error("[AdvancedAPI] param is invalid."):this.connectWithPartialInfo.push(e)}offWifiConnectedWithPartialInfo(e){0<=(e=this.connectWithPartialInfo.indexOf(e))?this.connectWithPartialInfo.splice(e,1):this.connectWithPartialInfo=[]}triggerConnectWithPartialInfo(e){console.debug("[AdvancedAPI] triggerConnectWithPartialInfo");let t={SSID:e.wifi.SSID};this.connectWithPartialInfo.forEach(e=>{e({wifi:t})})}}let AUTH_RESULT={PERMISSION_CHECK_FAIL:201,PARAM_ERROR:401,FAIL:12500001,OPEN_ERROR:12500002,USER_CANCEL:12500003,TIME_OUT:12500004,TYPE_UNSUPPORTED:12500005,TRUSTED_LEVEL_UNSUPPORTED:12500006,TASK_BUSY:12500007,AUTHENTICATOR_LOCKED:12500009,NOT_ENROLLED:12500010};function toUint8Arr(e){var t,o=[];for(t of e){var a=t.charCodeAt(0);a<128?o.push(a):a<2048?(o.push(192+(a>>6)),o.push(128+(63&a))):a<65536&&(o.push(224+(a>>12)),o.push(128+(a>>6&63)),o.push(128+(63&a)))}return Uint8Array.from(o)}class ASAuthentication{start(n){return new Promise((t,o)=>{if("facial"!==(n&&n.requestAuthModes||""))o({errCode:90003,errMsg:"The authentication type is not supported."});else{var e=toUint8Arr(n.challenge),a=n&&n.authContent||"",r=userIAM_userAuth.UserAuthType.FACE,s=userIAM_userAuth.AuthTrustLevel.ATL1;try{var i=userIAM_userAuth.getAuthInstance(e,r,s);i.on("result",{callback:e=>{console.debug("[AdvancedAPI] authV9 result "+e.result),console.debug("[AdvancedAPI] authV9 token "+e.token),console.debug("[AdvancedAPI] authV9 remainAttempts "+e.remainAttempts),console.debug("[AdvancedAPI] authV9 lockoutDuration "+e.lockoutDuration),e.result===AUTH_RESULT.PERMISSION_CHECK_FAIL?o({errCode:90002,errMsg:"Permission verification failed."}):e.result===AUTH_RESULT.PARAM_ERROR?o({errCode:90004,errMsg:"Incorrect parameters."}):e.result===AUTH_RESULT.FAIL?o({errCode:90009,errMsg:"Authentication failed."}):e.result===AUTH_RESULT.OPEN_ERROR?o({errCode:90009,errMsg:"General operation error."}):e.result===AUTH_RESULT.USER_CANCEL?o({errCode:90008,errMsg:"The operation is canceled."}):e.result===AUTH_RESULT.TIME_OUT?o({errCode:90007,errMsg:"The operation is time-out."}):e.result===AUTH_RESULT.TYPE_UNSUPPORTED?o({errCode:90003,errMsg:"The authentication type is not supported."}):e.result===AUTH_RESULT.TRUSTED_LEVEL_UNSUPPORTED?o({errCode:90003,errMsg:"The authentication trust level is not supported."}):e.result===AUTH_RESULT.TASK_BUSY?o({errCode:90010,errMsg:"The authentication task is busy."}):e.result===AUTH_RESULT.AUTHENTICATOR_LOCKED?o({errCode:90010,errMsg:"The authenticator is locked."}):e.result===AUTH_RESULT.NOT_ENROLLED?o({errCode:90011,errMsg:"The type of credential has not been enrolled."}):t({authMode:"facial",resultJSON:"",resultJSONSignature:"",errCode:0,errMsg:void 0})}}),i.on("tip",{callback:e=>{switch(e.tip){case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_BRIGHT:prompt.showToast({message:"光线太强,获取的图像太亮。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_DARK:prompt.showToast({message:"光线太暗,获取的图像太暗。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_CLOSE:prompt.showToast({message:"人脸距离设备过近。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_FAR:prompt.showToast({message:"人脸距离设备过远。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_HIGH:prompt.showToast({message:"设备太高,仅获取到人脸上部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_LOW:prompt.showToast({message:"设备太低,仅获取到人脸下部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_RIGHT:prompt.showToast({message:"设备太靠右,仅获取到人脸右部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_LEFT:prompt.showToast({message:"设备太靠左,仅获取到人脸左部。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_MUCH_MOTION:prompt.showToast({message:"在图像采集过程中,用户人脸移动太快。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_POOR_GAZE:prompt.showToast({message:"没有正视摄像头。"});break;case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_NOT_DETECTED:prompt.showToast({message:"没有检测到人脸信息。"});break;default:console.debug("[AdvancedAPI] %s",JSON.stringify(e))}}}),a&&(console.debug("[AdvancedAPI] showToast authContent = %s",a),prompt.showToast({message:a})),i.start(),console.debug("[AdvancedAPI] authV9 start success")}catch(e){console.debug("[AdvancedAPI] authV9 start error = %s",e),o({errCode:90007,errMsg:"General operation fail."})}}})}getSupportedType(){return console.debug("[AdvancedAPI] start getSupportedType"),new Promise(e=>{e({supportMode:["facial"]})})}isEnrolled(a){return console.debug("[AdvancedAPI] start isEnrolled"),new Promise((e,t)=>{var o=a&&a.checkAuthMode||"";"fingerPrint"===o?e({isEnrolled:!1,errMsg:""}):"facial"===o&&e({isEnrolled:!1,errMsg:"The type of credential has not been enrolled."})})}}class OhosSensorBase{static ohosSubscribeAccelerometer(e){let{interval:t,callback:o}=e;sensor.on(sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER,e=>{o(e)},{interval:t})}static ohosUnsubscribeAccelerometer(){sensor.off(sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER)}static ohosSubscribeCompass(e){let t=e.callback;sensor.on(sensor.SensorType.SENSOR_TYPE_ID_ORIENTATION,e=>{t(e)})}static ohosUnsubscribeCompass(){sensor.off(sensor.SensorType.SENSOR_TYPE_ID_ORIENTATION)}static ohosSubscribeGyroscope(e){let{intervalValue:t,callback:o}=e;sensor.on(sensor.SensorId.GYROSCOPE,e=>{o(e)},{interval:t})}static ohosUnsubscribeGyroscope(){sensor.off(sensor.SensorId.GYROSCOPE)}}let intervalType=[{label:"game",value:2e7},{label:"ui",value:6e7},{label:"normal",value:2e8}];class ASAccelerometer{constructor(){this.callBackSet=new Set,this.defaultInterval="normal"}onAccelerometerChange(o){return new Promise((e,t)=>{"function"!=typeof o||this.callBackSet.has(o)?t("param is invalid.",ErrorCode$1.PARAMETER_ERROR):(this.callBackSet.add(o),t=intervalType.find(e=>e.label===this.defaultInterval).value,OhosSensorBase.ohosSubscribeAccelerometer({interval:t,callback:e=>{var t,o={x:e.x,y:e.y,z:e.z};for(t of this.callBackSet.keys())t(o)}}),e())})}offAccelerometerChange(o){return new Promise((e,t)=>{"function"!=typeof o?(this.callBackSet.clear(),OhosSensorBase.ohosUnsubscribeAccelerometer(),e()):this.callBackSet.has(o)?(this.callBackSet.delete(o),0===this.callBackSet.size&&OhosSensorBase.ohosUnsubscribeAccelerometer(),e()):t("param is invalid.",ErrorCode$1.COMMON_ERROR)})}startAccelerometer(r){return new Promise((e,t)=>{let o=intervalType.find(e=>e.label===this.defaultInterval).value;var a;r.interval&&"string"==typeof r.interval&&(a=intervalType.find(e=>e.label===r.interval))&&(o=a.value),OhosSensorBase.ohosSubscribeAccelerometer({interval:o,callback:e=>{var t,o={x:e.x,y:e.y,z:e.z};for(t of this.callBackSet.keys())t(o)}}),e()})}stopAccelerometer(){return new Promise((e,t)=>{OhosSensorBase.ohosUnsubscribeAccelerometer(),e()})}}class ASCompass{constructor(){this.callBackCompassSet=new Set}onCompassChange(o){return new Promise(async(e,t)=>{"function"!=typeof o||this.callBackCompassSet.has(o)?t("param is invalid.",ErrorCode$1.PARAMETER_ERROR):(this.callBackCompassSet.add(o),OhosSensorBase.ohosSubscribeCompass({callback:e=>{var t,o={direction:e.alpha,accuracy:e.alpha?3:0};for(t of this.callBackCompassSet.keys())t(o)}}),e())})}offCompassChange(o){return new Promise(async(e,t)=>{"function"==typeof o&&this.callBackCompassSet.has(o)?(this.callBackCompassSet.delete(o),0===this.callBackCompassSet.size&&OhosSensorBase.ohosUnsubscribeCompass(),e("success")):t("param is invalid.",ErrorCode$1.PARAMETER_ERROR)})}startCompass(e){return new Promise(async(e,t)=>{OhosSensorBase.ohosSubscribeCompass({callback:e=>{var t,o={direction:e.alpha,accuracy:e.alpha?3:0};for(t of this.callBackCompassSet.keys())t(o)}}),e("success")})}stopCompass(){return new Promise(async(e,t)=>{OhosSensorBase.ohosUnsubscribeCompass(),e("success")})}}let intervalType$1=[{label:"game",value:2e7},{label:"ui",value:6e7},{label:"normal",value:2e8}];class ASGyroscope{constructor(){this.callBackGyroscopeSet=new Set}onGyroscopeChange(o){return new Promise((e,t)=>{"function"!=typeof o||this.callBackGyroscopeSet.has(o)?t("param is invalid.",ErrorCode$1.PARAMETER_ERROR):(this.callBackGyroscopeSet.add(o),e())})}startGyroscope(r={}){return new Promise((e,t)=>{let o=intervalType$1.find(e=>"normal"===e.label).value;var a;r.interval&&"string"==typeof r.interval&&(a=intervalType$1.find(e=>e.label===r.interval))&&(o=a.value),OhosSensorBase.ohosSubscribeGyroscope({intervalValue:o,callback:e=>{var t,o={x:e.x,y:e.y,z:e.z};for(t of this.callBackGyroscopeSet.keys())t(o)}}),e()})}stopGyroscope(){return new Promise((e,t)=>{OhosSensorBase.ohosUnsubscribeGyroscope(),e()})}}class ASContact{addPhoneContact(D){return new Promise(async(t,o)=>{try{var{authResults:e,dialogShownResults:a}=await abilityAccessCtrl.createAtManager().requestPermissionsFromUser(context,["ohos.permission.WRITE_CONTACTS"]);if(0!==e[0])return void o(["request permission fail",ErrorCode$1.USER_REJECT,e[0],a[0]]);console.debug("[AdvancedAPI] request WRITE_CONTACTS permission success")}catch(e){return void o(["request permission fail",ErrorCode$1.USER_REJECT])}var{photoFilePath:e,nickName:a="",lastName:r="",middleName:s="",firstName:i="",remark:n,mobilePhoneNumber:c,weChatNumber:l,addressCountry:d="",addressState:h="",addressCity:u="",addressStreet:p="",addressPostalCode:f,organization:A,url:g,workPhoneNumber:m,workFaxNumber:y,hostNumber:S,email:v,title:C,workAddressCountry:P="",workAddressState:E="",workAddressCity:b="",workAddressStreet:I="",workAddressPostalCode:T,homeFaxNumber:R,homePhoneNumber:k,homeAddressCountry:_="",homeAddressState:B="",homeAddressCity:O="",homeAddressStreet:w="",homeAddressPostalCode:L}=D;l||console.error("[AdvancedAPI] weChatNumber do not support."),i?(l={name:{familyName:r,middleName:s,givenName:i,fullName:r+s+i},nickName:{nickName:a},emails:[{email:v,displayName:"邮箱"}],phoneNumbers:[{phoneNumber:k,labelId:contact.PhoneNumber.NUM_HOME},{phoneNumber:c,labelId:contact.PhoneNumber.NUM_MOBILE},{phoneNumber:R,labelId:contact.PhoneNumber.NUM_FAX_HOME},{phoneNumber:y,labelId:contact.PhoneNumber.NUM_FAX_WORK},{phoneNumber:m,labelId:contact.PhoneNumber.NUM_WORK},{phoneNumber:S,labelId:contact.PhoneNumber.NUM_COMPANY_MAIN}],portrait:{uri:e},postalAddresses:[{city:O,country:_,postcode:L,street:w,postalAddress:_+B+O+w,labelId:contact.PostalAddress.ADDR_HOME},{city:b,country:P,postcode:T,street:I,postalAddress:P+E+b+I,labelId:contact.PostalAddress.ADDR_WORK},{city:u,country:d,postcode:f,street:p,postalAddress:d+h+u+p,labelId:contact.PostalAddress.CUSTOM_LABEL}],websites:[{website:g}],note:{noteContent:n},organization:{name:A,title:C}},contact.addContact(l).then(e=>{console.debug("[AdvancedAPI] addContact callback: success contactId = "+e),t()}).catch(e=>{console.debug("[AdvancedAPI] addContact callback: err->"+JSON.stringify(e)),o([e.data,e.code])})):(console.error("[AdvancedAPI] firstName is required."),o(["fail Missing required parameter `firstName`",ErrorCode$1.PARAMETER_ERROR]))})}}class ASVibrator{vibrate(){return new Promise((t,o)=>{this.triggerVibrate({duration:200}).then(e=>{t(e)}).catch(e=>{o([e.data,e.code])})})}vibrateLong(){return new Promise((t,o)=>{this.triggerVibrate({duration:400}).then(e=>{t(e)}).catch(e=>{o([e.data,e.code])})})}vibrateShort(){return new Promise((t,o)=>{this.triggerVibrate({duration:15}).then(e=>{t(e)}).catch(e=>{o([e.data,e.code])})})}triggerVibrate(a){return new Promise((t,o)=>{var e={type:"time",duration:a.duration};vibrator.startVibration(e,{id:0,usage:"alarm"}).then(e=>{console.debug("[AdvancedAPI] startVibration success"),t(e)},e=>{console.error("[AdvancedAPI] startVibration fail err = "+JSON.stringify(e)),o(e)}).catch(e=>{console.error("[AdvancedAPI] startVibration fail err = "+JSON.stringify(e)),o(e)})})}}class ASCapture{constructor(){this.captureCallback=null}onUserCaptureScreen(t){if(t)try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e,this.captureCallback&&(this.windowClass.off("screenshot"),this.captureCallback=null),this.captureCallback=t,console.info("[AdvancedAPI] Succeeded in obtaining the top window. Listen to screenshot event.");try{this.windowClass.on("screenshot",function(){t("ohos not support path")})}catch(e){console.error("[AdvancedAPI] Failed to register callback. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}else console.error("[AdvancedAPI] params illegal, empty callback")}offUserCaptureScreen(t){try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e,console.info("[AdvancedAPI] Succeeded in obtaining the top window. Unsubscribe screenshot event.");try{!t||this.captureCallback&&this.captureCallback===t?(this.windowClass.off("screenshot"),this.captureCallback=null):console.info("[AdvancedAPI] Invalid callback.")}catch(e){console.error("[AdvancedAPI] Failed to unregister callback. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}}}class ASKeyboard{constructor(){this.changeCallback=new Map}hideKeyboard(){return new Promise((e,t)=>{try{inputMethod.getController().hideTextInput().then(()=>{console.debug("[AdvancedAPI] Succeeded in hiding softKeyboard."),e()}).catch(e=>{console.error("[AdvancedAPI] Failed to hideSoftKeyboard: "+JSON.stringify(e)),t()})}catch(e){console.error("[AdvancedAPI] Failed to get inputMethod Controller. Cause: "+JSON.stringify(e)),t()}})}onKeyboardHeightChange(o){if(o)try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e;let t=DisplayBase.ohosGetDisplay().densityPixels;this.changeCallback.has(o)||this.changeCallback.set(o,function(e){o({height:Math.round(e/t)})}),console.info("[AdvancedAPI] Succeeded in obtaining the top window. Listen to keyboard height change");try{this.windowClass.on("keyboardHeightChange",this.changeCallback.get(o))}catch(e){console.error("[AdvancedAPI] Failed to enable the listener for keyboard height changes. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}else console.error("[AdvancedAPI] params illegal, empty callback")}offKeyboardHeightChange(t){try{window.getLastWindow(globalThis.abilityContext).then(e=>{this.windowClass=e,console.info("[AdvancedAPI] Succeeded in obtaining the top window. Unsubscribe keyboard change event.");try{t?this.changeCallback.has(t)?(this.windowClass.off("keyboardHeightChange",this.changeCallback.get(t)),this.changeCallback.delete(t)):console.info("[AdvancedAPI] Invalid callback."):(this.windowClass.off("keyboardHeightChange"),this.changeCallback.clear())}catch(e){console.error("[AdvancedAPI] Failed to unregister callback. Cause: "+JSON.stringify(e))}}).catch(e=>{console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))})}catch(e){console.error("[AdvancedAPI] Failed to obtain the top window. Cause: "+JSON.stringify(e))}}}class FileioBase{static ohosOpendirSync(e){return new OhosOpendir(e)}static ohosReadSync(e,t){return fs.readSync(e,t)}static ohosUnlinkSync(e){return fs.unlinkSync(e)}static ohosCopy(e,t,o=0){return fs.copyFile(e,t,o)}static ohosMkdirSync(e,t=0){return fs.mkdirSync(e)}static ohosReadTextSync(e,t){return fs.readTextSync(e,t)}static ohosStatSync(e){return fs.statSync(e)}static ohosOpenSync(e,t,o=0){return e&&"string"==typeof e&&e.startsWith("/data/storage/")&&(e=fileuri.getUriFromPath(e)),fs.openSync(e,t)}static ohosWriteSync(e,t,o={}){return fs.writeSync(e,t,o)}static ohosAccessSync(e,t=0){return fs.accessSync(e)}}class OhosOpendir{constructor(e){this.dir=fs.listFileSync(e)}ohosReadsync(){return this.dir}}class WantConstantBase{static getAction(e){return wantConstant.Action[e]}}let version="3.7.7",VERSION=version,_hasBuffer="function"==typeof Buffer,_TD="function"==typeof TextDecoder?new TextDecoder:void 0,_TE="function"==typeof TextEncoder?new TextEncoder:void 0,b64ch="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",b64chs=Array.prototype.slice.call(b64ch),b64tab=(e=>{let o={};return e.forEach((e,t)=>o[e]=t),o})(b64chs),b64re=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,_fromCC=String.fromCharCode.bind(String),_U8Afrom="function"==typeof Uint8Array.from?Uint8Array.from.bind(Uint8Array):e=>new Uint8Array(Array.prototype.slice.call(e,0)),_mkUriSafe=e=>e.replace(/=/g,"").replace(/[+\/]/g,e=>"+"==e?"-":"_"),_tidyB64=e=>e.replace(/[^A-Za-z0-9\+\/]/g,""),btoaPolyfill=t=>{let o,a,r,s,i="",e=t.length%3;for(let e=0;e>18&63]+b64chs[o>>12&63]+b64chs[o>>6&63]+b64chs[63&o]}return e?i.slice(0,e-3)+"===".substring(e):i},_btoa="function"==typeof btoa?e=>btoa(e):_hasBuffer?e=>Buffer.from(e,"binary").toString("base64"):btoaPolyfill,_fromUint8Array=_hasBuffer?e=>Buffer.from(e).toString("base64"):o=>{var a=[];for(let e=0,t=o.length;et?_mkUriSafe(_fromUint8Array(e)):_fromUint8Array(e),cb_utob=e=>{var t;return e.length<2?(t=e.charCodeAt(0))<128?e:t<2048?_fromCC(192|t>>>6)+_fromCC(128|63&t):_fromCC(224|t>>>12&15)+_fromCC(128|t>>>6&63)+_fromCC(128|63&t):(t=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320),_fromCC(240|t>>>18&7)+_fromCC(128|t>>>12&63)+_fromCC(128|t>>>6&63)+_fromCC(128|63&t))},re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,utob=e=>e.replace(re_utob,cb_utob),_encode=_hasBuffer?e=>Buffer.from(e,"utf8").toString("base64"):_TE?e=>_fromUint8Array(_TE.encode(e)):e=>_btoa(utob(e)),encode=(e,t=!1)=>t?_mkUriSafe(_encode(e)):_encode(e),encodeURI$1=e=>encode(e,!0),re_btou=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,cb_btou=e=>{switch(e.length){case 4:var t=((7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3))-65536;return _fromCC(55296+(t>>>10))+_fromCC(56320+(1023&t));case 3:return _fromCC((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return _fromCC((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},btou=e=>e.replace(re_btou,cb_btou),atobPolyfill=t=>{if(t=t.replace(/\s+/g,""),!b64re.test(t))throw new TypeError("malformed base64.");t+="==".slice(2-(3&t.length));let o,a="",r,s;for(let e=0;e>16&255):64===s?_fromCC(o>>16&255,o>>8&255):_fromCC(o>>16&255,o>>8&255,255&o);return a},_atob="function"==typeof atob?e=>atob(_tidyB64(e)):_hasBuffer?e=>Buffer.from(e,"base64").toString("binary"):atobPolyfill,_toUint8Array=_hasBuffer?e=>_U8Afrom(Buffer.from(e,"base64")):e=>_U8Afrom(_atob(e).split("").map(e=>e.charCodeAt(0))),toUint8Array=e=>_toUint8Array(_unURI(e)),_decode=_hasBuffer?e=>Buffer.from(e,"base64").toString("utf8"):_TD?e=>_TD.decode(_toUint8Array(e)):e=>btou(_atob(e)),_unURI=e=>_tidyB64(e.replace(/[-_]/g,e=>"-"==e?"+":"/")),decode=e=>_decode(_unURI(e)),isValid=e=>"string"==typeof e&&(e=e.replace(/\s+/g,"").replace(/={0,2}$/,""),!/[^\s0-9a-zA-Z\+/]/.test(e)||!/[^\s0-9a-zA-Z\-_]/.test(e)),_noEnum=e=>({value:e,enumerable:!1,writable:!0,configurable:!0}),extendString=function(){var e=(e,t)=>Object.defineProperty(String.prototype,e,_noEnum(t));e("fromBase64",function(){return decode(this)}),e("toBase64",function(e){return encode(this,e)}),e("toBase64URI",function(){return encode(this,!0)}),e("toBase64URL",function(){return encode(this,!0)}),e("toUint8Array",function(){return toUint8Array(this)})},extendUint8Array=function(){var e=(e,t)=>Object.defineProperty(Uint8Array.prototype,e,_noEnum(t));e("toBase64",function(e){return fromUint8Array(this,e)}),e("toBase64URI",function(){return fromUint8Array(this,!0)}),e("toBase64URL",function(){return fromUint8Array(this,!0)})},extendBuiltins=()=>{extendString(),extendUint8Array()},gBase64={version:version,VERSION:VERSION,atob:_atob,atobPolyfill:atobPolyfill,btoa:_btoa,btoaPolyfill:btoaPolyfill,fromBase64:decode,toBase64:encode,encode:encode,encodeURI:encodeURI$1,encodeURL:encodeURI$1,utob:utob,btou:btou,decode:decode,isValid:isValid,fromUint8Array:fromUint8Array,toUint8Array:toUint8Array,extendString:extendString,extendUint8Array:extendUint8Array,extendBuiltins:extendBuiltins};class ASImage{constructor(){_defineProperty(this,"getArrayBuffer",async(e,t,o,a,r)=>{var s,i,n;return void 0!==a||void 0!==r?(a=r||a||0,n=image.createImageSource(t),i=image.createImagePacker(),r=(s=await n.getImageInfo()).size.width/r,n=await n.createPixelMap({desiredSize:{width:a,height:s.size.height/r}}),await i.packing(n,{format:"image/jpeg",quality:e})):(a=image.createImageSource(t),s=image.createImagePacker(),r={format:"image/jpeg",quality:e},i=await a.getImageInfo(),n=await a.createPixelMap({desiredSize:{width:i.size.width,height:i.size.height}}),await s.packing(n,r))})}chooseImage(n){return n=n||{},new Promise(async(e,t)=>{var o=await MediaLibraryBase.getPermissions();if(-1===o.perNum)return t(["permission fail",ErrorCode$1.USER_REJECT,o.perNum,o.dialogShownResults]);if(n.count&&"number"!=typeof n.count)return t(['chooseImage:fail parameter `count`. Expected Number with value NaN, got String with value "'+n.count+'".',ErrorCode$1.PARAMETER_ERROR]);n.count<1&&(n.count=9);let a=[];if(n.sourceType&&1===n.sourceType.length&&n.sourceType.includes("camera")){if(o=await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT),0!==(o=await context.startAbilityForResult({action:WantConstantBase.getAction("ACTION_IMAGE_CAPTURE"),parameters:{uri:"capture",callBundleName:o.name}})).resultCode)return t(["Failed to pull up camera app",ErrorCode$1.SERVICE_UNAVIALABLE]);if(a=[o.want.parameters.resourceUri],!o.want.parameters.resourceUri)return}else(o=new picker.PhotoSelectOptions).MIMEType=picker.PhotoViewMIMETypes.IMAGE_TYPE,o.maxSelectNumber=n.count,o=await(new picker.PhotoViewPicker).select(o),a=o.photoUris;if(!a)return t(["get uri fail",ErrorCode$1.SERVICE_UNAVIALABLE]);if("cancel"!==a){var r,s=[],i=[];for(let e=0;e{try{var o,a,r,s,i,n=c.src;return isFileUri(n)?(a={0:"up",90:"right",180:"down",270:"left"}[(o=await getFileAssetFromUri(n)).orientation],e({width:o.width,height:o.height,path:n,orientation:a,type:o.displayName.split(".").pop()})):isSandboxPath(n)?(r=image.createImageSource(switchInternalToHapSandBox(n)),s=n.split(".").pop(),e({width:(i=await r.getImageInfo()).size.width,height:i.size.height,path:c.src,orientation:"up",type:s})):t(["get uri fail",ErrorCode$1.SERVICE_UNAVIALABLE])}catch(e){return t(["get uri fail",ErrorCode$1.SERVICE_UNAVIALABLE])}})}saveImageToPhotosAlbum(v){return new Promise(async(o,e)=>{try{var t,a,r,s,i,n,c=v.filePath;if("string"!=typeof c)return e(["filePath format is not supported.",ErrorCode$1.PARAMETER_ERROR]);if(isFileUri(c))a=getFdFromUriOrSandBoxPath(t=c),r=fs.statSync(a).size,s=new ArrayBuffer(r),FileioBase.ohosReadSync(a,s),i=await getFileAssetFromUri(t),n="IMAGE_"+(new Date).getTime()+"_"+i.displayName,o({path:await saveMedia(photoAccessHelper.PhotoType.IMAGE,n,t,s)});else if(isSandboxPath(c)){let t=c;if(t.startsWith("internal://")&&(t=switchInternalToHapSandBox(c)),fs.accessSync(t)){var l=fs.openSync(t,fs.OpenMode.READ_ONLY);if(l){var d=l.fd,h=fs.statSync(t).size,u=new ArrayBuffer(h);FileioBase.ohosReadSync(d,u);let e="IMAGE_"+(new Date).getTime()+"_"+t.split("/").splice(-1,1).toString();e.includes(".")||(e+=".jpg"),t=fileuri.getUriFromPath(t),o({path:await saveMedia(photoAccessHelper.PhotoType.IMAGE,e,t,u)})}else e(["saveImageToPhotosAlbum fail, src not exist.",ErrorCode$1.PARAMETER_ERROR])}else e(["saveImageToPhotosAlbum fail, src not exist.",ErrorCode$1.PARAMETER_ERROR])}else{if(c.startsWith("data:image/")){var p=c.split(";");if(2===p.length&&p[1].startsWith("base64")){var f=p[0].replace("data:image/",""),A=gBase64.atob(c.split(",")[1]),g="IMAGE_"+(new Date).getTime()+"."+f,m=new ArrayBuffer(A.length),y=new Uint8Array(m);for(let e=0;e{let n=switchInternalToHapSandBox(p.src),c=0<=(n.split("/").pop()||"").indexOf(".")&&p.src.toLowerCase().split(".").pop()||"jpg",l=p.quality||80,t=await MediaLibraryBase.getPermissions();if(-1===t.perNum)return e(["permission fail",ErrorCode$1.USER_REJECT,t.perNum,t.dialogShownResults]);if(l&&"number"!=typeof l)return e(["compressImage fail, input parameter quality is illegal.",ErrorCode$1.PARAMETER_ERROR]);(100{console.info("AVPlayer seek succeeded, seek time is "+e),this.onSeekedCallback&&this.onSeekedCallback({})}),this.avPlayer.on("error",e=>{console.error(`Invoke avPlayer failed, code is ${e.code}, message is `+e.message),this.avPlayer.reset(),this.onErrorCallback&&this.onErrorCallback(e)}),this.avPlayer.on("stateChange",async(e,t)=>{switch(e){case"idle":console.info("AVPlayer state idle called."),this.stopFlag&&(this.avPlayer.url=this.tempSrc,this.stopFlag=!1);break;case"initialized":console.info("AVPlayerstate initialized called."),this.avPlayer.prepare().then(()=>{console.info("AVPlayer prepare succeeded."),this.onCanplayCallback&&this.onCanplayCallback({})},e=>{console.error(`Invoke prepare failed, code is ${e.code}, message is `+e.message)});break;case"prepared":console.info("AVPlayer state prepared called."),0===this.count&&this.autoplayS&&(this.avPlayer.play(),this.onPlayCallback&&this.onPlayCallback({}),this.startTimeS)&&(this.onSeekingCallback&&this.onSeekingCallback({}),this.avPlayer.seek(this.startTimeS)),this.count++,this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"playing":console.info("AVPlayer state playing called."),this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"paused":console.info("AVPlayer state paused called."),this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"completed":console.info("AVPlayer state completed called."),this.onEndedCallback&&this.onEndedCallback({}),this.avPlayer.loop=this.tempLoop,this.avPlayer.setVolume(this.volumeS),this.avPlayer.setSpeed(this.playbackRateS);break;case"stopped":console.info("AVPlayer state stopped called."),this.avPlayer.reset(),this.stopFlag=!0;break;case"released":console.info("AVPlayer state released called.");break;default:console.info("AVPlayer state unknown called.")}}),this.avPlayer.on("timeUpdate",e=>{this.onTimeUpdateCallback&&this.onTimeUpdateCallback(e/1e3)}),this.avPlayer.on("bufferingUpdate",(e,t)=>{console.info(`[AdvancedAPI] avPlayer bufferingUpdate ${e} `+t),3===e&&0!==t&&(this.bufferedS=t,this.avPlayer.currentTime/1e3>=this.avPlayer.duration*t/1e5)&&this.onWaitingCallback&&this.onWaitingCallback({})}),this.avPlayer.on("audioInterrupt",e=>{console.info("[AdvancedAPI] audioInterrupt:"+JSON.stringify(e)),e.hintType===audio.InterruptHint.INTERRUPT_HINT_PAUSE&&(this.avPlayer.pause(),this.onPauseCallback)&&this.onPauseCallback({})}),this.avPlayer.on("endOfStream",()=>{console.info("[AdvancedAPI] rePlay:endOfStream success"),this.avPlayer.loop&&(this.avPlayer.play(),this.startTimeS)&&(this.onSeekingCallback&&this.onSeekingCallback({}),this.avPlayer.seek(this.startTimeS))})}get duration(){return this.avPlayer?this.avPlayer.duration/1e3:(console.error("[AdvancedAPI] avPlayer is not exist, get duration fail"),0)}get currentTime(){return this.avPlayer?this.avPlayer.currentTime/1e3:(console.error("[AdvancedAPI] avPlayer is not exist, get currentTime fail"),0)}get paused(){return this.avPlayer?this.avPlayer.state===StateType.PAUSED:(console.error("[AdvancedAPI] avPlayer is not exist, get paused fail"),!0)}get loop(){return this.tempLoop}set loop(e){"boolean"!=typeof e?console.error(`[AdvancedAPI] loop: ${e} is invalid`):(this.tempLoop=e,this.avPlayer&&[StateType.PREPARED,StateType.PLAYING,StateType.PAUSED,StateType.COMPLETED].includes(this.avPlayer.state)&&(console.info("current state is "+this.avPlayer.state+" can set loop"),this.avPlayer.loop=e))}get volume(){return this.volumeS}set volume(e){"number"!=typeof e?console.error(`[AdvancedAPI] volume: ${e} is invalid`):(this.volumeS=e,this.avPlayer&&[StateType.PREPARED,StateType.PLAYING,StateType.PAUSED,StateType.COMPLETED].includes(this.avPlayer.state)&&(console.info("current state is "+this.avPlayer.state+" can set volume"),this.avPlayer.setVolume(e)))}get autoplay(){return this.autoplayS}set autoplay(e){"boolean"!=typeof e?console.error(`[AdvancedAPI] autoplay: ${e} is invalid`):this.autoplayS=e}get startTime(){return this.startTimeS/1e3}set startTime(e){"number"!=typeof e?console.error(`[AdvancedAPI] startTIme: ${e} is invalid`):this.startTimeS=1e3*e}get src(){return this.avPlayer?this.avPlayer.url:(console.error("[AdvancedAPI] avPlayer is not exist, get src fail"),"")}set src(e){if("string"!=typeof e)console.error(`[AdvancedAPI] src: ${e} is invalid`);else if(this.avPlayer)if(e&&(e.startsWith("http:")||e.startsWith("https:")||e.startsWith("datashare:")||e.startsWith("internal://")))if(this.avPlayer.state!==StateType.IDLE)console.error("current state is "+this.avPlayer.state+" can not set url");else{let t;if(e.startsWith("http:")||e.startsWith("https:"))t=e;else if(e.startsWith("internal://"))try{var o=switchInternalToHapSandBox(e),a=fs.openSync(o,fs.OpenMode.READ_ONLY).fd;t="fd://"+a}catch(o){console.info(""+JSON.stringify(o))}else if(e.startsWith("datashare:"))try{var r=MediaLibraryBase.getMedia(),s=MediaLibraryBase.getFileKey(),i=MediaLibraryBase.getMediaType("AUDIO"),n={selections:s.MEDIA_TYPE+"= ?",selectionArgs:[i.toString()],uri:e};return void r.getFileAssets(n).then(e=>{e.getFirstObject().then(e=>{MediaLibraryBase.getFd(e).then(e=>{t="fd://"+e,this.avPlayer.url&&t!==this.avPlayer.url&&this.avPlayer.reset(),this.avPlayer.url=t})})})}catch(o){return void console.error(`[AdvancedAPI] src: ${e} is invalid`)}this.avPlayer.url&&t!==this.avPlayer.url&&this.avPlayer.reset(),this.avPlayer.url=t,this.tempSrc=t}else console.error(`[AdvancedAPI] src: ${e} is invalid`);else console.error("[AdvancedAPI] avPlayer is not exist, set src fail")}get buffered(){return this.avPlayer?this.avPlayer.duration*this.bufferedS/1e5:(console.error("[AdvancedAPI] avPlayer is not exist, get buffered fail"),0)}get playbackRate(){return this.playbackRateS}set playbackRate(e){"number"!=typeof e?console.error(`[AdvancedAPI] speed: ${e} is invalid`):(e=e<=.75?media.PlaybackSpeed.SPEED_FORWARD_0_75_X:.75t(["getVideoInfo is not support!"]))}saveVideoToPhotosAlbum(e){return new Promise(async(t,o)=>{var a,r,s,i=e.filePath;if("string"!=typeof i)return o(["filePath format is not supported.",ErrorCode$1.PARAMETER_ERROR]);if(console.debug("[AdvancedAPI] filePath:",i),isFileUri(i))r=getFdFromUriOrSandBoxPath(a=i),s=fs.statSync(r).size,s=new ArrayBuffer(s),FileioBase.ohosReadSync(r,s),r=await getFileAssetFromUri(a),r="VIDEO_"+(new Date).getTime()+"_"+r.displayName,t({path:await saveMedia(photoAccessHelper.PhotoType.VIDEO,r,a,s)});else{if(isSandboxPath(i)){let e=i;return e.startsWith("internal://")&&(e=switchInternalToHapSandBox(e)),fs.accessSync(e)&&(r=fs.openSync(e,fs.OpenMode.READ_ONLY))?(a=r.fd,s=fs.statSync(e).size,r=new ArrayBuffer(s),FileioBase.ohosReadSync(a,r),s="VIDEO_"+(new Date).getTime()+"_"+i.split("/").splice(-1,1).toString(),e=fileuri.getUriFromPath(e),void t({path:await saveMedia(photoAccessHelper.PhotoType.VIDEO,s,e,r)})):void o(["saveVideoToPhotosAlbum fail, src not exist.",ErrorCode$1.PARAMETER_ERROR])}o(["filePath format is not supported.",ErrorCode$1.PARAMETER_ERROR])}})}}let StateType$1={IDLE:"idle",PLAYING:"playing",PAUSED:"paused",STOPPED:"stopped",ERROR:"error"};function createAVSession(t){console.debug("[AdvancedAPI] createAVSession begin"),avSession.createAVSession(context,"player","audio").then(e=>{console.debug("[AdvancedAPI] createAVSession succeed"),t.avSession=e})}function destroyAVSession(e){console.debug("[AdvancedAPI] destroyAVSession begin"),null===e.avSession?console.debug("[AdvancedAPI] avSession is null"):e.avSession.destroy()}function startBackgroundTask(){AbilityBase.getAbilityInfo().then(e=>{e={wants:[{bundleName:e.bundleName,abilityName:e.name}],operationType:wantAgent.OperationType.START_ABILITY,requestCode:0,wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]},wantAgent.getWantAgent(e).then(e=>backgroundTaskManager.startBackgroundRunning(context,backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,e)).then(()=>{console.debug("[AdvancedAPI] start bg operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] start bg operation failed Cause: "+e)})})}function stopBackgroundTask(){backgroundTaskManager.stopBackgroundRunning(context).then(()=>{console.debug("[AdvancedAPI] stop operation succeeded")}).catch(e=>{console.error("[AdvancedAPI] stop operation fail cause: "+JSON.stringify(e))})}class ASBGAudio{constructor(){this.backgroundAudioManager=new BackgroundAudioManager}}class BackgroundAudioManager{constructor(){this.bufferedS=0,this.avSession=null,this.startTimeS=0,this.onWaitingCallback=null,this.titleS=null,this.epnameS=null,this.singerS=null,this.coverImgUrlS=null,this.webUrlS=null,this.protocolS="http",this.onFinishCallback=null,this.tempSrc="",this.onCanplayCallback=null,this.onPlayCallback=null,this.onPauseCallback=null,this.onStopCallback=null,this.onTimeUpdateCallback=null,this.onErrorCallback=null,this.init()}init(){this.audioPlayer=media.createAudioPlayer(),this.audioPlayer.on("finish",()=>{destroyAVSession(this),stopBackgroundTask(),this.onFinishCallback&&this.onFinishCallback({})}),this.audioPlayer.on("dataLoad",()=>{this.onCanplayCallback&&this.onCanplayCallback({})}),this.audioPlayer.on("bufferingUpdate",(e,t)=>{console.info(`[AdvancedAPI] bgAudio bufferingUpdate ${e} `+t),3===e&&0!==t&&(this.bufferedS=t,this.audioPlayer.currentTime/1e3>=this.audioPlayer.duration*t/1e5)&&this.onWaitingCallback&&this.onWaitingCallback({})}),this.audioPlayer.on("audioInterrupt",e=>{console.info("[AdvancedAPI] audioInterrupt:"+JSON.stringify(e)),e.hintType===audio.InterruptHint.INTERRUPT_HINT_PAUSE&&this.audioPlayer.pause(),e.hintType===audio.InterruptHint.INTERRUPT_HINT_RESUME&&this.audioPlayer.play()}),this.audioPlayer.on("play",()=>{this.onPlayCallback&&this.onPlayCallback({})}),this.audioPlayer.on("pause",()=>{this.onPauseCallback&&this.onPauseCallback({})}),this.audioPlayer.on("timeUpdate",e=>{this.onTimeUpdateCallback&&this.onTimeUpdateCallback(e/1e3)}),this.audioPlayer.on("error",e=>{this.onErrorCallback&&this.onErrorCallback(e)})}get duration(){return this.audioPlayer.duration/1e3}get currentTime(){return this.audioPlayer.currentTime/1e3}get paused(){return this.audioPlayer.state===StateType$1.PAUSED}get src(){return this.audioPlayer.src}set src(t){if("string"!=typeof t)console.error(`[AdvancedAPI] src: ${t} is invalid`);else if(t&&(t.startsWith("http:")||t.startsWith("https:")||isFileUri(t)||isSandboxPath(t))){let e;if(t.startsWith("http:")||t.startsWith("https:"))e=t;else if(isFileUri(t)||isSandboxPath(t))try{var o=getFdFromUriOrSandBoxPath(t);e="fd://"+o}catch(e){console.info(""+JSON.stringify(e))}this.audioPlayer.src&&e!==this.audioPlayer.src&&this.audioPlayer.reset(),this.audioPlayer.src=e,this.tempSrc=t,this.audioPlayer.play(),this.startTimeS&&this.audioPlayer.seek(this.startTimeS),startBackgroundTask(),createAVSession(this)}else console.error(`[AdvancedAPI] src: ${t} is invalid`)}get startTime(){return this.startTimeS/1e3}set startTime(e){this.startTimeS=1e3*e}get buffered(){return this.audioPlayer.duration*this.bufferedS/1e5}get title(){return this.titleS}set title(e){this.titleS=e}get epname(){return this.epnameS}set epname(e){this.epnameS=e}get singer(){return this.singerS}set singer(e){this.singerS=e}get coverImgUrl(){return this.coverImgUrlS}set coverImgUrl(e){this.coverImgUrlS=e}get webUrl(){return this.webUrlS}set webUrl(e){this.webUrlS=e}get protocol(){return this.protocolS}set protocol(e){this.protocolS=e}play(){var e=this.audioPlayer.state;[StateType$1.PAUSED,StateType$1.STOPPED,StateType$1.IDLE].includes(e)&&(this.tempSrc&&""===this.audioPlayer.src&&(this.src=this.tempSrc),this.audioPlayer.play(),startBackgroundTask(),createAVSession(this))}pause(){var e=this.audioPlayer.state;StateType$1.PLAYING===e&&this.audioPlayer.pause()}stop(){var e=this.audioPlayer.state;[StateType$1.PAUSED,StateType$1.PLAYING].includes(e)&&(this.audioPlayer.stop(),this.onStopCallback&&this.onStopCallback({}),this.audioPlayer.release(),this.init(),destroyAVSession(this),stopBackgroundTask())}seek(e){var t=this.audioPlayer.state;[StateType$1.PAUSED,StateType$1.PLAYING].includes(t)&&this.audioPlayer.seek(1e3*e)}onCanplay(e){this.onCanplayCallback=e}onPlay(e){this.onPlayCallback=e}onPause(e){this.onPauseCallback=e}onStop(e){this.onStopCallback=e}onEnded(e){this.onFinishCallback=e}onTimeUpdate(e){this.onTimeUpdateCallback=e}onError(e){this.onErrorCallback=e}onPrev(e){console.info("ios only")}onNext(e){console.info("ios only")}onWaiting(e){this.onWaitingCallback=e}}class SecurityBase{static rsa(a,r){return new Promise(async(e,t)=>{var o;try{await(o=cryptoFramework.createMd(a)).update(r),e((await o.digest()).data)}catch(e){console.error("[QAFAPI]: rsa fail error code: "+e.code+", message is: "+e.message),t(e)}})}}class FileCallback{constructor({success:e,fail:t,complete:o}){checkDataType(e,!1,"function")&&(this.successFn=e),checkDataType(t,!1,"function")&&(this.failFn=t),checkDataType(o,!1,"function")&&(this.completeFn=o)}success(...e){if(this.successFn)try{this.successFn(...e)}catch(e){console.error(e)}if(this.completeFn)try{this.completeFn(...e)}catch(e){console.error(e)}}fail(...e){if(this.failFn)try{this.failFn(...e)}catch(e){console.error(e)}if(this.completeFn)try{this.completeFn(...e)}catch(e){console.error(e)}}}let openMode=fs.OpenMode,ERROR={PARAMETER_ERROR:1001},modeReflect={ax:"a","ax+":"a+",wx:"w","wx+":"w+"},ENCODING=["utf8","utf-8","ascii","base64","binary","hex","ucs2","ucs-2","utf16le","utf-16le","latin1"];function getOpenMode(e){let t;switch(e){case"a":t=openMode.CREATE|openMode.APPEND;break;case"a+":t=openMode.CREATE|openMode.READ_WRITE|openMode.APPEND;break;case"as":t=openMode.SYNC|openMode.CREATE|openMode.APPEND;break;case"as+":t=openMode.SYNC|openMode.CREATE|openMode.READ_WRITE|openMode.APPEND;break;case"r":t=openMode.READ_ONLY;break;case"r+":t=openMode.READ_WRITE;break;case"w":t=openMode.CREATE|openMode.WRITE_ONLY|openMode.TRUNC;break;case"w+":t=openMode.CREATE|openMode.READ_WRIT|openMode.TRUNC}return t}function getFileTypeMode(e){return e.isBlockDevice()?24576:e.isCharacterDevice()?8192:e.isDirectory()?16384:e.isFIFO()?4096:e.isFile()?32768:e.isSocket()?49152:e.isSymbolicLink()?40960:void 0}function mkdirRecursive(e,t){var o=t.shift();e=e||o?e+"/"+o:"",o&&!fs.accessSync(e)&&fs.mkdirSync(e),0{e?(console.debug("[AdvancedAPI] file access exist"),r.success({errMsg:"access:ok"})):r.fail({errMsg:"access:fail no such file or directory"})},e=>{console.debug("[AdvancedAPI] access failed with error message: %s, code = %d",e.message,e.code)}):r.fail({errMsg:"access:fail parameter error: parameter.path should be String",errno:ERROR$1.PARAMETER_ERROR})}accessSync(e){if(!checkDataType(e,!0,"string"))throw new Error("accessSync:fail path must be a string");if(!fs.accessSync(e))throw new Error("accessSync:fail no such file or directory")}appendFile({filePath:e,data:o,encoding:t=DEFAULT_ENCODING,success:a,fail:r,complete:s}){let i=new FileCallback({success:a,fail:r,complete:s});if(checkDataType(e,!0,"string"))if(checkDataType(o,!0,["string","arraybuffer"]))if(fs.accessSync(e)){let t=fs.openSync(e,fs.OpenMode.READ_WRITE|fs.OpenMode.APPEND);fs.write(t.fd,o).then(e=>{i.success({errMsg:"appendFile:ok"}),fs.closeSync(t)}).catch(e=>{console.error("[AdvancedAPI] appendFile failed with error message: "+e.message+", error code: "+e.code),i.fail({errMsg:"appendFile:fail "+e.message})})}else i.fail({errMsg:`appendFile:fail no such file or directory, open "${e}"`});else i.fail({errMsg:"access:fail parameter error: parameter.data should be String/ArrayBuffer",errno:ERROR$1.PARAMETER_ERROR});else i.fail({errMsg:"access:fail parameter error: parameter.filePath should be String",errno:ERROR$1.PARAMETER_ERROR})}appendFileSync(e,t,o=DEFAULT_ENCODING){if(!checkDataType(e,!0,"string"))throw new Error("access:fail parameter error: parameter.filePath should be String");if(!checkDataType(t,!0,["string","arraybuffer"]))throw new Error("access:fail parameter error: parameter.data should be String/ArrayBuffer");if(!fs.accessSync(e))throw new Error(`appendFile:fail no such file or directory, open "${e}"`);e=fs.openSync(e,fs.OpenMode.READ_WRITE|fs.OpenMode.APPEND),fs.writeSync(e.fd,t)}open({filePath:e,flag:t=DEFAULT_FLAG,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});if(checkDataType(e,!0,"string")){if(FLAG.includes(t)||(t=DEFAULT_FLAG),Object.keys(modeReflect).includes(t)){if(fs.accessSync(e))return void s.fail({errMsg:"open:fail EXIST: file already exists"});console.debug("[AdvancedAPI] access fail"),t=modeReflect[t]}fs.open(e,getOpenMode(t),(e,t)=>{e?(console.error("[AdvancedAPI] open failed with error message: "+e.message+", error code: "+e.code),s.fail({errMsg:"open:fail "+e.message,errno:ERROR$1.NO_SUCH_FILE_OR_DIRECTORY})):s.success({fd:t.fd.toString(),errMsg:"open:ok"})})}else s.fail({errMsg:"open:fail parameter error: parameter.filePath should be String",errno:ERROR$1.PARAMETER_ERROR})}openSync({filePath:e,flag:t}){if(!checkDataType(e,!0,"string"))throw new Error("openSync:fail parameter error: parameter.filePath should be String");if(FLAG.includes(t)||(t=DEFAULT_FLAG),Object.keys(modeReflect).includes(t)){if(fs.accessSync(e))throw new Error("openSync:fail EXIST: file already exists");console.debug("[AdvancedAPI] access fail"),t=modeReflect[t]}return fs.openSync(e,getOpenMode(t)).fd.toString()}close({fd:e,success:t,fail:o,complete:a}){let r=new FileCallback({success:t,fail:o,complete:a});""!==e&&checkDataType(e,!0,"string")?(e=Number(e),isNaN(e)?r.fail({errMsg:"close:fail bad file descriptor"}):fs.close(e,e=>{e?r.fail({errMsg:"close:fail bad file descriptor"}):r.success({errMsg:"close:ok"})})):r.fail({errMsg:"close:fail invalid fd",errno:ERROR$1.PARAMETER_ERROR})}closeSync({fd:e}){if(""===e||!checkDataType(e,!0,"string"))throw new Error("closeSync:fail invalid fd");if(e=Number(e),isNaN(e))throw new Error("closeSync:fail invalid fd");fs.closeSync(e)}copyFile({srcPath:e,destPath:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});if((o=checkPathExistence("copyFile","srcPath",e)).isValid)if((a=checkPath("copyFile","destPath",t)).isValid)if(fs.statSync(e).isDirectory())s.fail({errMsg:"copyFile: fail illegal operation on a directory, open: "+e});else{if(fs.accessSync(t)){if((r=fs.statSync(t)).isDirectory())t+=obtainFileName(e).fileName;else if(r.isFile()&&e!==t)return void s.fail({errMsg:"copyFile: fail copyFile failed"})}else if(r=obtainUpperPath(t),!fs.accessSync(r.upperPath))return void s.fail({errMsg:"copyFile: fail no such file or directory, open: "+t});fs.copyFile(e,t).then(()=>{s.success({errMsg:"copyFile: ok"})}).catch(e=>{s.fail({errMsg:`copyFile: failed with error message: ${e.message}, error code: `+e.code})})}else s.fail(a.checkMsg);else s.fail(o.checkMsg)}copyFileSync(e,t){var o=checkPathExistenceSync("copyFileSync","srcPath",e);if(!o.isValid)throw new Error(o.errMsg);if(!(o=checkPathSync("copyFileSync","destPath",t)).isValid)throw new Error(o.errMsg);if(fs.statSync(e).isDirectory())throw new Error("copyFileSync: fail illegal operation on a directory: "+e);if(fs.accessSync(t)){if((o=fs.statSync(t)).isDirectory()){var a=t.lastIndexOf("/");let e=t.substring(a);t.endsWith("/")&&(e=t.substring(t.lastIndexOf("/",t.length-2)+1,t.length-1)),t+=e}else if(o.isFile()&&e!==t)throw new Error("copyFileSync: fail copyFile failed")}else if(a=obtainUpperPath(t),!fs.accessSync(a.upperPath))throw new Error("copyFileSync: fail no such file or directory: "+t);try{fs.copyFileSync(e,t)}catch(e){throw new Error("copyFileSync: "+e.message)}}fstat({fd:e,success:t,fail:o,complete:a}){let r=new FileCallback({success:t,fail:o,complete:a});(t=checkFd("fstat",e)).isValid?(e=t.fd,fs.stat(e,(e,t)=>{e?r.fail({errMsg:`fstat: failed with error message: ${e.message}, error code: `+e.code}):(e=getFileTypeMode(t)|t.mode,r.success({stat:{mode:e,size:t.size,lastAccessedTime:t.atime,lastModifiedTime:t.mtime,isDirectory:()=>t.isDirectory(),isFile:()=>t.isFile()},errMsg:"fstat: ok"}))})):r.fail(t.checkMsg)}fstatSync({fd:t}){var e=checkFdSync("fstatSync",t);if(!e.isValid)throw new Error(e.errMsg);t=e.fd;try{let e=fs.statSync(t);return{stat:{mode:getFileTypeMode(e)|e.mode,size:e.size,lastAccessedTime:e.atime,lastModifiedTime:e.mtime,isDirectory:()=>e.isDirectory(),isFile:()=>e.isFile()}}}catch(e){throw new Error("fstatSync: "+e.message)}}ftruncate({fd:e,length:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});(o=checkFd("ftruncate",e)).isValid?(e=o.fd,(!checkDataType(t,!0,"number")||t<0)&&(t=DEFAULT_LENGTH),fs.truncate(e,t).then(()=>{s.success({errMsg:"ftruncate: ok"})}).catch(e=>{s.fail({errMsg:`ftruncate: failed with error message: ${e.message}, error code: `+e.code})})):s.fail(o.checkMsg)}ftruncateSync({fd:e,length:t}){var o=checkFdSync("ftruncateSync",e);if(!o.isValid)throw new Error(o.errMsg);e=o.fd,(!checkDataType(t,!0,"number")||t<0)&&(t=DEFAULT_LENGTH);try{fs.truncateSync(e,t)}catch(e){throw new Error("ftruncateSync: "+e.message)}}mkdir({dirPath:e,recursive:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});checkDataType(t,!1,"boolean")||(t=Boolean(t)),(o=checkPath("mkdir","dirPath",e)).isValid?fs.accessSync(e)?s.fail({errMsg:"mkdir: dirPath already exists: "+e}):t?(mkdirRecursive("",e.split("/")),s.success({errMsg:"mkdir: ok"})):(a=obtainUpperPath(e),fs.accessSync(a.upperPath)?fs.mkdir(e).then(()=>{s.success({errMsg:"mkdir: ok"})}).catch(e=>{s.fail({errMsg:`mkdir: failed with error message: ${e.message}, error code: `+e.code})}):s.fail({errMsg:"mkdir: failed"})):s.fail(o.checkMsg)}mkdirSync(e,t){checkDataType(t,!1,"boolean")||(t=Boolean(t));var o=checkPathSync("mkdirSync","dirPath",e);if(!o.isValid)throw new Error(o.errMsg);if(fs.accessSync(e))throw new Error("mkdirSync: dirPath already exists: "+e);if(!t&&!fs.accessSync(obtainUpperPath(e).upperPath))throw new Error("mkdirSync: fail, recursive is false and upper path does not exist");if(t)try{mkdirRecursive("",e.split("/"))}catch(e){throw new Error("mkdirSync: "+e.message)}else try{fs.mkdirSync(e)}catch(e){throw new Error("mkdirSync: "+e.message)}}read({fd:e,arrayBuffer:r,offset:t=DEFAULT_OFFSET,length:s,position:i,success:o,fail:a,complete:n}){let c=new FileCallback({success:o,fail:a,complete:n});if(!checkDataType(e,!0,"string")||""===e||isNaN(Number(e)))c.fail({errMsg:"read: fail invalid fd"});else if(e=Number(e),checkDataType(r,!0,"arraybuffer"))if((!checkDataType(t,!1,"number")||t<0)&&(t=Number(t),isNaN(t)||t<0)&&(t=DEFAULT_OFFSET),(!checkDataType(s,!1,"number")||s<0)&&(s=Number(s),isNaN(s)||s<0)&&(s=DEFAULT_LENGTH),(o=r.byteLength-t){var t=new Uint8Array(a);new Uint8Array(r).set(t,o),console.debug("[AdvancedAPI] the content of arrayBuffer: %s",String.fromCharCode.apply(null,new Uint8Array(a.slice(0,e)))),c.success({bytesRead:e,arrayBuffer:r,errMsg:"read: ok"})}).catch(e=>{c.fail({errMsg:`read: failed with error message: ${e.message},error code: `+e.code})})}else c.fail({errMsg:"read: fail invalid arrayBuffer: "+r})}readSync({fd:e,arrayBuffer:t,offset:o,length:a,position:r}){if(!checkDataType(e,!0,"string")||""===e||isNaN(Number(e)))throw new Error("readSync:fail invalid fd");if(e=Number(e),!checkDataType(t,!0,"arraybuffer"))throw new Error("readSync: fail invalid arrayBuffer");(!checkDataType(o,!1,"number")||o<0)&&(o=Number(o),isNaN(o)||o<0)&&(o=DEFAULT_OFFSET),(!checkDataType(a,!1,"number")||a<0)&&(a=Number(a),isNaN(a)||a<0)&&(a=DEFAULT_LENGTH);var s=t.byteLength-o;if(s{r.success({files:e,errMsg:"readdir: ok"})}).catch(e=>{r.fail({errMsg:`readdir: failed with error message: ${e.message}, error code: `+e.code})}):r.fail(t.checkMsg)}readdirSync(e){var t=checkPathExistence("readdirSync","dirPath",e);if(!t.isValid)throw new Error(t.errMsg);if(fs.statSync(e).isFile())throw new Error("readdirSync: fail not a directory: ${dirPath}");try{return{files:fs.listFileSync(e)}}catch(e){throw new Error("readdirSync: "+e.message)}}readFile({filePath:o,encoding:a,position:r=DEFAULT_POSITION,length:s,success:e,fail:t,complete:i}){o=isSandboxPath(o)?switchInternalToHapSandBox(o):o;let n=new FileCallback({success:e,fail:t,complete:i});if((e=checkPathExistence("readFile","filePath",o)).isValid)if((t=fs.statSync(o)).isDirectory())n.fail({errMsg:"readFile:fail not absolute path: "+o});else if((i=checkEncoding("readFile",a)).isValid)if(t=t.size,s=null==s?t:s,checkDataType(r,!1,"number"))if(checkDataType(s,!1,"number"))if(r<0||t{var e=a?buffer.from(t).toString(a):t;n.success({data:e,errMsg:"readFile:ok"})}).catch(e=>{n.fail({errMsg:`readFile:fail error message: ${e.message}, error code: `+e.code})}).finally(()=>{fs.closeSync(e)})}else n.fail({errMsg:"readFile:fail invalid length: "+s});else n.fail({errMsg:"readFile:fail invalid position: "+r});else n.fail({errMsg:i.checkMsg});else n.fail(e.checkMsg)}readFileSync(e,t,o=DEFAULT_POSITION,a){var r=checkPathExistenceSync("readFileSync","filePath",e=isSandboxPath(e)?switchInternalToHapSandBox(e):e);if(!r.isValid)throw new Error(r.errMsg);if((r=fs.statSync(e)).isDirectory())throw new Error("readFileSync:fail illegal operation on a directory, open: "+e);var s=checkEncoding("readFile",t);if(!s.isValid)throw new Error(s.checkMsg);if(s=r.size,a=null==a?s:a,!checkDataType(o,!1,"number"))throw new Error("readFileSync:fail invalid position: "+o);if(!checkDataType(a,!1,"number"))throw new Error("readFileSync:fail invalid length: "+a);if(o<0||s{s.success({errMsg:"rename: ok"})}).catch(e=>{s.fail({errMsg:`rename: failedwith error message: ${e.message}, error code: `+e.code})})}else s.fail(a.checkMsg);else s.fail(o.checkMsg)}renameSync(e,t){var o=checkPathExistenceSync("renameSync","oldPath",e);if(!o.isValid)throw new Error(o.errMsg);if(!(o=checkPathSync("renameSync","newPath",t)).isValid)throw new Error(o.errMsg);if(!(o=fs.accessSync(t))&&!fs.accessSync(obtainUpperPath(t).upperPath))throw new Error("renameSync: fail no such file or directory, open: "+t);if(o&&e!==t)throw new Error("renameSync: fail");try{fs.renameSync(e,t)}catch(e){throw new Error("renameSync: "+e.message)}}rmdir({dirPath:e,recursive:t,success:o,fail:a,complete:r}){let s=new FileCallback({success:o,fail:a,complete:r});checkDataType(t,!1,"boolean")||(t=Boolean(t)),(o=checkPathExistence("rmdir","dirPath",e)).isValid?fs.statSync(e).isDirectory()?!t&&fs.listFileSync(e).length?s.fail({errMsg:"rmdir: fail directory not empty"}):fs.rmdir(e).then(()=>{console.debug("[AdvanceAPI] rmdir succeed"),s.success({errMsg:"rmdir: ok"})}).catch(e=>{console.error(`[AdvanceAPI] rmdir failed with error message: ${e.message}, error code: `+e.code),s.fail({errMsg:"rmdir: failed"})}):s.fail({errMsg:"rmdir: fail no such directory, open: "+e}):s.fail(o.checkMsg)}rmdirSync(e,t){checkDataType(t,!1,"boolean")||(t=Boolean(t));var o=checkPathExistenceSync("rmdirSync","dirPath",e);if(!o.isValid)throw new Error(o.errMsg);if(!fs.statSync(e).isDirectory())throw new Error("rmdirSync: fail no such directory, open: "+e);if(!t&&0{console.debug("[AdvancedAPI] truncate: success, the read length is: %d",t),s.success({errMsg:"truncate: ok"})}).catch(e=>{console.error(`[AdvancedAPI] truncate: fail with error message: ${e.message}, error code: `+e.code),s.fail({errMsg:`truncate: failed with error message: ${e.message}, error code: `+e.code})})):s.fail(o.checkMsg)}truncateSync({filePath:e,length:t}){var o=checkPathExistenceSync("truncateSync","filePath",e);if(!o.isValid)throw new Error(o.errMsg);if(fs.statSync(e).isDirectory())throw new Error("truncateSync: fail, illegal operation on a directory, open: "+e);(!checkDataType(t,!0,"number")||t<0)&&(t=DEFAULT_LENGTH);try{fs.truncateSync(e,t)}catch(e){throw new Error("truncateSync: "+e.message)}}getFileInfo({filePath:e,success:t,fail:o,complete:a}){t=new FileCallback({success:t,fail:o,complete:a}),(e=isSandboxPath(e)?switchInternalToHapSandBox(e):e)&&checkDataType(e,!0,"string")?fs.accessSync(e)?(o=fs.statSync(e),t.success({size:o.size,errMsg:"getFileInfo:ok "})):t.fail({errMsg:"getFileInfo: fail no such file or directory : "+e}):t.fail({errMsg:"getFileInfo:fail invalid filePath "})}}class ASFile{constructor(){this.DIGESTALGORITHM_VALUES=["MD5","SHA1"],this.saveFileDir=context.filesDir+"/saveFiles",this.fileSystemManager=new FileSystemManager,this.init()}init(){try{FileioBase.ohosMkdirSync(this.saveFileDir)}catch(e){console.debug("[AdvancedAPI] %s 已存在",this.saveFileDir)}}saveFile(e){return new Promise(async(s,i)=>{var n=e.tempFilePath;if(n)try{let e=n.substr(n.lastIndexOf("/")),t=e&&e.split(".").pop(),o=(new Date).getTime(),a=(t&&(o+="."+t),getFdFromUriOrSandBoxPath(isSandboxPath(n)?fileuri.getUriFromPath(switchInternalToHapSandBox(n)):n)),r=this.saveFileDir+"/"+o;FileioBase.ohosCopy(a,r).then(()=>{console.debug("[AdvancedAPI] saveFile succeed"),s({savedFilePath:r})}).catch(e=>{console.error("[AdvancedAPI] saveFile failed with error message: "+e.message+", error code: "+e.code),i([e.message,ErrorCode$1.IO_ERROR])})}catch(e){console.error("[AdvancedAPI] tempFilePath does not exist"),i(["tempFilePath does not exist",ErrorCode$1.PARAMETER_ERROR])}else console.error("[AdvancedAPI] invalid tempFilePath."),i(["tempFilePath is required.",ErrorCode$1.PARAMETER_ERROR])})}getSavedFileList(){return new Promise((e,t)=>{var o=[],a=FileioBase.ohosOpendirSync(this.saveFileDir).ohosReadsync();for(let e=0;e{var o=a.filePath;o?(o=getFdFromUriOrSandBoxPath(isSandboxPath(o)?fileuri.getUriFromPath(switchInternalToHapSandBox(o)):o),e({createTime:(e=FileioBase.ohosStatSync(o)).mtime,size:e.size,errMsg:"getSavedFileInfo:ok"})):(console.error("[AdvancedAPI] filePath is required."),t(["filePath is required",ErrorCode$1.PARAMETER_ERROR]))})}removeSavedFile(r){return new Promise((e,t)=>{var o=r.filePath;if(o)try{var a=isSandboxPath(o)?switchInternalToHapSandBox(o):o;FileioBase.ohosUnlinkSync(a),e("success")}catch(e){t(["removeSavedFile is fail",ErrorCode$1.IO_ERROR])}else console.error("[AdvancedAPI] filePath is required."),t(["filePath is required",ErrorCode$1.PARAMETER_ERROR])})}getFileInfo(t){return new Promise((r,e)=>{let s=t.filePath,{digestAlgorithm:i="MD5"}=t;if(s){"string"==typeof i&&(i=i.toUpperCase()),this.DIGESTALGORITHM_VALUES.includes(i)||(console.error("[AdvancedAPI] digestAlgorithm is invalid."),i="MD5");try{let e=isSandboxPath(s)?fileuri.getUriFromPath(switchInternalToHapSandBox(s)):s,t=FileioBase.ohosOpenSync(e,2).fd,o=FileioBase.ohosStatSync(t),a=new ArrayBuffer(o.size);FileioBase.ohosReadSync(t,a),SecurityBase.rsa(i,{data:new Uint8Array(a)}).then(e=>{var t=new util.TextDecoder("utf-8",{ignoreBOM:!0});r({size:o.size,digest:t.decodeWithStream(e,{stream:!1})})})}catch(s){console.error("[AdvancedAPI] getFileInfo fail err = "+JSON.stringify(s)),e(["getFileInfo is fail",ErrorCode$1.IO_ERROR])}}else console.error("[AdvancedAPI] filePath is required."),e(["filePath is required",ErrorCode$1.PARAMETER_ERROR])})}openDocument(a){return new Promise((e,t)=>{var{showMenu:o=!1}=a;o&&console.error("[AdvancedAPI] showMenu do not support.")})}getFileSystemManager(){return this.fileSystemManager}}let name=settings.display.SCREEN_BRIGHTNESS_STATUS;class BrightnessBase{static ohoGetValue(){try{var e=settings.getValueSync(context,name,"1");return console.log("[AdvancedAPI] success to get brightness. value:"+e),Math.round(2.55*e),e}catch(e){console.log("[QAFAPI] Failed to get brightness. Cause:"+JSON.stringify(e))}}}_dec$2=jsMethod({alias:"getValue",common:!1,callback:!0}),_dec2$2=jsMethod({alias:"setValue",common:!1,callback:!0}),_dec3$1=jsMethod({alias:"setKeepScreenOn",common:!1,callback:!0}),_applyDecoratedDescriptor((_class$2=class{getValue(){return new Promise((o,t)=>{try{window.getLastWindow(context).then(e=>{let t=e.getWindowProperties().brightness;(!t||t<0)&&(t=Number(BrightnessBase.ohoGetValue())/255),e={value:Math.round(255*t)},console.debug("[QAFAPI] getValue success, brightness = "+JSON.stringify(e)),o([e])})}catch(e){t([["Failed to get brightness"]]),console.error("Failed to obtain the window properties. Cause: "+JSON.stringify(e))}})}setValue(e){return new Promise((o,a)=>{var r,s=e.value;if(s||0===s)if(isNumber(r=s)){let e=Math.floor(r),t=(e<0?e=1:255{e.setWindowBrightness(t,e=>{e.code?(a([["setWindowBrightness fail"]]),console.error("[QAFAPI] Failed to set the brightness. Cause: "+JSON.stringify(e))):(o("successed to set"),console.info("[QAFAPI] Succeeded in setting the brightness."))})})}catch(s){console.error("[QAFAPI] Failed to set setting of brightness. Cause:"+JSON.stringify(s)),a([["setWindowBrightness fail"]])}}else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]]);else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]])})}setKeepScreenOn(e){return new Promise((o,a)=>{if(e&&""!==e.keepScreenOn&&null!==e.keepScreenOn){let t=e.keepScreenOn;if("boolean"==typeof t)try{window.getLastWindow(context).then(e=>{e.setWindowKeepScreenOn(t,e=>{e.code?(console.error("[QAFAPI] Failed to set the screen to be always on. Cause: "+JSON.stringify(e)),a([["handling failed"]])):(o(["handling success"]),console.info("[QAFAPI] Succeeded in setting the screen to be always on."))})})}catch(e){console.error("[QAFAPI] Failed to set the screen to be always on. exception: "+JSON.stringify(e)),a([["handling failed"]])}else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]])}else a([["inalid param",ErrorCode$1.PARAMETER_ERROR]])})}}).prototype,"getValue",[_dec$2],Object.getOwnPropertyDescriptor(_class$2.prototype,"getValue"),_class$2.prototype),_applyDecoratedDescriptor(_class$2.prototype,"setValue",[_dec2$2],Object.getOwnPropertyDescriptor(_class$2.prototype,"setValue"),_class$2.prototype),_applyDecoratedDescriptor(_class$2.prototype,"setKeepScreenOn",[_dec3$1],Object.getOwnPropertyDescriptor(_class$2.prototype,"setKeepScreenOn"),_class$2.prototype);let BrightnessBaseModule=_class$2;class ASBrightness extends BrightnessBaseModule{setScreenBrightness(e){if(console.info("[AdvancedAPI] params = "+JSON.stringify(e)),e&&void 0!==e.value&&"number"==typeof e.value){var t=e.value;if(t<=1&&0<=t)return this.setValue({value:Math.round(255*e.value)})}return new Promise((e,t)=>{t(["param is invalid.",ErrorCode$1.PARAMETER_ERROR])})}getScreenBrightness(){return this.getValue()}asSetKeepScreenOn(e){return this.setKeepScreenOn(e)}}class ASInterceptor{constructor(){this.apiLists={},this.globals=[]}checkApiName(e){return"addInterceptor"!==e&&"removeInterceptor"!==e}invoke(e,t){this.globals.forEach(e=>{"function"==typeof(e=e.invoke)&&e(...t)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.invoke)&&e(...t)})}success(e,o){let a=[];if(this.globals.forEach(e=>{"function"==typeof(e=e.success)&&a.push(e)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.success)&&a.push(e)}),a.length){let t=o&&JSON.parse(JSON.stringify(o));return a.forEach(e=>{e(...t)}),t}}fail(e,o){let a=[];if(this.globals.forEach(e=>{"function"==typeof(e=e.fail)&&a.push(e)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.fail)&&a.push(e)}),a.length){let t=o&&JSON.parse(JSON.stringify(o));return a.forEach(e=>{e(...t)}),t}}complete(e,o){let a=[];if(this.globals.forEach(e=>{"function"==typeof(e=e.complete)&&a.push(e)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.complete)&&a.push(e)}),a.length){let t=o&&JSON.parse(JSON.stringify(o));return a.forEach(e=>{e(...t)}),t}}returnValue(e,t){this.globals.forEach(e=>{"function"==typeof(e=e.returnValue)&&e(t)}),(this.apiLists[e]||[]).forEach(e=>{"function"==typeof(e=e.returnValue)&&e(t)})}}let SCAN_TYPE_AS_TO_HM={barCode:null==scanCore?void 0:scanCore.ScanType.ONE_D_CODE,qrCode:null==scanCore?void 0:scanCore.ScanType.TWO_D_CODE,datamatrix:null==scanCore?void 0:scanCore.ScanType.DATAMATRIX_CODE,pdf417:null==scanCore?void 0:scanCore.ScanType.PDF417_CODE};class ASScan{scanCode(i={}){return new Promise((t,o)=>{var{onlyFromCamera:e=!1,hideAlbum:a=!1,scanType:r=[]}=i,s=[];for(let e=0;e{t({result:e.originalValue,scanType:this.scanTypeHmToAs(e.scanType),rawData:gBase64.btoa(e.originalValue),charSet:"utf-8"})}).catch(e=>{o(["scanCode fail!",ErrorCode$1.COMMON_ERROR])})}catch(e){o(["scanCode fail!",ErrorCode$1.COMMON_ERROR])}}else o(["Parameter hideAlbum invalid!",ErrorCode$1.PARAMETER_ERROR]);else o(["Parameter onlyFromCamera invalid!",ErrorCode$1.PARAMETER_ERROR])})}scanTypeHmToAs(e){let t="UNKNOWN";switch(e){case scanCore.ScanType.DATAMATRIX_CODE:t="DATA_MATRIX";break;case scanCore.ScanType.PDF417_CODE:t="PDF_417";break;case scanCore.ScanType.AZTEC_CODE:t="AZTEC";break;case scanCore.ScanType.CODABAR_CODE:t="CODABAR";break;case scanCore.ScanType.CODE39_CODE:t="CODE_39";break;case scanCore.ScanType.CODE93_CODE:t="CODE_93";break;case scanCore.ScanType.CODE128_CODE:t="CODE_128";break;case scanCore.ScanType.EAN8_CODE:t="EAN_8";break;case scanCore.ScanType.EAN13_CODE:t="EAN_13";break;case scanCore.ScanType.ITF14_CODE:t="ITF";break;case scanCore.ScanType.QR_CODE:t="QR_CODE";break;case scanCore.ScanType.UPC_A_CODE:t="UPC_A";break;case scanCore.ScanType.UPC_E_CODE:t="UPC_E";break;case scanCore.ScanType.MULTIFUNCTIONAL_CODE:t="MULTIFUNCTIONAL";break;case scanCore.ScanType.ONE_D_CODE:t="CODABAR";break;case scanCore.ScanType.TWO_D_CODE:t="QR_CODE"}return t}}let asModulesMap=new Map,moduleInstance=(asModulesMap.set("ASDevice",ASDevice),asModulesMap.set("ASLocation",ASLocation),asModulesMap.set("ASPhone",ASPhone),asModulesMap.set("ASRequest",ASRequest),asModulesMap.set("ASRouter",ASRouter),asModulesMap.set("ASBluetooth",ASBluetooth),asModulesMap.set("ASWifi",ASWifi),asModulesMap.set("ASAuthentication",ASAuthentication),asModulesMap.set("ASAccelerometer",ASAccelerometer),asModulesMap.set("ASCompass",ASCompass),asModulesMap.set("ASGyroscope",ASGyroscope),asModulesMap.set("ASContact",ASContact),asModulesMap.set("ASVibrator",ASVibrator),asModulesMap.set("ASCapture",ASCapture),asModulesMap.set("ASKeyboard",ASKeyboard),asModulesMap.set("ASImage",ASImage),asModulesMap.set("ASBrightness",ASBrightness),asModulesMap.set("ASFile",ASFile),asModulesMap.set("ASAudio",ASAudio),asModulesMap.set("ASBGAudio",ASBGAudio),asModulesMap.set("ASVideo",ASViedo),asModulesMap.set("ASInterceptor",ASInterceptor),asModulesMap.set("ASScan",ASScan),{});function requireAPI$1(e){var t;return moduleInstance[e]||(console.debug("[AdvancedAPI] create %s",e),t=asModulesMap.get(e),moduleInstance[e]=new t),moduleInstance[e]}class CallbackManager{constructor(e){this.lastCallbackId=0,this.callbacks=[]}add(e){return this.lastCallbackId++,(this.callbacks[this.lastCallbackId]=e).__callbackId=this.lastCallbackId,this.lastCallbackId}consume(e,t,o){var a=this.callbacks[e];return void 0===o||!1===o?this.callbacks[e]=void 0:a.isKeepAlive=!0,"function"==typeof a?a(t):new Error(`invalid callback id "${e}"`)}close(){this.callbacks=this.callbacks.map(e=>{})}}let callbackManager=new CallbackManager;function interceptCallback(e,a,t=!0,o=!0){if(!(t||0!==e.length&&o))return{args:e};let r=e[0],s={},i=!1;if("object"==typeof r&&"[object object]"===Object.prototype.toString.call(r).toLowerCase()&&1===e.length)for(var n in r){var c=r[n];"function"==typeof c?s[n]=c:i=!0}else i=!0;"function"==typeof r&&(t=!1,r.isConnected?r.cb&&(e[0]=r.cb.id):(((o=e=>{r.apply(null,e.arguments)}).originFn=r).cb=o,e[0]=o));let l;var d,o=Object.keys(s).length;if(t&&o<=0){class h{constructor(){this.promise=new Promise((e,t)=>{this.reject=t,this.resolve=e})}}l=new h}return(0{let t=s[e.method];advancedResult(a,e);var o=triggerMethodIntercept(a,e.method,e.arguments)||e.arguments,{ignoreComplete:o=!1}=(void 0!==t&&t.apply(null,o),e);o||(o=triggerMethodIntercept(a,"complete",e.arguments)||e.arguments,void 0!==(t=s.complete)&&t.apply(null,o)),l&&(o=(o=e.arguments)&&0normalize(e))),r&&r.cb&&(r.isConnected=!0),{args:e,promise:l,needPromise:t}}function normalize(e){var t;return"function"==typeof e?(t=callbackManager.add(e),e.id=t):e}function advancedResult(e,t){var o;"success"===t.method?(t.arguments[0]&&"object"==typeof t.arguments[0]||(t.arguments[0]={}),void 0===(o=t.arguments[0]).errMsg&&(o.errMsg=e+":ok"),void 0===o.errCode&&(o.errCode=0)):"fail"===t.method&&(o=t.arguments||[],t.arguments=[{moduleName:""+e,errMsg:e+":fail:"+o.shift(),errCode:o.shift(),grantStatus:o.shift(),dialogShownResults:o.shift()}])}function triggerMethodIntercept(e,t,o){var a=requireAPI("ASInterceptor");if("function"==typeof(t=a[t]))return t.call(a,e,o)}class JSCallback{constructor(e){this.id=e.id,this._valid=!0}invoke(e){this._valid?callbackManager.consume(this.id,e,e.ifKeepAlive):console.error(`[AdvancedAPI] callback ${this.id} had be destroyed.`)}invokeAndKeepAlive(e){this._valid?callbackManager.consume(this.id,e,!0):console.error(`[AdvancedAPI] callback ${this.id} had be destroyed.`)}destroy(){this.id=void 0,this._valid=!1}}let jsCallbackMap=new Map;function getSystemInfoSync(){return console.debug("[AdvancedAPI] start getSystemInfoSync"),requireAPI("ASDevice").getSystemInfoSync()}function getDeviceInfo(...e){return console.debug("[AdvancedAPI] start getDeviceInfo"),e.pop(),e=requireAPI("ASDevice"),console.debug("[AdvancedAPI] device.getInfo"),e=e.getDeviceInfo()}function getWindowInfo(...e){return console.debug("[AdvancedAPI] start getWindowInfo"),e.pop(),requireAPI("ASDevice").getWindowInfo()}function getAppBaseInfo(...e){return console.debug("[AdvancedAPI] start getAppBaseInfo"),e.pop(),requireAPI("ASDevice").getAppBaseInfo()}function getAppAuthorizeSetting(...e){return console.debug("[AdvancedAPI] start getAppAuthorizeSetting"),e.pop(),requireAPI("ASDevice").getAppAuthorizeSetting()}function getSystemSetting(...e){return console.debug("[AdvancedAPI] start getSystemSetting"),e.pop(),e=requireAPI("ASDevice"),console.debug("[AdvancedAPI] device.getSystemSetting"),e=e.getSystemSetting()}function openAppAuthorizeSetting(...e){console.debug("[AdvancedAPI] start getSystemSetting");var e=e.pop(),t=requireAPI("ASDevice");try{t.openAppAuthorizeSetting(),e.invoke(Result.success("success"))}catch(t){e.invoke(Result.fail(["fail"],201))}}function navigateTo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASRouter").navigateTo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function redirectTo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASRouter").redirectTo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function navigateBack(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASRouter").navigateBack(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getLocation(...e){console.debug("[AdvancedAPI] start getLocation");let o=e.pop();var e=e.pop(),t=requireAPI("ASLocation");console.debug("[AdvancedAPI] geolocation.getLocation"),t.getLocation(e).then(e=>{console.debug("[AdvancedAPI] geolocation.getLocation success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.getLocation fail"),o.invoke(Result.fail(e))})}function onLocationChange(...e){console.debug("[AdvancedAPI] start onLocationChange"),e=e.pop(),requireAPI("ASLocation").onLocationChange(e)}function offLocationChange(...e){console.debug("[AdvancedAPI] start offLocationChange");let t=e.pop();(e=requireAPI("ASLocation")).offLocationChange(t),e.getLocation({timeout:5e3,coordType:"wgs86"}).then(e=>{console.debug("[AdvancedAPI] geolocation.offLocationChange callback"),t.invokeAndKeepAlive(Result.success(e))},e=>{t.invokeAndKeepAlive(Result.fail([e[0][0],e[0][1]]))})}function onLocationChangeError(...e){console.debug("[AdvancedAPI] start onLocationChangeError");let t=e.pop();requireAPI("ASLocation").onLocationChangeError(e=>{console.debug("[AdvancedAPI] geolocation.onLocationChange success"),t.invokeAndKeepAlive(Result.callback(e))})}function offLocationChangeError(...e){console.debug("[AdvancedAPI] start offLocationChangeError"),e=e.pop(),requireAPI("ASLocation").offLocationChangeError(),e.invoke(Result.success())}function startLocationUpdate(...e){console.debug("[AdvancedAPI] start startLocationUpdate");let o=e.pop();requireAPI("ASLocation").startLocationUpdate().then(e=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdate success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdate fail"),o.invoke(Result.fail([e[0][0],e[0][1]]))})}function startLocationUpdateBackground(...e){console.debug("[AdvancedAPI] start startLocationUpdateBackground");let o=e.pop();requireAPI("ASLocation").startLocationUpdateBackground().then(e=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdateBackground success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.startLocationUpdateBackground fail"),o.invoke(Result.fail([e[0][0],e[0][1]]))})}function stopLocationUpdate(...e){console.debug("[AdvancedAPI] start stopLocationUpdate");let o=e.pop();requireAPI("ASLocation").stopLocationUpdate(o).then(e=>{console.debug("[AdvancedAPI] geolocation.stopLocationUpdate success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] geolocation.stopLocationUpdate fail"),o.invoke(Result.fail([e[0][0],e[0][1]]))})}function makePhoneCall(...e){let t=e.pop();e=e.pop(),requireAPI("ASPhone").makePhoneCall(e).then(()=>{t.invoke(Result.success())},e=>{console.error("[AdvancedAPI] start makePhoneCall fail"),t.invoke(Result.fail([e,-1]))})}function request(...e){var t=e.pop(),e=e.pop(),o=requireAPI("ASRequest"),o=(console.debug("[AdvancedAPI] request"),o.request(e));if(!e||e.success||e.fail||e.complete)return e||t.invoke(Result.fail(["illegal params",-1])),o;t.invoke(Result.success(o))}function uploadFile(...e){var t=e.pop(),e=e.pop(),o=requireAPI("ASRequest"),o=(console.debug("[AdvancedAPI] uploadFile"),o.uploadFile(e));if(!e||e.success||e.fail||e.complete)return e||t.invoke(Result.fail(["illegal params",-1])),o;t.invoke(Result.success(o))}function downloadFile(...e){var t=e.pop(),e=e.pop(),o=requireAPI("ASRequest"),o=(console.debug("[AdvancedAPI] downloadFile"),o.downloadFile(e));if(!e||e.success||e.fail||e.complete)return e||t.invoke(Result.fail(["illegal params",-1])),o;t.invoke(Result.success(o))}function openBluetoothAdapter(...e){let t=e.pop();requireAPI("ASBluetooth").openBluetoothAdapter().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function closeBluetoothAdapter(...e){let t=e.pop();requireAPI("ASBluetooth").closeBluetoothAdapter().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function startBluetoothDevicesDiscovery(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").startBluetoothDevicesDiscovery(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function stopBluetoothDevicesDiscovery(...e){let t=e.pop();requireAPI("ASBluetooth").stopBluetoothDevicesDiscovery().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function onBluetoothDeviceFound(...e){e=e.pop(),requireAPI("ASBluetooth").onBluetoothDeviceFound(e)}function offBluetoothDeviceFound(...e){e=e.pop(),requireAPI("ASBluetooth").offBluetoothDeviceFound(e)}function onBluetoothAdapterStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").onBluetoothAdapterStateChange(e)}function offBluetoothAdapterStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").offBluetoothAdapterStateChange(e)}function getBluetoothDevices(...e){let t=e.pop();requireAPI("ASBluetooth").getBluetoothDevices().then(e=>{e=e&&e[0]&&e[0][0]||{},t.invoke(Result.success(e))},e=>{console.info("[AdvancedAPI] getBluetoothDevices fail"+JSON.stringify(e)),t.invoke(Result.fail(...e))})}function getConnectedBluetoothDevices(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").getConnectedBluetoothDevices(e).then(e=>{console.info("[AdvancedAPI] getConnectedBluetoothDevices success"+JSON.stringify(e)),t.invoke(Result.success(e))},e=>{console.info("[AdvancedAPI] getConnectedBluetoothDevices fail"+JSON.stringify(e)),t.invoke(Result.fail(...e))})}function getBluetoothAdapterState(...e){let t=e.pop();requireAPI("ASBluetooth").getBluetoothAdapterState().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function setBLEMTU(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asSetBLEMTU(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function writeBLECharacteristicValue(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asWriteBLECharacteristicValue(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function readBLECharacteristicValue(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asReadBLECharacteristicValue(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function onBLEConnectionStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOnBLEConnectionStateChange(e)}function offBLEConnectionStateChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOffBLEConnectionStateChange(e)}function onBLECharacteristicValueChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOnBLECharacteristicValueChange(e)}function offBLECharacteristicValueChange(...e){e=e.pop(),requireAPI("ASBluetooth").asOffBLECharacteristicValueChange(e)}function notifyBLECharacteristicValueChange(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asNotifyBLECharacteristicValueChange(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function getBLEDeviceServices(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asGetBLEDeviceServices(e).then(e=>{t.invoke(Result.success(e[0][0]))},e=>{t.invoke(Result.fail(...e))})}function getBLEDeviceRSSI(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asGetBLEDeviceRSSI(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function getBLEDeviceCharacteristics(...e){console.debug("[AdvancedAPI] enter getBLEDeviceCharacteristics");let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asGetBLEDeviceCharacteristics(e).then(e=>{t.invoke(Result.success(e[0]))},e=>{t.invoke(Result.fail(...e))})}function createBLEConnection(...e){let t=e.pop();var{deviceId:e,timeout:o}=e.pop()||{};requireAPI("ASBluetooth").asCreateBLEConnection({deviceId:e,timeout:o}).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function closeBLEConnection(...e){let t=e.pop();e=e.pop(),requireAPI("ASBluetooth").asCloseBLEConnection({deviceId:e?e.deviceId:void 0}).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(...e))})}function startWifi(...e){let t=e.pop();requireAPI("ASWifi").startWifi().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function stopWifi(...e){let t=e.pop();requireAPI("ASWifi").stopWifi().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getConnectedWifi(...e){let t=e.pop();e=e.pop(),requireAPI("ASWifi").getConnectedWifi(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getWifiList(...e){let t=e.pop();e=e.pop(),requireAPI("ASWifi").getWifiList(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onGetWifiList(...e){e=e.pop(),requireAPI("ASWifi").onGetWifiList(e)}function offGetWifiList(...e){e=e.pop(),requireAPI("ASWifi").offGetWifiList(e)}function connectWifi(...e){let t=e.pop();e=e.pop(),requireAPI("ASWifi").connectWifi(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onWifiConnected(...e){e=e.pop(),requireAPI("ASWifi").onWifiConnected(e)}function offWifiConnected(...e){e=e.pop(),requireAPI("ASWifi").offWifiConnected(e)}function onWifiConnectedWithPartialInfo(...e){e=e.pop(),requireAPI("ASWifi").onWifiConnectedWithPartialInfo(e)}function offWifiConnectedWithPartialInfo(...e){e=e.pop(),requireAPI("ASWifi").offWifiConnectedWithPartialInfo(e)}function startSoterAuthentication(...e){console.debug("[AdvancedAPI] start startSoterAuthentication");let t=e.pop();e=e.pop(),console.debug("[AdvancedAPI] params = %s",JSON.stringify(e)),requireAPI("ASAuthentication").start(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function checkIsSupportSoterAuthentication(...e){console.debug("[AdvancedAPI] start checkIsSupportSoterAuthentication");let t=e.pop();requireAPI("ASAuthentication").getSupportedType().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function checkIsSoterEnrolledInDevice(...e){console.debug("[AdvancedAPI] start checkIsSoterEnrolledInDevice");let t=e.pop();e=e.pop(),console.debug("[AdvancedAPI] params = %s",JSON.stringify(e)),requireAPI("ASAuthentication").isEnrolled(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onAccelerometerChange(...e){console.debug("[AdvancedAPI] start onAccelerometerChange"),e=e.pop(),requireAPI("ASAccelerometer").onAccelerometerChange(e).then(e=>{console.debug("[AdvancedAPI] onAccelerometerChange success")},(e,t)=>{console.debug("[AdvancedAPI] onAccelerometerChange fail errMsg = %o, code = %d",e,t)})}function offAccelerometerChange(...e){console.debug("[AdvancedAPI] start offAccelerometerChange"),e=e.pop(),requireAPI("ASAccelerometer").offAccelerometerChange(e).then(e=>{console.debug("[AdvancedAPI] offAccelerometerChange success")},(e,t)=>{console.debug("[AdvancedAPI] offAccelerometerChange fail errMsg = %o, code = %d",e,t)})}function startAccelerometer(...e){console.debug("[AdvancedAPI] start startAccelerometer");let o=e.pop();requireAPI("ASAccelerometer").startAccelerometer(e[0]).then(e=>{console.debug("[AdvancedAPI] startAccelerometer success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startAccelerometer fail errMsg = %o, code = %d",e,t),o.invoke(Result.fail([e,t]))})}function stopAccelerometer(...e){console.debug("[AdvancedAPI] start stopAccelerometer");let o=e.pop();requireAPI("ASAccelerometer").stopAccelerometer().then(e=>{console.debug("[AdvancedAPI] startAccelerometer success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startAccelerometer fail"),o.invoke(Result.fail([e,t]))})}function onCompassChange(...e){console.debug("[AdvancedAPI] start onCompassChange"),e=e.pop(),requireAPI("ASCompass").onCompassChange(e).then(e=>{console.debug("[AdvancedAPI] onCompassChange success")},(e,t)=>{console.debug("[AdvancedAPI] onCompassChange fail errMsg = %o, code = %d",e,t)})}function offCompassChange(...e){console.debug("[AdvancedAPI] start offCompassChange"),e=e.pop(),requireAPI("ASCompass").offCompassChange(e).then(e=>{console.debug("[AdvancedAPI] offCompassChange success")},(e,t)=>{console.debug("[AdvancedAPI] offCompassChange fail errMsg = %o, code = %d",e,t)})}function startCompass(...e){console.debug("[AdvancedAPI] start startCompass");let o=e.pop();requireAPI("ASCompass").startCompass().then(e=>{console.debug("[AdvancedAPI] startCompass success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startCompass fail"),o.invoke(Result.fail([e,t]))})}function stopCompass(...e){console.debug("[AdvancedAPI] start stopCompass");let o=e.pop();requireAPI("ASCompass").stopCompass().then(e=>{console.debug("[AdvancedAPI] stopCompass success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] stopCompass fail"),o.invoke(Result.fail([e,t]))})}function onGyroscopeChange(...e){console.debug("[AdvancedAPI] start onGyroscopeChange"),e=e.pop(),requireAPI("ASGyroscope").onGyroscopeChange(e).then(e=>{console.debug("[AdvancedAPI] onGyroscopeChange success")},(e,t)=>{console.debug("[AdvancedAPI] onGyroscopeChange fail errMsg = %o, code = %d",e,t)})}function startGyroscope(...e){console.debug("[AdvancedAPI] start startCompass");let o=e.pop();requireAPI("ASGyroscope").startGyroscope(e[0]).then(e=>{console.debug("[AdvancedAPI] startCompass success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] startCompass fail errMsg = %o, code = %d",e,t),o.invoke(Result.fail([e,t]))})}function stopGyroscope(...e){console.debug("[AdvancedAPI] start stopGyroscope");let o=e.pop();requireAPI("ASGyroscope").stopGyroscope().then(e=>{console.debug("[AdvancedAPI] stopGyroscope success"),o.invoke(Result.success(e))},(e,t)=>{console.debug("[AdvancedAPI] stopGyroscope fail errMsg = %o, code = %d",e,t),o.invoke(Result.fail([e,t]))})}function addPhoneContact(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASContact").addPhoneContact(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function vibrate(...e){let t=e.pop();requireAPI("ASVibrator").vibrate().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function vibrateLong(...e){let t=e.pop();requireAPI("ASVibrator").vibrateLong().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function vibrateShort(...e){let t=e.pop();requireAPI("ASVibrator").vibrateShort().then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function onUserCaptureScreen(...e){e=e.pop(),requireAPI("ASCapture").onUserCaptureScreen(e)}function offUserCaptureScreen(...e){e=e.pop(),requireAPI("ASCapture").offUserCaptureScreen(e)}function hideKeyboard(...e){let t=requireAPI("ASKeyboard"),o=e.pop();t.hideKeyboard().then(()=>{console.debug("[AdvancedAPI] hideKeyboard success"),o.invoke(Result.success())},(e,t)=>{console.debug("[AdvancedAPI] hideKeyboard fail, code: %d, error: %s",t,e),o.invoke(Result.fail())})}function onKeyboardHeightChange(...e){e=e.pop(),requireAPI("ASKeyboard").onKeyboardHeightChange(e)}function offKeyboardHeightChange(...e){e=e.pop(),requireAPI("ASKeyboard").offKeyboardHeightChange(e)}function login(...e){let t=e.pop();var e=e.pop(),o=requireAPI("ASAccount");console.debug("[AdvancedAPI] ASAccount login"),o.login(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getUserInfo(...e){let t=e.pop();var e=e.pop(),o=requireAPI("ASAccount");console.debug("[AdvancedAPI] ASAccount getUserInfo"),o.getUserInfo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function chooseImage(...e){console.debug("[AdvancedAPI] start chooseImage");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.chooseImage(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getImageInfo(...e){console.debug("[AdvancedAPI] start getImageInfo");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.getImageInfo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function saveImageToPhotosAlbum(...e){console.debug("[AdvancedAPI] start saveImageToPhotosAlbum");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.saveImageToPhotosAlbum(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function compressImage(...e){console.debug("[AdvancedAPI] start compressImage");let t=e.pop();var o=requireAPI("ASImage"),e=e[0];o.compressImage(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function setScreenBrightness(...e){let t=e.pop();e=e.pop(),requireAPI("ASBrightness").setScreenBrightness(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getScreenBrightness(...e){let t=e.pop();requireAPI("ASBrightness").getScreenBrightness().then(e=>{console.info("[AdvancedAPI] getScreenBrightness raw = "+e[0].value),e=e[0].value/255,console.info("[AdvancedAPI] getScreenBrightness = "+e),t.invoke(Result.success({value:e}))},e=>{t.invoke(Result.fail(e))})}function setKeepScreenOn(...e){let t=e.pop();e=e.pop(),requireAPI("ASBrightness").asSetKeepScreenOn(e).then(()=>{t.invoke(Result.success())},()=>{t.invoke(Result.fail())})}function saveFile(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").saveFile(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getSavedFileList(...e){let t=e.pop();requireAPI("ASFile").getSavedFileList().then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getSavedFileInfo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").getSavedFileInfo(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function removeSavedFile(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").removeSavedFile(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getFileInfo(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").getFileInfo(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function openDocument(...e){let t=e.pop();e=e.pop()||{},requireAPI("ASFile").openDocument(e).then(e=>{t.invoke(Result.success(e))}).catch(e=>{t.invoke(Result.fail(e))})}function getFileSystemManager(){return requireAPI("ASFile").getFileSystemManager()}function createInnerAudioContext(){return console.debug("[AdvancedAPI] start createInnerAudioContext"),requireAPI("ASAudio").createInnerAudioContext()}function saveVideoToPhotosAlbum(...e){console.debug("[AdvancedAPI] start saveVideoToPhotosAlbum");let t=e.pop();var o=requireAPI("ASVideo"),e=e[0];o.saveVideoToPhotosAlbum(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function getVideoInfo(...e){console.debug("[AdvancedAPI] start getVideoInfo");let t=e.pop();var o=requireAPI("ASVideo"),e=e[0];o.getVideoInfo(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}function scanCode(...e){console.debug("[AdvancedAPI] start scanCode");let t=e.pop();e=e[0],requireAPI("ASScan").scanCode(e).then(e=>{t.invoke(Result.success(e))},e=>{t.invoke(Result.fail(e))})}let asInterfaceList={getSystemInfoSync:{method:getSystemInfoSync,needPromise:!1,needCallback:!1},getDeviceInfo:{method:getDeviceInfo,needPromise:!1},getWindowInfo:{method:getWindowInfo,needPromise:!1},getAppBaseInfo:{method:getAppBaseInfo,needPromise:!1},getAppAuthorizeSetting:{method:getAppAuthorizeSetting,needPromise:!1},getSystemSetting:{method:getSystemSetting,needPromise:!1},openAppAuthorizeSetting:{method:openAppAuthorizeSetting},getLocation:{method:getLocation},onLocationChange:{method:onLocationChange},offLocationChange:{method:offLocationChange,needPromise:!1},startLocationUpdate:{method:startLocationUpdate},startLocationUpdateBackground:{method:startLocationUpdateBackground},stopLocationUpdate:{method:stopLocationUpdate},onLocationChangeError:{method:onLocationChangeError},offLocationChangeError:{method:offLocationChangeError},makePhoneCall:{method:makePhoneCall},request:{method:request},uploadFile:{method:uploadFile},downloadFile:{method:downloadFile},navigateTo:{method:navigateTo},redirectTo:{method:redirectTo},navigateBack:{method:navigateBack},openBluetoothAdapter:{method:openBluetoothAdapter},startBluetoothDevicesDiscovery:{method:startBluetoothDevicesDiscovery},onBluetoothDeviceFound:{method:onBluetoothDeviceFound,needPromise:!1,needCallback:!1},offBluetoothDeviceFound:{method:offBluetoothDeviceFound,needPromise:!1,needCallback:!1},stopBluetoothDevicesDiscovery:{method:stopBluetoothDevicesDiscovery},onBluetoothAdapterStateChange:{method:onBluetoothAdapterStateChange,needPromise:!1,needCallback:!1},offBluetoothAdapterStateChange:{method:offBluetoothAdapterStateChange,needPromise:!1,needCallback:!1},getConnectedBluetoothDevices:{method:getConnectedBluetoothDevices},getBluetoothAdapterState:{method:getBluetoothAdapterState},closeBluetoothAdapter:{method:closeBluetoothAdapter},getBluetoothDevices:{method:getBluetoothDevices},setBLEMTU:{method:setBLEMTU},writeBLECharacteristicValue:{method:writeBLECharacteristicValue},readBLECharacteristicValue:{method:readBLECharacteristicValue},onBLEConnectionStateChange:{method:onBLEConnectionStateChange,needPromise:!1,needCallback:!1},offBLEConnectionStateChange:{method:offBLEConnectionStateChange,needPromise:!1,needCallback:!1},onBLECharacteristicValueChange:{method:onBLECharacteristicValueChange,needPromise:!1,needCallback:!1},offBLECharacteristicValueChange:{method:offBLECharacteristicValueChange,needPromise:!1,needCallback:!1},notifyBLECharacteristicValueChange:{method:notifyBLECharacteristicValueChange},getBLEDeviceServices:{method:getBLEDeviceServices},getBLEDeviceRSSI:{method:getBLEDeviceRSSI},getBLEDeviceCharacteristics:{method:getBLEDeviceCharacteristics},createBLEConnection:{method:createBLEConnection},closeBLEConnection:{method:closeBLEConnection},onAccelerometerChange:{method:onAccelerometerChange,needPromise:!1,needCallback:!1},offAccelerometerChange:{method:offAccelerometerChange,needPromise:!1,needCallback:!1},startAccelerometer:{method:startAccelerometer},stopAccelerometer:{method:stopAccelerometer},onCompassChange:{method:onCompassChange,needPromise:!1,needCallback:!1},offCompassChange:{method:offCompassChange,needPromise:!1,needCallback:!1},startCompass:{method:startCompass},stopCompass:{method:stopCompass},onGyroscopeChange:{method:onGyroscopeChange,needPromise:!1,needCallback:!1},startGyroscope:{method:startGyroscope},stopGyroscope:{method:stopGyroscope},startWifi:{method:startWifi},stopWifi:{method:stopWifi},getConnectedWifi:{method:getConnectedWifi},getWifiList:{method:getWifiList},onGetWifiList:{method:onGetWifiList,needPromise:!1,needCallback:!1},offGetWifiList:{method:offGetWifiList,needPromise:!1,needCallback:!1},connectWifi:{method:connectWifi},onWifiConnected:{method:onWifiConnected,needPromise:!1,needCallback:!1},offWifiConnected:{method:offWifiConnected,needPromise:!1,needCallback:!1},onWifiConnectedWithPartialInfo:{method:onWifiConnectedWithPartialInfo,needPromise:!1,needCallback:!1},offWifiConnectedWithPartialInfo:{method:offWifiConnectedWithPartialInfo,needPromise:!1,needCallback:!1},startSoterAuthentication:{method:startSoterAuthentication},checkIsSupportSoterAuthentication:{method:checkIsSupportSoterAuthentication},checkIsSoterEnrolledInDevice:{method:checkIsSoterEnrolledInDevice},addPhoneContact:{method:addPhoneContact},vibrate:{method:vibrate},vibrateLong:{method:vibrateLong},vibrateShort:{method:vibrateShort},onUserCaptureScreen:{method:onUserCaptureScreen,needPromise:!1,needCallback:!1},offUserCaptureScreen:{method:offUserCaptureScreen,needPromise:!1,needCallback:!1},hideKeyboard:{method:hideKeyboard},onKeyboardHeightChange:{method:onKeyboardHeightChange,needPromise:!1,needCallback:!1},offKeyboardHeightChange:{method:offKeyboardHeightChange,needPromise:!1,needCallback:!1},login:{method:login},getUserInfo:{method:getUserInfo},chooseImage:{method:chooseImage},getImageInfo:{method:getImageInfo},saveImageToPhotosAlbum:{method:saveImageToPhotosAlbum},compressImage:{method:compressImage},setScreenBrightness:{method:setScreenBrightness},getScreenBrightness:{method:getScreenBrightness},setKeepScreenOn:{method:setKeepScreenOn},saveFile:{method:saveFile},getSavedFileList:{method:getSavedFileList},getSavedFileInfo:{method:getSavedFileInfo},removeSavedFile:{method:removeSavedFile},getFileInfo:{method:getFileInfo},openDocument:{method:openDocument},getFileSystemManager:{method:getFileSystemManager,needPromise:!1,needCallback:!1},createInnerAudioContext:{method:createInnerAudioContext,needPromise:!1,needCallback:!1},saveVideoToPhotosAlbum:{method:saveVideoToPhotosAlbum},getVideoInfo:{method:getVideoInfo},scanCode:{method:scanCode}};function invokeModule(e,...t){console.debug("[AdvancedAPI] invokeModule moduleName = %s",e);var o=t.pop();if("number"==typeof o){let e=jsCallbackMap.get(o);e||(e=new JSCallback({id:o}),jsCallbackMap.set(o,e)),t.push(e)}else t.push(o);return o=asInterfaceList[e],triggerInterceptInvoke(e,t),triggerInterceptReturnValue(e,o=o.method.apply(null,t)),o}function triggerInterceptInvoke(e,t){var o=requireAPI("ASInterceptor");!1!==asInterfaceList[e].needCallback&&((t=[...t]).pop(),o.invoke(e,t))}function triggerInterceptReturnValue(e,t){requireAPI("ASInterceptor").returnValue(e,t)}function createAs(){let e={};return Object.keys(asInterfaceList).forEach(o=>{Object.defineProperty(e,o,{get:()=>(...e)=>{e=(t=interceptCallback(e,o,asInterfaceList[o].needPromise,asInterfaceList[o].needCallback)).args||[];var t=t.promise,e=invokeModule(o,...e);return t?t.promise:e}})}),e}let as=createAs(),AdvancedApi={init:function(e,t){var o;globalThis.as&&globalThis.requireAPI||(console.debug("[AdvancedAPI] init"),globalThis.as=as,globalThis.requireAPI=requireAPI$1,globalThis.isStageModel=!0,globalThis.abilityContext=e,media.createAVRecorder().then(e=>{globalThis.commonAvRecorder=e}),o=bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO|bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION,globalThis.bundleInfoForSelf=bundleManager.getBundleInfoForSelfSync(o),globalThis.lastWindow=t,initContextOnStageModel(e))}};export default AdvancedApi;export{as,createAs}; diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/module.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/module.json5 new file mode 100644 index 0000000000..c2a8a16589 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/module.json5 @@ -0,0 +1,14 @@ +{ + "module": { + "name": "advanced_api_hsp", + "type": "shared", + "description": "$string:shared_desc", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "pages": "$profile:main_pages" + } +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/element/string.json b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..98e1d8a84b --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "shared_desc", + "value": "description" + } + ] +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/profile/main_pages.json b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000..1898d94f58 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/Ability.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000..85c78f6757 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,35 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + }) +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/List.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000..794c7dc4ed --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/module.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/module.json5 new file mode 100644 index 0000000000..cf29dc042c --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/ohosTest/module.json5 @@ -0,0 +1,13 @@ +{ + "module": { + "name": "advanced_api_hsp_test", + "type": "feature", + "deviceTypes": [ + "phone", + "tablet", + "2in1" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/List.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/List.test.ets new file mode 100644 index 0000000000..bb5b5c3731 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/LocalUnit.test.ets b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000..165fc1615e --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/advanced_api_hsp/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/build-profile.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/build-profile.json5 new file mode 100644 index 0000000000..2683fb87c1 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/build-profile.json5 @@ -0,0 +1,44 @@ +{ + "app": { + "signingConfigs": [], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compatibleSdkVersion": "5.0.0(12)", + "runtimeOS": "HarmonyOS", + "buildOption": { + "strictMode": { + "caseSensitiveCheck": true + } + } + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "advanced_api_har", + "srcPath": "./advanced_api_har", + }, + { + "name": "advanced_api_hsp", + "srcPath": "./advanced_api_hsp", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/code-linter.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/code-linter.json5 new file mode 100644 index 0000000000..77b31b517a --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/code-linter.json5 @@ -0,0 +1,20 @@ +{ + "files": [ + "**/*.ets" + ], + "ignore": [ + "**/src/ohosTest/**/*", + "**/src/test/**/*", + "**/src/mock/**/*", + "**/node_modules/**/*", + "**/oh_modules/**/*", + "**/build/**/*", + "**/.preview/**/*" + ], + "ruleSet": [ + "plugin:@performance/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + } +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/hvigorfile.ts b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/hvigorfile.ts new file mode 100644 index 0000000000..f3cb9f1a87 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/hvigorfile.ts @@ -0,0 +1,6 @@ +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/oh-package.json5 b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/oh-package.json5 new file mode 100644 index 0000000000..bb12751b97 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/project/advancedApiHsp/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "modelVersion": "5.0.0", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.19", + "@ohos/hamock": "1.0.0" + } +} diff --git a/ohos/AdvancedAPI_OHOS/scripts/build_advancedapi.sh b/ohos/AdvancedAPI_OHOS/scripts/build_advancedapi.sh new file mode 100644 index 0000000000..a70b91a568 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/scripts/build_advancedapi.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# *********************************************************************** +# Copyright: (c) Huawei Technologies Co., Ltd. 2019. All rights reserved. +# script for build +# version: 1.0.0 +# change log: +# *********************************************************************** +set -ex +set -o pipefail + +#先cd到脚本所在路径,再实现其他处理逻辑,否则该脚本执行会依赖脚本执行的路径 +basepath=$(cd `dirname $0`; pwd) +cd $basepath + +cd .. + +if [[ ${JDK_PATH} != "" ]]; then + export JAVA_HOME=${JDK_PATH} + export PATH=${JDK_PATH}/bin:$PATH +fi + +#代码根路径 全局参数 codepath +codepath=${WORKSPACE}"/FastAPPCenter" + + +#----安装打包需要的依赖 +cd $codepath +npm install + +# 设置编译环境 +npm run build:advanced + +zip_file=${pkg_name} + +cd $codepath/project/advancedApiHsp/advanced_api_hsp/src/main/ets/ +mkdir utils + +cd $codepath/project/advancedApiHsp/advanced_api_har/src/main/ +mkdir ets +cd ets +mkdir utils +cd .. +mkdir resources + +cp $codepath/dist/advancedapi.min.js $codepath/project/advancedApiHsp/advanced_api_hsp/src/main/ets/utils/ + +cp $codepath/dist/advancedapi.min.js $codepath/project/advancedApiHsp/advanced_api_har/src/main/ets/utils/ + +cd $codepath + +mkdir hwsdk + +cp -R ${hwsdk}/hmscore ./hwsdk/ +cp -R ${hwsdk}/licenses ./hwsdk/ +cp -R ${hwsdk}/openharmony ./hwsdk/ + +cd ./hwsdk/hmscore/4.0.0/toolchains/modulecheck + +sed -i 's/atomicService/shared/g' app.json + +cd $codepath/project/advancedApiHsp + +ohpm install + +echo -e "{\r\n \"dependencies\":{\r\n \"@ohos/hvigor\":\"2.3.0-s\",\r\n \"@ohos/hvigor-ohos-plugin\":\"2.3.0-s\"\r\n}\r\n}" > package.json + +npm install + +echo "hwsdk.dir="$codepath/hwsdk > local.properties + +node ./node_modules/@ohos/hvigor/bin/hvigor.js --mode project -p product=default assembleApp --parallel --incremental --daemon + +node ./node_modules/@ohos/hvigor/bin/hvigor.js --mode module -p product=default assembleHar --parallel --incremental --daemon + +cd $codepath +mkdir zipPath +cd zipPath +mkdir hsp +mkdir har +cp $codepath/project/advancedApiHsp/advanced_api_har/build/default/outputs/default/advanced_api_har.har $codepath/zipPath/har/ +cp $codepath/project/advancedApiHsp/advanced_api_hsp/build/default/outputs/default/advanced_api_hsp.har $codepath/zipPath/hsp/ +cp $codepath/project/advancedApiHsp/advanced_api_hsp/build/default/outputs/default/advanced_api_hsp-default-signed.hsp $codepath/zipPath/hsp/ + +# 插件工程打包 +rm $codepath/project/AdvancedTemplete/entry/src/main/ets/har/advanced_api_har.har +cp $codepath/project/advancedApiHsp/advanced_api_har/build/default/outputs/default/advanced_api_har.har $codepath/project/AdvancedTemplete/entry/src/main/ets/har +mkdir $codepath/project/UniappToAtomicService/project +cp -r $codepath/project/AdvancedTemplete $codepath/project/UniappToAtomicService/project +cd $codepath/project/UniappToAtomicService +zip -r $codepath/zipPath/UniappToAtomicService ./ + +cd $codepath/zipPath +zip -r ${zip_file} ./ + +bash ${WORKSPACE}/Script/clouddragon/build2.0/service/getPackageInfo.sh "FastAPPCenter/zipPath" "${zip_file}" + +if [[ $releaseVersion == "" ]];then + echo "This build is snapshot" + echo buildVersion="snapshot_${ENV_PIPELINE_STARTTIME}" >> ${WORKSPACE}/buildInfo.properties +else + echo "This build is release" + echo buildVersion="release_${ENV_PIPELINE_STARTTIME}" >> ${WORKSPACE}/buildInfo.properties +fi \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/scripts/build_assemble.sh b/ohos/AdvancedAPI_OHOS/scripts/build_assemble.sh new file mode 100644 index 0000000000..3898edf0f6 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/scripts/build_assemble.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# *********************************************************************** +# Copyright: (c) Huawei Technologies Co., Ltd. 2019. All rights reserved. +# script for build +# version: 1.0.0 +# change log: +# *********************************************************************** +set -ex +set -o pipefail + +# ============================================================================= +#进入脚本路径 +basepath=$(cd `dirname $0`; pwd) +cd ${basepath} +echo ${basepath} + +# ============================================================================= +# "执行qafapi.js编译脚本" +bash build_qafapi.sh + +# ============================================================================= +# "执行libNative.so编译脚本" +bash build_cpp.sh + +# ============================================================================= +# 流水线build2.0编译后打包 + +cd ${basepath} + +# 新建打包目录 +rm -rf ${WORKSPACE}/package_assemble +mkdir -p ${WORKSPACE}/package_assemble +pkg_path=${WORKSPACE}/package_assemble + +# 获取qafapi.min.js放到新建打包目录 +cp ${WORKSPACE}/${codeRootDir}/dist/qafapi.min.js ${pkg_path} +cp -r ${WORKSPACE}/${codeRootDir}/dist/bridge ${pkg_path} + +# 获取libNativeAPI.so放到新建打包目录 +cp ${WORKSPACE}/${codeRootDir}/thirdparty/libs/ohos/${OHOS_ARCH}/libNativeAPI.so ${pkg_path} + +# 压缩在根目录创建的输出包文件夹并放置在当前脚本目录以qafapi.zip命名 +zip -r ${basepath}/qafapi.zip ${pkg_path} + +echo "查看待打包目录" +cd ${pkg_path} +ls + +echo "查看已经打包目录" +cd ${basepath} +ls + +# ============================================================================= +# 发布包 +bash ${WORKSPACE}/Script/clouddragon/build2.0/service/getPackageInfo.sh "${codeRootDir}" "qafapi.zip" \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/scripts/build_codecheck.sh b/ohos/AdvancedAPI_OHOS/scripts/build_codecheck.sh new file mode 100644 index 0000000000..c8cbb6c704 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/scripts/build_codecheck.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +#进入到业务编译脚本的执行路径下 +cd ../../../scripts +chmod +x *.sh +#方式1:执行业务编译脚本(该脚本只执行C/++的编译操作,不进行打包处理包等业务逻辑) +sh build_cpp.sh diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/account/account.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/account/account.js new file mode 100644 index 0000000000..4584ce59e1 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/account/account.js @@ -0,0 +1,33 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced as account api + * Create: 04/13/2023 + * Notes: N/A + */ +import Result from '../../../base/util/Result' + +export function login(...args) { + const callback = args.pop() + const obj = args.pop() + const account = requireAPI('ASAccount') + console.debug('[AdvancedAPI] ASAccount login') + + account.login(obj).then(data => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function getUserInfo(...args) { + const callback = args.pop() + const obj = args.pop() + const account = requireAPI('ASAccount') + console.debug('[AdvancedAPI] ASAccount getUserInfo') + + account.getUserInfo(obj).then(data => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/base/arrayBuffer2Base64.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/base/arrayBuffer2Base64.js new file mode 100644 index 0000000000..bca12f01ab --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/base/arrayBuffer2Base64.js @@ -0,0 +1,4 @@ +export function arrayBufferToBase64 (buf) { + const buffer = requireAPI('ASBuffer') + return buffer.arrayBufferToBase64(buf) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/bluetooth/bluetooth.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/bluetooth/bluetooth.js new file mode 100644 index 0000000000..2ffe2fad83 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/bluetooth/bluetooth.js @@ -0,0 +1,227 @@ +import Result from '../../../base/util/Result' + +export function openBluetoothAdapter(...args) { + const callback = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.openBluetoothAdapter().then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function closeBluetoothAdapter(...args) { + const callback = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.closeBluetoothAdapter().then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function startBluetoothDevicesDiscovery(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.startBluetoothDevicesDiscovery(params).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function stopBluetoothDevicesDiscovery(...args) { + const callback = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.stopBluetoothDevicesDiscovery().then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function onBluetoothDeviceFound(...args) { + const cb = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.onBluetoothDeviceFound(cb) +} + +export function offBluetoothDeviceFound(...args) { + const cb = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.offBluetoothDeviceFound(cb) +} + +export function onBluetoothAdapterStateChange(...args) { + const cb = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.onBluetoothAdapterStateChange(cb) +} + +export function offBluetoothAdapterStateChange(...args) { + const cb = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.offBluetoothAdapterStateChange(cb) +} + +export function getBluetoothDevices(...args) { + const callback = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.getBluetoothDevices().then(data => { + const devices = (data && data[0] && data[0][0]) || {} + callback.invoke(Result.success(devices)) + }, (data) => { + console.info('[AdvancedAPI] getBluetoothDevices fail' + JSON.stringify(data)) + callback.invoke(Result.fail(...data)) + }) +} + +export function getConnectedBluetoothDevices(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.getConnectedBluetoothDevices(params).then(data => { + console.info('[AdvancedAPI] getConnectedBluetoothDevices success' + JSON.stringify(data)) + callback.invoke(Result.success(data)) + }, (data) => { + console.info('[AdvancedAPI] getConnectedBluetoothDevices fail' + JSON.stringify(data)) + callback.invoke(Result.fail(...data)) + }) +} + +export function getBluetoothAdapterState(...args) { + const callback = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.getBluetoothAdapterState().then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function setBLEMTU(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asSetBLEMTU(params).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function writeBLECharacteristicValue(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asWriteBLECharacteristicValue(params).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function readBLECharacteristicValue(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asReadBLECharacteristicValue(params).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function onBLEConnectionStateChange(...args) { + const callback = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asOnBLEConnectionStateChange(callback) +} + +export function offBLEConnectionStateChange(...args) { + const cb = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asOffBLEConnectionStateChange(cb) +} + +export function onBLECharacteristicValueChange(...args) { + const callback = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asOnBLECharacteristicValueChange(callback) +} + +export function offBLECharacteristicValueChange(...args) { + const cb = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asOffBLECharacteristicValueChange(cb) +} + +export function notifyBLECharacteristicValueChange(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asNotifyBLECharacteristicValueChange(params).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function getBLEDeviceServices(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asGetBLEDeviceServices(params).then(data => { + callback.invoke(Result.success(data[0][0])) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +// TODO:异常参数处理 +export function getBLEDeviceRSSI(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asGetBLEDeviceRSSI(params).then((data) => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function getBLEDeviceCharacteristics(...args) { + console.debug('[AdvancedAPI] enter getBLEDeviceCharacteristics') + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asGetBLEDeviceCharacteristics(params).then(data => { + callback.invoke(Result.success(data[0])) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function createBLEConnection(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + const { deviceId, timeout } = params || {} + bluetooth.asCreateBLEConnection({ deviceId, timeout }).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} + +export function closeBLEConnection(...args) { + const callback = args.pop() + const params = args.pop() + const bluetooth = requireAPI('ASBluetooth') + bluetooth.asCloseBLEConnection({ deviceId: params ? params.deviceId : undefined }).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(...data)) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/accelerometer.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/accelerometer.js new file mode 100644 index 0000000000..da3aab38e3 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/accelerometer.js @@ -0,0 +1,62 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: Advanced API accelerometer + * Author: 00430169 + * Create: 23/3/2023 + * Notes: N/A + */ + +import Result from '../../../base/util/Result' + +export function onAccelerometerChange (...args) { + console.debug('[AdvancedAPI] start onAccelerometerChange') + const callback = args.pop() + const accelerometer = requireAPI('ASAccelerometer') + + accelerometer.onAccelerometerChange(callback).then(data => { + console.debug('[AdvancedAPI] onAccelerometerChange success') + }, (data, code) => { + console.debug('[AdvancedAPI] onAccelerometerChange fail errMsg = %o, code = %d', data, code) + }) +} + +export function offAccelerometerChange (...args) { + console.debug('[AdvancedAPI] start offAccelerometerChange') + const callback = args.pop() + const accelerometer = requireAPI('ASAccelerometer') + + accelerometer.offAccelerometerChange(callback).then(data => { + console.debug('[AdvancedAPI] offAccelerometerChange success') + }, (data, code) => { + console.debug('[AdvancedAPI] offAccelerometerChange fail errMsg = %o, code = %d', data, code) + }) +} + +export function startAccelerometer (...args) { + console.debug('[AdvancedAPI] start startAccelerometer') + const callback = args.pop() + const accelerometer = requireAPI('ASAccelerometer') + + accelerometer.startAccelerometer(args[0]).then(data => { + console.debug('[AdvancedAPI] startAccelerometer success') + callback.invoke(Result.success(data)) + }, (data, code) => { + console.debug('[AdvancedAPI] startAccelerometer fail errMsg = %o, code = %d', data, code) + callback.invoke(Result.fail([data, code])) + }) +} + +export function stopAccelerometer (...args) { + console.debug('[AdvancedAPI] start stopAccelerometer') + const callback = args.pop() + const accelerometer = requireAPI('ASAccelerometer') + + accelerometer.stopAccelerometer().then(data => { + console.debug('[AdvancedAPI] startAccelerometer success') + callback.invoke(Result.success(data)) + }, (data, code) => { + console.debug('[AdvancedAPI] startAccelerometer fail') + callback.invoke(Result.fail([data, code])) + }) +} + diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/authenication.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/authenication.js new file mode 100644 index 0000000000..5d75fc6201 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/authenication.js @@ -0,0 +1,38 @@ +import Result from '../../../base/util/Result' + +export function startSoterAuthentication (...args) { + console.debug('[AdvancedAPI] start startSoterAuthentication') + const callback = args.pop() + const params = args.pop() + console.debug('[AdvancedAPI] params = %s', JSON.stringify(params)) + const auth = requireAPI('ASAuthentication') + auth.start(params).then(res => { + callback.invoke(Result.success(res)) + }, err => { + callback.invoke(Result.fail(err)) + }) +} + +export function checkIsSupportSoterAuthentication (...args) { + console.debug('[AdvancedAPI] start checkIsSupportSoterAuthentication') + const callback = args.pop() + const auth = requireAPI('ASAuthentication') + auth.getSupportedType().then(res => { + callback.invoke(Result.success(res)) + }, err => { + callback.invoke(Result.fail(err)) + }) +} + +export function checkIsSoterEnrolledInDevice (...args) { + console.debug('[AdvancedAPI] start checkIsSoterEnrolledInDevice') + const callback = args.pop() + const params = args.pop() + console.debug('[AdvancedAPI] params = %s', JSON.stringify(params)) + const auth = requireAPI('ASAuthentication') + auth.isEnrolled(params).then(res => { + callback.invoke(Result.success(res)) + }, err => { + callback.invoke(Result.fail(err)) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/brightness.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/brightness.js new file mode 100644 index 0000000000..0903585e9b --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/brightness.js @@ -0,0 +1,42 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced as capture screen event api + * Create: 04/12/2023 + * Notes: N/A + */ +import Result from '../../../base/util/Result' + +export function setScreenBrightness(...args) { + const callback = args.pop() + const params = args.pop() + const brightness = requireAPI('ASBrightness') + brightness.setScreenBrightness(params).then(data => { + callback.invoke(Result.success(data)) + }, (data) => { + callback.invoke(Result.fail(data)) + }) +} + +export function getScreenBrightness(...args) { + const callback = args.pop() + const brightness = requireAPI('ASBrightness') + brightness.getScreenBrightness().then(data => { + console.info(`[AdvancedAPI] getScreenBrightness raw = ${data[0].value}`) + const brightValue = data[0].value / 255 + console.info(`[AdvancedAPI] getScreenBrightness = ${brightValue}`) + callback.invoke(Result.success({ value: brightValue })) + }, (data) => { + callback.invoke(Result.fail(data)) + }) +} + +export function setKeepScreenOn(...args) { + const callback = args.pop() + const params = args.pop() + const brightness = requireAPI('ASBrightness') + brightness.asSetKeepScreenOn(params).then(() => { + callback.invoke(Result.success()) + }, () => { + callback.invoke(Result.fail()) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/capture.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/capture.js new file mode 100644 index 0000000000..30cae9195f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/capture.js @@ -0,0 +1,21 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced as capture screen event api + * Create: 04/10/2023 + * Notes: N/A + */ +import Result from '../../../base/util/Result' + +export function onUserCaptureScreen(...args) { + const callback = args.pop() + const capture = requireAPI('ASCapture') + + capture.onUserCaptureScreen(callback) +} + +export function offUserCaptureScreen(...args) { + const callback = args.pop() + const capture = requireAPI('ASCapture') + + capture.offUserCaptureScreen(callback) +} \ No newline at end of file diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/compass.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/compass.js new file mode 100644 index 0000000000..83c0c5f002 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/compass.js @@ -0,0 +1,62 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: Advanced API compass + * Author: 00430169 + * Create: 23/3/2023 + * Notes: N/A + */ + +import Result from '../../../base/util/Result' + +export function onCompassChange (...args) { + console.debug('[AdvancedAPI] start onCompassChange') + const callback = args.pop() + const compass = requireAPI('ASCompass') + + compass.onCompassChange(callback).then(data => { + console.debug('[AdvancedAPI] onCompassChange success') + }, (data, code) => { + console.debug('[AdvancedAPI] onCompassChange fail errMsg = %o, code = %d', data, code) + }) +} + +export function offCompassChange (...args) { + console.debug('[AdvancedAPI] start offCompassChange') + const callback = args.pop() + const compass = requireAPI('ASCompass') + + compass.offCompassChange(callback).then(data => { + console.debug('[AdvancedAPI] offCompassChange success') + }, (data, code) => { + console.debug('[AdvancedAPI] offCompassChange fail errMsg = %o, code = %d', data, code) + }) +} + +export function startCompass (...args) { + console.debug('[AdvancedAPI] start startCompass') + const callback = args.pop() + const compass = requireAPI('ASCompass') + + compass.startCompass().then(data => { + console.debug('[AdvancedAPI] startCompass success') + callback.invoke(Result.success(data)) + }, (data, code) => { + console.debug('[AdvancedAPI] startCompass fail') + callback.invoke(Result.fail([data, code])) + }) +} + +export function stopCompass (...args) { + console.debug('[AdvancedAPI] start stopCompass') + const callback = args.pop() + const compass = requireAPI('ASCompass') + + compass.stopCompass().then(data => { + console.debug('[AdvancedAPI] stopCompass success') + callback.invoke(Result.success(data)) + }, (data, code) => { + console.debug('[AdvancedAPI] stopCompass fail') + callback.invoke(Result.fail([data, code])) + }) +} + diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/contact.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/contact.js new file mode 100644 index 0000000000..c456598b1f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/contact.js @@ -0,0 +1,12 @@ +import Result from '../../../base/util/Result' + +export function addPhoneContact (...args) { + const callback = args.pop() + const params = args.pop() || {} + const contact = requireAPI('ASContact') + contact.addPhoneContact(params).then(data => { + callback.invoke(Result.success(data)) + }, (errData) => { + callback.invoke(Result.fail(errData)) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/gyroscope.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/gyroscope.js new file mode 100644 index 0000000000..5506f61a08 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/gyroscope.js @@ -0,0 +1,50 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: Advanced API Gyroscope + * Author: 00430169 + * Create: 23/3/2023 + * Notes: N/A + */ + +import Result from '../../../base/util/Result' + +export function onGyroscopeChange (...args) { + console.debug('[AdvancedAPI] start onGyroscopeChange') + const callback = args.pop() + const gyroscope = requireAPI('ASGyroscope') + + gyroscope.onGyroscopeChange(callback).then(data => { + console.debug('[AdvancedAPI] onGyroscopeChange success') + }, (data, code) => { + console.debug('[AdvancedAPI] onGyroscopeChange fail errMsg = %o, code = %d', data, code) + }) +} + +export function startGyroscope (...args) { + console.debug('[AdvancedAPI] start startCompass') + const callback = args.pop() + const gyroscope = requireAPI('ASGyroscope') + + gyroscope.startGyroscope(args[0]).then(data => { + console.debug('[AdvancedAPI] startCompass success') + callback.invoke(Result.success(data)) + }, (data, code) => { + console.debug('[AdvancedAPI] startCompass fail errMsg = %o, code = %d', data, code) + callback.invoke(Result.fail([data, code])) + }) +} + +export function stopGyroscope (...args) { + console.debug('[AdvancedAPI] start stopGyroscope') + const callback = args.pop() + const gyroscope = requireAPI('ASGyroscope') + + gyroscope.stopGyroscope().then(data => { + console.debug('[AdvancedAPI] stopGyroscope success') + callback.invoke(Result.success(data)) + }, (data, code) => { + console.debug('[AdvancedAPI] stopGyroscope fail errMsg = %o, code = %d', data, code) + callback.invoke(Result.fail([data, code])) + }) +} + diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/system.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/system.js new file mode 100644 index 0000000000..8c55ee2420 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/system.js @@ -0,0 +1,57 @@ +import Result from '../../../base/util/Result' + +export function getSystemInfoSync(...args) { + console.debug('[AdvancedAPI] start getSystemInfoSync') + const device = requireAPI('ASDevice') + return device.getSystemInfoSync() +} + +export function getDeviceInfo (...args) { + console.debug('[AdvancedAPI] start getDeviceInfo') + args.pop() + const device = requireAPI('ASDevice') + console.debug('[AdvancedAPI] device.getInfo') + const deviceInfo = device.getDeviceInfo() + return deviceInfo +} + +export function getWindowInfo(...args) { + console.debug('[AdvancedAPI] start getWindowInfo') + args.pop() + const device = requireAPI('ASDevice') + return device.getWindowInfo() +} + +export function getAppBaseInfo(...args) { + console.debug('[AdvancedAPI] start getAppBaseInfo') + args.pop() + const device = requireAPI('ASDevice') + return device.getAppBaseInfo() +} +export function getAppAuthorizeSetting(...args) { + console.debug('[AdvancedAPI] start getAppAuthorizeSetting') + args.pop() + const device = requireAPI('ASDevice') + return device.getAppAuthorizeSetting() +} + +export function getSystemSetting(...args) { + console.debug('[AdvancedAPI] start getSystemSetting') + args.pop() + const device = requireAPI('ASDevice') + console.debug('[AdvancedAPI] device.getSystemSetting') + const systemSetting = device.getSystemSetting() + return systemSetting +} + +export function openAppAuthorizeSetting(...args) { + console.debug('[AdvancedAPI] start getSystemSetting') + const callback = args.pop() + const device = requireAPI('ASDevice') + try { + device.openAppAuthorizeSetting() + callback.invoke(Result.success('success')) + } catch (err) { + callback.invoke(Result.fail(['fail'], 201)) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/vibrate.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/vibrate.js new file mode 100644 index 0000000000..364d31538f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/vibrate.js @@ -0,0 +1,31 @@ +import Result from '../../../base/util/Result' + +export function vibrate (...args) { + const callback = args.pop() + const vibrator = requireAPI('ASVibrator') + vibrator.vibrate().then((data) => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function vibrateLong (...args) { + const callback = args.pop() + const vibrator = requireAPI('ASVibrator') + vibrator.vibrateLong().then((data) => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function vibrateShort (...args) { + const callback = args.pop() + const vibrator = requireAPI('ASVibrator') + vibrator.vibrateShort().then((data) => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/wifi.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/wifi.js new file mode 100644 index 0000000000..ef60f2eb2d --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/device/wifi.js @@ -0,0 +1,90 @@ +import Result from '../../../base/util/Result' + +export function startWifi (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.startWifi().then(data => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function stopWifi (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.stopWifi().then(data => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function getConnectedWifi (...args) { + const callback = args.pop() + const params = args.pop() + const wifi = requireAPI('ASWifi') + wifi.getConnectedWifi(params).then(data => { + callback.invoke(Result.success(data)) // data的类型是json对象或者是undefined + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function getWifiList (...args) { + const callback = args.pop() + const params = args.pop() + const wifi = requireAPI('ASWifi') + wifi.getWifiList(params).then(data => { + callback.invoke(Result.success(data)) + }, err => { + callback.invoke(Result.fail(err)) + }) +} + +export function onGetWifiList (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.onGetWifiList(callback) +} + +export function offGetWifiList (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.offGetWifiList(callback) +} + +export function connectWifi (...args) { + const callback = args.pop() + const params = args.pop() + const wifi = requireAPI('ASWifi') + wifi.connectWifi(params).then(data => { + callback.invoke(Result.success(data)) + }, err => { + callback.invoke(Result.fail(err)) + }) +} + +export function onWifiConnected (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.onWifiConnected(callback) +} + +export function offWifiConnected (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.offWifiConnected(callback) +} + +export function onWifiConnectedWithPartialInfo (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.onWifiConnectedWithPartialInfo(callback) +} + +export function offWifiConnectedWithPartialInfo (...args) { + const callback = args.pop() + const wifi = requireAPI('ASWifi') + wifi.offWifiConnectedWithPartialInfo(callback) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/file/file.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/file/file.js new file mode 100644 index 0000000000..3065fa456b --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/file/file.js @@ -0,0 +1,71 @@ +import Result from '../../../base/util/Result' + +export function saveFile (...args) { + const callback = args.pop() + const params = args.pop() || {} + const file = requireAPI('ASFile') + file.saveFile(params).then(data => { + callback.invoke(Result.success(data)) + }).catch(err => { + callback.invoke(Result.fail(err)) + }) +} + +export function getSavedFileList (...args) { + const callback = args.pop() + const file = requireAPI('ASFile') + file.getSavedFileList().then(data => { + callback.invoke(Result.success(data)) + }).catch(err => { + callback.invoke(Result.fail(err)) + }) +} + +export function getSavedFileInfo (...args) { + const callback = args.pop() + const params = args.pop() || {} + const file = requireAPI('ASFile') + file.getSavedFileInfo(params).then(data => { + callback.invoke(Result.success(data)) + }).catch(err => { + callback.invoke(Result.fail(err)) + }) +} + +export function removeSavedFile (...args) { + const callback = args.pop() + const params = args.pop() || {} + const file = requireAPI('ASFile') + file.removeSavedFile(params).then(data => { + callback.invoke(Result.success(data)) + }).catch(err => { + callback.invoke(Result.fail(err)) + }) +} + +export function getFileInfo (...args) { + const callback = args.pop() + const params = args.pop() || {} + const file = requireAPI('ASFile') + file.getFileInfo(params).then(data => { + callback.invoke(Result.success(data)) + }).catch(err => { + callback.invoke(Result.fail(err)) + }) +} + +export function openDocument (...args) { + const callback = args.pop() + const params = args.pop() || {} + const file = requireAPI('ASFile') + file.openDocument(params).then(data => { + callback.invoke(Result.success(data)) + }).catch(err => { + callback.invoke(Result.fail(err)) + }) +} + +export function getFileSystemManager (...args) { + const file = requireAPI('ASFile') + return file.getFileSystemManager() +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/keyboard/keyboard.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/keyboard/keyboard.js new file mode 100644 index 0000000000..7b1996b190 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/keyboard/keyboard.js @@ -0,0 +1,33 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced as keyboard api + * Create: 04/10/2023 + * Notes: N/A + */ +import Result from '../../../base/util/Result' + +export function hideKeyboard(...args) { + const keyboard = requireAPI('ASKeyboard') + const callback = args.pop() + keyboard.hideKeyboard().then(() => { + console.debug('[AdvancedAPI] hideKeyboard success') + callback.invoke(Result.success()) + }, (err, code) => { + console.debug('[AdvancedAPI] hideKeyboard fail, code: %d, error: %s', code, err) + callback.invoke(Result.fail()) + }) +} + +export function onKeyboardHeightChange(...args) { + const callback = args.pop() + const keyboard = requireAPI('ASKeyboard') + + keyboard.onKeyboardHeightChange(callback) +} + +export function offKeyboardHeightChange(...args) { + const callback = args.pop() + const keyboard = requireAPI('ASKeyboard') + + keyboard.offKeyboardHeightChange(callback) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/location/location.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/location/location.js new file mode 100644 index 0000000000..df2b13f4b1 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/location/location.js @@ -0,0 +1,87 @@ +import Result from '../../../base/util/Result' + +export function getLocation (...args) { + console.debug('[AdvancedAPI] start getLocation') + const callback = args.pop() + const params = args.pop() + const geolocation = requireAPI('ASLocation') + console.debug('[AdvancedAPI] geolocation.getLocation') + geolocation.getLocation(params).then(data => { + console.debug('[AdvancedAPI] geolocation.getLocation success') + callback.invoke(Result.success(data)) + }, (err, code) => { + console.debug('[AdvancedAPI] geolocation.getLocation fail') + callback.invoke(Result.fail(err)) + }) +} +export function onLocationChange(...args) { + console.debug('[AdvancedAPI] start onLocationChange') + const callback = args.pop() + const geolocation = requireAPI('ASLocation') + geolocation.onLocationChange(callback) +} + +export function offLocationChange(...args) { + console.debug('[AdvancedAPI] start offLocationChange') + const callback = args.pop() + const geolocation = requireAPI('ASLocation') + geolocation.offLocationChange(callback) + geolocation.getLocation({ timeout: 5000, coordType: 'wgs86' }).then(data => { + console.debug('[AdvancedAPI] geolocation.offLocationChange callback') + callback.invokeAndKeepAlive(Result.success(data)) + }, err => { + callback.invokeAndKeepAlive(Result.fail([err[0][0], err[0][1]])) + }) +} +export function onLocationChangeError(...args) { + console.debug('[AdvancedAPI] start onLocationChangeError') + const callback = args.pop() + const geolocation = requireAPI('ASLocation') + geolocation.onLocationChangeError(data => { + console.debug('[AdvancedAPI] geolocation.onLocationChange success') + callback.invokeAndKeepAlive(Result.callback(data)) + }) +} +export function offLocationChangeError(...args) { + console.debug('[AdvancedAPI] start offLocationChangeError') + const callback = args.pop() + const geolocation = requireAPI('ASLocation') + geolocation.offLocationChangeError() + callback.invoke(Result.success()) +} +export function startLocationUpdate(...args) { + console.debug('[AdvancedAPI] start startLocationUpdate') + const callback = args.pop() + const geolocation = requireAPI('ASLocation') + geolocation.startLocationUpdate().then(data => { + console.debug('[AdvancedAPI] geolocation.startLocationUpdate success') + callback.invoke(Result.success(data)) + }, (err, code) => { + console.debug('[AdvancedAPI] geolocation.startLocationUpdate fail') + callback.invoke(Result.fail([err[0][0], err[0][1]])) + }) +} +export function startLocationUpdateBackground(...args) { + console.debug('[AdvancedAPI] start startLocationUpdateBackground') + const callback = args.pop() + const geolocation = requireAPI('ASLocation') + geolocation.startLocationUpdateBackground().then(data => { + console.debug('[AdvancedAPI] geolocation.startLocationUpdateBackground success') + callback.invoke(Result.success(data)) + }, (err, code) => { + console.debug('[AdvancedAPI] geolocation.startLocationUpdateBackground fail') + callback.invoke(Result.fail([err[0][0], err[0][1]])) + }) +} +export function stopLocationUpdate(...args) { + console.debug('[AdvancedAPI] start stopLocationUpdate') + const callback = args.pop() + const geolocation = requireAPI('ASLocation') + geolocation.stopLocationUpdate(callback).then(data => { + console.debug('[AdvancedAPI] geolocation.stopLocationUpdate success') + callback.invoke(Result.success(data)) + }, (err, code) => { + console.debug('[AdvancedAPI] geolocation.stopLocationUpdate fail') + callback.invoke(Result.fail([err[0][0], err[0][1]])) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/audio.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/audio.js new file mode 100644 index 0000000000..55c4be173e --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/audio.js @@ -0,0 +1,5 @@ +export function createInnerAudioContext() { + console.debug('[AdvancedAPI] start createInnerAudioContext') + const audio = requireAPI('ASAudio') + return audio.createInnerAudioContext() +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/image.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/image.js new file mode 100644 index 0000000000..21c1e0e6b8 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/image.js @@ -0,0 +1,59 @@ +import Result from '../../../base/util/Result' + +export function chooseImage (...args) { + console.debug('[AdvancedAPI] start chooseImage') + const callback = args.pop() + const image = requireAPI('ASImage') + const params = args[0] + image.chooseImage(params).then( + res => { + callback.invoke(Result.success(res)) + }, + err => { + callback.invoke(Result.fail(err)) + } + ) +} + +export function getImageInfo(...args) { + console.debug('[AdvancedAPI] start getImageInfo') + const callback = args.pop() + const image = requireAPI('ASImage') + const params = args[0] + image.getImageInfo(params).then( + res => { + callback.invoke(Result.success(res)) + }, + err => { + callback.invoke(Result.fail(err)) + } + ) +} +export function saveImageToPhotosAlbum(...args) { + console.debug('[AdvancedAPI] start saveImageToPhotosAlbum') + const callback = args.pop() + const image = requireAPI('ASImage') + const params = args[0] + image.saveImageToPhotosAlbum(params).then( + res => { + callback.invoke(Result.success(res)) + }, + err => { + callback.invoke(Result.fail(err)) + } + ) +} +export function compressImage(...args) { + console.debug('[AdvancedAPI] start compressImage') + const callback = args.pop() + const image = requireAPI('ASImage') + const params = args[0] + image.compressImage(params).then( + res => { + callback.invoke(Result.success(res)) + }, + err => { + callback.invoke(Result.fail(err)) + } + ) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/video.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/video.js new file mode 100644 index 0000000000..12b84b9431 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/media/video.js @@ -0,0 +1,31 @@ +import Result from '../../../base/util/Result' + +export function saveVideoToPhotosAlbum(...args) { + console.debug('[AdvancedAPI] start saveVideoToPhotosAlbum') + const callback = args.pop() + const video = requireAPI('ASVideo') + const params = args[0] + video.saveVideoToPhotosAlbum(params).then( + res => { + callback.invoke(Result.success(res)) + }, + err => { + callback.invoke(Result.fail(err)) + } + ) +} + +export function getVideoInfo(...args) { + console.debug('[AdvancedAPI] start getVideoInfo') + const callback = args.pop() + const video = requireAPI('ASVideo') + const params = args[0] + video.getVideoInfo(params).then( + res => { + callback.invoke(Result.success(res)) + }, + err => { + callback.invoke(Result.fail(err)) + } + ) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/request/request.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/request/request.js new file mode 100644 index 0000000000..36eba74348 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/request/request.js @@ -0,0 +1,61 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced as request api + * Create: 04/01/2023 + * Notes: N/A + */ +import Result from '../../../base/util/Result' + +export function request(...args) { + const callback = args.pop() + const obj = args.pop() + const http = requireAPI('ASRequest') + console.debug('[AdvancedAPI] request') + + const task = http.request(obj) + // if success / fail / complete, return requestTask otherwise return Promise + if (obj && !obj.success && !obj.fail && !obj.complete) { + callback.invoke(Result.success(task)) + return + } + if (!obj) { + callback.invoke(Result.fail(['illegal params', -1])) + } + return task +} + +export function uploadFile(...args) { + const callback = args.pop() + const obj = args.pop() + const http = requireAPI('ASRequest') + console.debug('[AdvancedAPI] uploadFile') + + const task = http.uploadFile(obj) + // if success / fail / complete, return uploadTask otherwise return Promise + if (obj && !obj.success && !obj.fail && !obj.complete) { + callback.invoke(Result.success(task)) + return + } + if (!obj) { + callback.invoke(Result.fail(['illegal params', -1])) + } + return task +} + +export function downloadFile(...args) { + const callback = args.pop() + const obj = args.pop() + const http = requireAPI('ASRequest') + console.debug('[AdvancedAPI] downloadFile') + + const task = http.downloadFile(obj) + // if success / fail / complete, return downloadTask otherwise return Promise + if (obj && !obj.success && !obj.fail && !obj.complete) { + callback.invoke(Result.success(task)) + return + } + if (!obj) { + callback.invoke(Result.fail(['illegal params', -1])) + } + return task +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/router/navigate.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/router/navigate.js new file mode 100644 index 0000000000..fc0e05743d --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/router/navigate.js @@ -0,0 +1,34 @@ +import Result from '../../../base/util/Result' + +export function navigateTo (...args) { + const callback = args.pop() + const params = args.pop() || {} + const router = requireAPI('ASRouter') + router.navigateTo(params).then(data => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function redirectTo (...args) { + const callback = args.pop() + const params = args.pop() || {} + const router = requireAPI('ASRouter') + router.redirectTo(params).then(data => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} + +export function navigateBack (...args) { + const callback = args.pop() + const params = args.pop() || {} + const router = requireAPI('ASRouter') + router.navigateBack(params).then(data => { + callback.invoke(Result.success(data)) + }, (err) => { + callback.invoke(Result.fail(err)) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/scan/scan.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/scan/scan.js new file mode 100644 index 0000000000..577bb0aec0 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/scan/scan.js @@ -0,0 +1,15 @@ +import Result from '../../../base/util/Result' +export function scanCode (...args) { + console.debug('[AdvancedAPI] start scanCode') + const callback = args.pop() + const params = args[0] + const scan = requireAPI('ASScan') + scan.scanCode(params).then( + res => { + callback.invoke(Result.success(res)) + }, + err => { + callback.invoke(Result.fail(err)) + } + ) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/as/telephony/telephony.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/telephony/telephony.js new file mode 100644 index 0000000000..8b43a2af25 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/as/telephony/telephony.js @@ -0,0 +1,12 @@ +import Result from '../../../base/util/Result' +export function makePhoneCall (...args) { + const callback = args.pop() + const number = args.pop() + const phone = requireAPI('ASPhone') + phone.makePhoneCall(number).then(() => { + callback.invoke(Result.success()) + }, (err) => { + console.error(`[AdvancedAPI] start makePhoneCall fail`) + callback.invoke(Result.fail([err, -1])) + }) +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/JSCallback.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/JSCallback.js new file mode 100644 index 0000000000..1362bae96b --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/JSCallback.js @@ -0,0 +1,31 @@ +import callbackManager from './index' + +export default class JSCallback { + constructor (options) { + this.id = options.id + this._valid = true + } + + invoke (data) { + if (this._valid) { + callbackManager.consume(this.id, data, data.ifKeepAlive) + } else { + console.error(`[AdvancedAPI] callback ${this.id} had be destroyed.`) + } + } + + invokeAndKeepAlive (data) { + if (this._valid) { + callbackManager.consume(this.id, data, true) + } else { + console.error(`[AdvancedAPI] callback ${this.id} had be destroyed.`) + } + } + + destroy () { + this.id = undefined + this._valid = false + } +} + +export const jsCallbackMap = new Map() diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/callback-intercept.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/callback-intercept.js new file mode 100644 index 0000000000..266586bae5 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/callback-intercept.js @@ -0,0 +1,153 @@ +import callbackManager from './index' + +// promise化 +export function interceptCallback (args, moduleName, needPromise = true, needCallback = true) { + if (!needPromise + && (args.length === 0 || !needCallback)) { + return { args } + } + + const first = args[0] + const callbacks = {} + let hasProperty = false + + if ( + typeof first === 'object' + && Object.prototype.toString.call(first).toLowerCase() === '[object object]' + && args.length === 1 + ) { + for (const key in first) { + const value = first[key] + if (typeof value === 'function') { + callbacks[key] = value + } else { + hasProperty = true + } + } + } else { + hasProperty = true + } + + // 参数是一个方法 + if (typeof first === 'function') { + needPromise = false + if (!first.isConnected) { + const cb = msg => { + first.apply(null, msg.arguments) + } + cb.originFn = first + first.cb = cb + args[0] = cb + } else if (first.cb) { + args[0] = first.cb.id + } + } + + let promise + const cbLength = Object.keys(callbacks).length + if (needPromise) { + if (cbLength <= 0) { + class PromiseRef { + constructor () { + this.promise = new Promise((resolve, reject) => { + this.reject = reject + this.resolve = resolve + }) + } + } + promise = new PromiseRef() + } + } + if (cbLength > 0 || promise) { + const cb = msg => { + let f = callbacks[msg.method] + advancedResult(moduleName, msg) + const methodArgs = triggerMethodIntercept(moduleName, msg.method, msg.arguments) || msg.arguments + if (f !== undefined) { + f.apply(null, methodArgs) + } + const { ignoreComplete = false } = msg + if (!ignoreComplete) { + const completeArgs = triggerMethodIntercept(moduleName, 'complete', msg.arguments) || msg.arguments + f = callbacks['complete'] + if (f !== undefined) { + f.apply(null, completeArgs) + } + } + if (promise) { + const cbArgs = msg.arguments + const data = cbArgs && cbArgs.length > 0 ? cbArgs[0] : undefined + if (msg.method === 'success' || msg.method === 'callback') { + promise.resolve(data) + } else { + promise.reject(data) + } + } + } + + cb.__onlyPromise = cbLength <= 0 + + if (hasProperty) { + args.push(cb) + } else { + args = [cb] + } + } + + if (first && !first.isConnected || promise) { + args = args.map(arg => { + return normalize(arg) + }) + } + if (first && first.cb) { + first.isConnected = true + } + + return { args, promise, needPromise } +} + +function normalize (v) { + if (typeof v === 'function') { + const id = callbackManager.add(v) + v.id = id + return id + } + return v +} + +/** + * 封装接口的返回对象 + * @return {object} { errMsg, errCode, ... } + */ +function advancedResult (moduleName, msg) { + if (msg.method === 'success') { + if (!msg.arguments[0] || typeof msg.arguments[0] !== 'object') { + msg.arguments[0] = {} + } + const data = msg.arguments[0] + if (data.errMsg === undefined) { + data.errMsg = `${moduleName}:ok` + } + if (data.errCode === undefined) { + data.errCode = 0 + } + } else if (msg.method === 'fail') { + const originArgs = msg.arguments || [] + msg.arguments = [{ + moduleName: `${moduleName}`, + errMsg: `${moduleName}:fail:${originArgs.shift()}`, + errCode: originArgs.shift(), + grantStatus: originArgs.shift(), + dialogShownResults: originArgs.shift() + }] + } +} + +function triggerMethodIntercept (moduleName, method, args) { + const interceptor = requireAPI('ASInterceptor') + const intercepterMethod = interceptor[method] + if (typeof intercepterMethod === 'function') { + const methodArgs = intercepterMethod.call(interceptor, moduleName, args) + return methodArgs + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/index.js new file mode 100644 index 0000000000..31a1c0ebd7 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/callback/index.js @@ -0,0 +1,33 @@ +class CallbackManager { + constructor (cb) { + this.lastCallbackId = 0 + this.callbacks = [] + } + + add (callback) { + this.lastCallbackId++ + this.callbacks[this.lastCallbackId] = callback + callback.__callbackId = this.lastCallbackId + return this.lastCallbackId + } + + consume (callbackId, data, ifKeepAlive) { + const callback = this.callbacks[callbackId] + if (typeof ifKeepAlive === 'undefined' || ifKeepAlive === false) { + this.callbacks[callbackId] = undefined + } else { + callback.isKeepAlive = true + } + if (typeof callback === 'function') { + return callback(data) + } + return new Error(`invalid callback id "${callbackId}"`) + } + + close () { + this.callbacks = this.callbacks.map(cb => undefined) + } +} + +const callbackManager = new CallbackManager() +export default callbackManager diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/index.js new file mode 100644 index 0000000000..daebc67b9f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/index.js @@ -0,0 +1,30 @@ +import { initContextOnStageModel } from '../base/bridge/abilityBase' +import { requireAPI } from './module/index' +import as, { createAs } from './module/interface' +import media from '@ohos.multimedia.media' +import bundleManager from '@ohos.bundle.bundleManager' + +const AdvancedApi = { + init: function (context, windowClass) { + if (globalThis.as && globalThis.requireAPI) { + return + } + console.debug('[AdvancedAPI] init') + globalThis.as = as + globalThis.requireAPI = requireAPI + globalThis.isStageModel = true + globalThis.abilityContext = context + media.createAVRecorder().then( + (recorder) => { + globalThis.commonAvRecorder = recorder + } + ) + const flags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION + globalThis.bundleInfoForSelf = bundleManager.getBundleInfoForSelfSync(flags) + globalThis.lastWindow = windowClass + initContextOnStageModel(context) + } +} + +export default AdvancedApi +export { as, createAs } diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAccelerometer/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAccelerometer/index.js new file mode 100644 index 0000000000..850e0aeca7 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAccelerometer/index.js @@ -0,0 +1,99 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: Advanced API Storage + * Author: 00430169 + * Create: 6/4/2023 + * Notes: N/A + */ + +import { OhosSensorBase } from '../../../base/bridge/sensorBase' +import { ErrorCode } from '../../../base/util/ErrorCode' + +const intervalType = [ + { label: 'game', value: 20000000 }, + { label: 'ui', value: 60000000 }, + { label: 'normal', value: 200000000 } +] + +export default class ASAccelerometer { + constructor () { + this.callBackSet = new Set() + this.defaultInterval = 'normal' + } + + onAccelerometerChange (callback) { + return new Promise((resolve, reject) => { + if (typeof callback !== 'function') { + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + return + } + if (this.callBackSet.has(callback)) { + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + } else { + this.callBackSet.add(callback) + const value = intervalType.find(i => i.label === this.defaultInterval).value + OhosSensorBase.ohosSubscribeAccelerometer({ interval: value, callback: (data) => { + const res = { + x: data.x, + y: data.y, + z: data.z + } + for (const cb of this.callBackSet.keys()) { + cb(res) + } + } }) + resolve() + } + }) + } + + offAccelerometerChange (callback) { + return new Promise((resolve, reject) => { + if (typeof callback !== 'function') { + this.callBackSet.clear() + OhosSensorBase.ohosUnsubscribeAccelerometer() + resolve() + return + } + if (!this.callBackSet.has(callback)) { + reject('param is invalid.', ErrorCode.COMMON_ERROR) + } else { + this.callBackSet.delete(callback) + if (this.callBackSet.size === 0) { + OhosSensorBase.ohosUnsubscribeAccelerometer() + } + resolve() + } + }) + } + + startAccelerometer (object) { + return new Promise((resolve, reject) => { + let value = intervalType.find(i => i.label === this.defaultInterval).value + if (object.interval && (typeof object.interval === 'string')) { + const target = intervalType.find(i => i.label === object.interval) + if (target) { + value = target.value + } + } + OhosSensorBase.ohosSubscribeAccelerometer({ interval: value, callback: (data) => { + const res = { + x: data.x, + y: data.y, + z: data.z + } + for (const cb of this.callBackSet.keys()) { + cb(res) + } + } }) + resolve() + }) + } + + stopAccelerometer () { + return new Promise((resolve, reject) => { + OhosSensorBase.ohosUnsubscribeAccelerometer() + resolve() + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAudio/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAudio/index.js new file mode 100644 index 0000000000..ab00704ce9 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAudio/index.js @@ -0,0 +1,552 @@ +import media from '@ohos.multimedia.media' +import audio from '@ohos.multimedia.audio' +import fs from '@ohos.file.fs' +import { MediaLibraryBase } from '../../../base/bridge/mediaLibraryBase' +import { switchInternalToHapSandBox } from '../../util/index' + +// 音频播放状态 +const StateType = { + // 音频播放空闲 + IDLE: 'idle', + // 设置播放源 + INITIALIZED: 'initialized', + // 准备播放 + PREPARED: 'prepared', + // 音频正在播放 + PLAYING: 'playing', + // 音频暂停播放 + PAUSED: 'paused', + // 音频播放完成 + COMPLETED: 'completed', + // 音频停止播放 + STOPPED: 'stopped', + // 音频释放 + RELEASED: 'released', + // 错误状态 + ERROR: 'error', +} + +export default class ASAudio { + createInnerAudioContext() { + return new InnerAudioContext() + } +} + +class InnerAudioContext { + count = 0 + stopFlag = false + + constructor() { + this.tempSrc = '' + this.startTimeS = 0 + this.autoplayS = false + this.playbackRateS = 1 + this.bufferedS = 0 + this.volumeS = 1 + this.tempLoop = false + this.onCanplayCallback = null + this.onPlayCallback = null + this.onPauseCallback = null + this.onStopCallback = null + this.onEndedCallback = null + this.onTimeUpdateCallback = null + this.onErrorCallback = null + this.onWaitingCallback = null + this.onSeekedCallback = null + this.onSeekingCallback = null + this.init() + } + + async init() { + this.avPlayer = await media.createAVPlayer() + + // seek操作结果回调函数 + this.avPlayer.on('seekDone', (seekDoneTime) => { + console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`) + if (this.onSeekedCallback) { + this.onSeekedCallback({}) + } + }) + + // error回调监听函数,当avPlayer在操作过程中出现错误时调用reset接口触发重置流程 + this.avPlayer.on('error', (err) => { + console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`) + this.avPlayer.reset() // 调用reset重置资源,触发idle状态 + if (this.onErrorCallback) { + this.onErrorCallback(err) + } + }) + // 状态机变化回调函数 + this.avPlayer.on('stateChange', async (state, reason) => { + switch (state) { + case 'idle': // 成功调用reset接口后触发该状态机上报 + console.info('AVPlayer state idle called.') + if (this.stopFlag) { + this.avPlayer.url = this.tempSrc + this.stopFlag = false + } + break + case 'initialized': // avplayer 设置播放源后触发该状态上报 + console.info('AVPlayerstate initialized called.') + this.avPlayer.prepare().then(() => { + console.info('AVPlayer prepare succeeded.') + if (this.onCanplayCallback) { + this.onCanplayCallback({}) + } + }, (err) => { + console.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`) + }) + break + case 'prepared': // prepare调用成功后上报该状态机 + console.info('AVPlayer state prepared called.') + if (this.count === 0 && this.autoplayS) { + this.avPlayer.play() + if (this.onPlayCallback) { + this.onPlayCallback({}) + } + if (this.startTimeS) { + if (this.onSeekingCallback) { + this.onSeekingCallback({}) + } + this.avPlayer.seek(this.startTimeS) + } + } + this.count++ + + // 处理属性 + this.avPlayer.loop = this.tempLoop + this.avPlayer.setVolume(this.volumeS) + this.avPlayer.setSpeed(this.playbackRateS) + break + case 'playing': // play成功调用后触发该状态机上报 + console.info('AVPlayer state playing called.') + + // 处理属性 + this.avPlayer.loop = this.tempLoop + this.avPlayer.setVolume(this.volumeS) + this.avPlayer.setSpeed(this.playbackRateS) + break + case 'paused': // pause成功调用后触发该状态机上报 + console.info('AVPlayer state paused called.') + + // 处理属性 + this.avPlayer.loop = this.tempLoop + this.avPlayer.setVolume(this.volumeS) + this.avPlayer.setSpeed(this.playbackRateS) + break + case 'completed': // 播放结束后触发该状态机上报 + console.info('AVPlayer state completed called.') + if (this.onEndedCallback) { + this.onEndedCallback({}) + } + + // 处理属性 + this.avPlayer.loop = this.tempLoop + this.avPlayer.setVolume(this.volumeS) + this.avPlayer.setSpeed(this.playbackRateS) + break + case 'stopped': // stop接口成功调用后触发该状态机上报 + console.info('AVPlayer state stopped called.') + this.avPlayer.reset() // 调用reset接口初始化avplayer状态 + this.stopFlag = true + break + case 'released': + console.info('AVPlayer state released called.') + break + default: + console.info('AVPlayer state unknown called.') + break + } + }) + + this.avPlayer.on('timeUpdate', res => { + if (this.onTimeUpdateCallback) { + this.onTimeUpdateCallback(res / 1000) + } + }) + + this.avPlayer.on('bufferingUpdate', (infoType, value) => { + console.info(`[AdvancedAPI] avPlayer bufferingUpdate ${infoType} ${value}`) + if (infoType === 3 && value !== 0) { + this.bufferedS = value + // 为缓存百分比 + if ((this.avPlayer.currentTime / 1000) >= (this.avPlayer.duration * value / 100000) && this.onWaitingCallback) { + this.onWaitingCallback({}) + } + } + }) + + this.avPlayer.on('audioInterrupt', (InterruptEvent) => { + console.info('[AdvancedAPI] audioInterrupt:' + JSON.stringify(InterruptEvent)) + if (InterruptEvent.hintType === audio.InterruptHint.INTERRUPT_HINT_PAUSE) { + this.avPlayer.pause() + if (this.onPauseCallback) { + this.onPauseCallback({}) + } + } + }) + + this.avPlayer.on('endOfStream', () => { + console.info('[AdvancedAPI] rePlay:endOfStream success') + if (this.avPlayer.loop) { + this.avPlayer.play() + if (this.startTimeS) { + if (this.onSeekingCallback) { + this.onSeekingCallback({}) + } + this.avPlayer.seek(this.startTimeS) + } + } + }) + } + + get duration() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, get duration fail`) + return 0 + } + return this.avPlayer.duration / 1000 + } + + get currentTime() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, get currentTime fail`) + return 0 + } + return this.avPlayer.currentTime / 1000 + } + + get paused() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, get paused fail`) + return true + } + return this.avPlayer.state === StateType.PAUSED + } + + get loop() { + return this.tempLoop + } + + set loop(value) { + if (typeof (value) !== 'boolean') { + console.error(`[AdvancedAPI] loop: ${value} is invalid`) + return + } + this.tempLoop = value + + if (this.avPlayer && [StateType.PREPARED, StateType.PLAYING, StateType.PAUSED, StateType.COMPLETED].includes(this.avPlayer.state)) { + console.info('current state is ' + this.avPlayer.state + ' can set loop') + this.avPlayer.loop = value + } + } + + get volume() { + return this.volumeS + } + + set volume(value) { + if (typeof (value) !== 'number') { + console.error(`[AdvancedAPI] volume: ${value} is invalid`) + return + } + this.volumeS = value + if (this.avPlayer && [StateType.PREPARED, StateType.PLAYING, StateType.PAUSED, StateType.COMPLETED].includes(this.avPlayer.state)) { + console.info('current state is ' + this.avPlayer.state + ' can set volume') + this.avPlayer.setVolume(value) + } + } + + get autoplay() { + return this.autoplayS + } + + set autoplay(flag) { + if (typeof (flag) !== 'boolean') { + console.error(`[AdvancedAPI] autoplay: ${flag} is invalid`) + return + } + this.autoplayS = flag + } + + get startTime() { + return this.startTimeS / 1000 + } + + set startTime(time) { + if (typeof (time) !== 'number') { + console.error(`[AdvancedAPI] startTIme: ${time} is invalid`) + return + } + this.startTimeS = time * 1000 + } + + get src() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, get src fail`) + return '' + } + return this.avPlayer.url + } + + set src(value) { + if (typeof (value) !== 'string') { + console.error(`[AdvancedAPI] src: ${value} is invalid`) + return + } + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, set src fail`) + return + } + if (!value || !(value.startsWith('http:') || value.startsWith('https:') + || value.startsWith('datashare:') || value.startsWith('internal://'))) { + console.error(`[AdvancedAPI] src: ${value} is invalid`) + return + } + if (this.avPlayer.state !== StateType.IDLE) { + console.error('current state is ' + this.avPlayer.state + ' can not set url') + return + } + let path + if (value.startsWith('http:') || value.startsWith('https:')) { + path = value + } else if (value.startsWith('internal://')) { + try { + const uri = switchInternalToHapSandBox(value) + const file = fs.openSync(uri, fs.OpenMode.READ_ONLY) + const fd = file.fd + path = `fd://${fd}` + } catch (error) { + console.info(`${JSON.stringify(error)}`) + } + } else if (value.startsWith('datashare:')) { + try { + const media = MediaLibraryBase.getMedia() + const fileKeyObj = MediaLibraryBase.getFileKey() + const audioType = MediaLibraryBase.getMediaType('AUDIO') + const audiosfetchOp = { + selections: fileKeyObj.MEDIA_TYPE + '= ?', + selectionArgs: [audioType.toString()], + uri: value, + } + media.getFileAssets(audiosfetchOp).then(fileResult => { + fileResult.getFirstObject().then(asset => { + MediaLibraryBase.getFd(asset).then(fd => { + path = `fd://${fd}` + if (this.avPlayer.url && path !== this.avPlayer.url) { + this.avPlayer.reset() + } + this.avPlayer.url = path + }) + }) + }) + return + } catch (error) { + console.error(`[AdvancedAPI] src: ${value} is invalid`) + return + } + } + if (this.avPlayer.url && path !== this.avPlayer.url) { + this.avPlayer.reset() + } + this.avPlayer.url = path + this.tempSrc = path + } + + get buffered() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, get buffered fail`) + return 0 + } + return this.avPlayer.duration * this.bufferedS / 100000 + } + + get playbackRate() { + return this.playbackRateS + } + + set playbackRate(value) { + if (typeof (value) !== 'number') { + console.error(`[AdvancedAPI] speed: ${value} is invalid`) + return + } + let rate + if (value <= 0.75) { + rate = media.PlaybackSpeed.SPEED_FORWARD_0_75_X + } else if (value > 0.75 && value <= 1) { + rate = media.PlaybackSpeed.SPEED_FORWARD_1_00_X + } else if (value > 1 && value <= 1.25) { + rate = media.PlaybackSpeed.SPEED_FORWARD_1_25_X + } else if (value > 1.25 && value <= 1.75) { + rate = media.PlaybackSpeed.SPEED_FORWARD_1_75_X + } else { + rate = media.PlaybackSpeed.SPEED_FORWARD_2_00_X + } + this.playbackRateS = rate + if (this.avPlayer && [StateType.PREPARED, StateType.PLAYING, StateType.PAUSED, StateType.COMPLETED].includes(this.avPlayer.state)) { + console.info('current state is ' + this.avPlayer.state + ' can not set playbackRate') + this.avPlayer.setSpeed(rate) + } + } + + play() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, play fail`) + return + } + if (![StateType.PREPARED, StateType.PAUSED, StateType.COMPLETED].includes(this.avPlayer.state)) { + console.error('current state is ' + this.avPlayer.state + ' can not play') + return + } + if (this.tempSrc && this.avPlayer.url === '') { + this.avPlayer.url = this.tempSrc + } + this.avPlayer.play() + if (this.onPlayCallback) { + this.onPlayCallback({}) + } + } + + pause() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, pause fail`) + return + } + const state = this.avPlayer.state + if (StateType.PLAYING !== state) { + console.error('current state is ' + this.avPlayer.state + 'can not pause') + return + } + this.avPlayer.pause() + if (this.onPauseCallback) { + this.onPauseCallback({}) + } + } + + stop() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, stop fail`) + return + } + // prepared/playing/paused/complete + if (![StateType.PREPARED, StateType.PLAYING, StateType.PAUSED, StateType.COMPLETED].includes(this.avPlayer.state)) { + console.error('current state is ' + this.avPlayer.state + ' can not stop') + return + } + this.avPlayer.stop() + if (this.onStopCallback) { + this.onStopCallback({}) + } + } + + seek(position) { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist, seek fail`) + return + } + if (![StateType.PREPARED, StateType.PLAYING, StateType.PAUSED, StateType.COMPLETED].includes(this.avPlayer.state)) { + console.error('current state is ' + this.avPlayer.state + ' can not seek') + return + } + if (this.onSeekingCallback) { + this.onSeekingCallback({}) + } + this.avPlayer.seek(position * 1000) + } + + destroy() { + if (!this.avPlayer) { + console.error(`[AdvancedAPI] avPlayer is not exist`) + return + } + this.avPlayer.release() + } + + onCanplay(callback) { + this.onCanplayCallback = callback + } + + offCanplay() { + this.onCanplayCallback = null + } + + onPlay(callback) { + this.onPlayCallback = callback + } + + offPlay() { + this.onPlayCallback = null + } + + onPause(callback) { + this.onPauseCallback = callback + } + + offPause() { + this.onPauseCallback = null + } + + onStop(callback) { + this.onStopCallback = callback + } + + offStop() { + this.onStopCallback = null + } + + onEnded(callback) { + this.onEndedCallback = callback + } + + offEnded() { + this.onEndedCallback = null + } + + onTimeUpdate(callback) { + this.onTimeUpdateCallback = callback + } + + offTimeUpdate() { + this.onTimeUpdateCallback = null + } + + onError(callback) { + this.onErrorCallback = callback + } + + offError() { + this.onErrorCallback = null + } + + onPrev(callback) { + console.info('ios only') + } + + onNext(callback) { + console.info('ios only') + } + + onWaiting(callback) { + this.onWaitingCallback = callback + } + + offWaiting() { + this.onWaitingCallback = null + } + + onSeeking(callback) { + this.onSeekingCallback = callback + } + + offSeeking() { + this.onSeekingCallback = null + } + + onSeeked(callback) { + this.onSeekedCallback = callback + } + + offSeeked() { + this.onSeekedCallback = null + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAuthentication/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAuthentication/index.js new file mode 100644 index 0000000000..4d43d14cb4 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASAuthentication/index.js @@ -0,0 +1,181 @@ +// eslint-disable-next-line camelcase +import userIAM_userAuth from '@ohos.userIAM.userAuth' +import prompt from '@ohos.prompt' + +const AUTH_RESULT = { + PERMISSION_CHECK_FAIL: 201, /* Permission verification failed. */ + PARAM_ERROR: 401, /* Incorrect parameters. */ + FAIL: 12500001, /* Authentication failed. */ + OPEN_ERROR: 12500002, /* General operation error. */ + USER_CANCEL: 12500003, /* The operation is canceled. */ + TIME_OUT: 12500004, /* The operation is time-out. */ + TYPE_UNSUPPORTED: 12500005, /* The authentication type is not supported. */ + TRUSTED_LEVEL_UNSUPPORTED: 12500006, /* The authentication trust level is not supported. */ + TASK_BUSY: 12500007, /* The authentication task is busy. */ + AUTHENTICATOR_LOCKED: 12500009, /* The authenticator is locked. */ + NOT_ENROLLED: 12500010, /* The type of credential has not been enrolled. */ +} + +function toUint8Arr(str) { + const buffer = [] + for (const i of str) { + const _code = i.charCodeAt(0) + if (_code < 0x80) { + buffer.push(_code) + } else if (_code < 0x800) { + buffer.push(0xc0 + (_code >> 6)) + buffer.push(0x80 + (_code & 0x3f)) + } else if (_code < 0x10000) { + buffer.push(0xe0 + (_code >> 12)) + buffer.push(0x80 + (_code >> 6 & 0x3f)) + buffer.push(0x80 + (_code & 0x3f)) + } + } + return Uint8Array.from(buffer) +} + +export default class ASAuthentication { + start(params) { + return new Promise((resolve, reject) => { + const type = (params && params.requestAuthModes) || '' + // 当前鸿蒙仅支持faceId解锁 + if (type !== 'facial') { + reject({ errCode: 90003, errMsg: 'The authentication type is not supported.' }) + return + } + const challenge = params.challenge + // uni的字符串challenge转换成鸿蒙的数组challenge + const challengeArr = toUint8Arr(challenge) + const authContent = (params && params.authContent) || '' + // 当前仅支持faceId解锁 + const authType = userIAM_userAuth.UserAuthType.FACE + // 认证结果的信任等级 + const authTrustLevel = userIAM_userAuth.AuthTrustLevel.ATL1 + try { + const auth = userIAM_userAuth.getAuthInstance(challengeArr, authType, authTrustLevel) + // 订阅认证结果: userIAM_userAuth.AuthResultInfo + auth.on('result', { + callback: (result) => { + console.debug('[AdvancedAPI] authV9 result ' + result.result) + console.debug('[AdvancedAPI] authV9 token ' + result.token) + console.debug('[AdvancedAPI] authV9 remainAttempts ' + result.remainAttempts) + console.debug('[AdvancedAPI] authV9 lockoutDuration ' + result.lockoutDuration) + if (result.result === AUTH_RESULT.PERMISSION_CHECK_FAIL) { + reject({ errCode: 90002, errMsg: 'Permission verification failed.' }) + } else if (result.result === AUTH_RESULT.PARAM_ERROR) { + reject({ errCode: 90004, errMsg: 'Incorrect parameters.' }) + } else if (result.result === AUTH_RESULT.FAIL) { + reject({ errCode: 90009, errMsg: 'Authentication failed.' }) + } else if (result.result === AUTH_RESULT.OPEN_ERROR) { + reject({ errCode: 90009, errMsg: 'General operation error.' }) + } else if (result.result === AUTH_RESULT.USER_CANCEL) { + reject({ errCode: 90008, errMsg: 'The operation is canceled.' }) + } else if (result.result === AUTH_RESULT.TIME_OUT) { + reject({ errCode: 90007, errMsg: 'The operation is time-out.' }) + } else if (result.result === AUTH_RESULT.TYPE_UNSUPPORTED) { + reject({ errCode: 90003, errMsg: 'The authentication type is not supported.' }) + } else if (result.result === AUTH_RESULT.TRUSTED_LEVEL_UNSUPPORTED) { + reject({ errCode: 90003, errMsg: 'The authentication trust level is not supported.' }) + } else if (result.result === AUTH_RESULT.TASK_BUSY) { + reject({ errCode: 90010, errMsg: 'The authentication task is busy.' }) + } else if (result.result === AUTH_RESULT.AUTHENTICATOR_LOCKED) { + reject({ errCode: 90010, errMsg: 'The authenticator is locked.' }) + } else if (result.result === AUTH_RESULT.NOT_ENROLLED) { + reject({ errCode: 90011, errMsg: 'The type of credential has not been enrolled.' }) + } else { + resolve({ + authMode: 'facial', + resultJSON: '', + resultJSONSignature: '', + errCode: 0, + errMsg: undefined + }) + } + } + }) + auth.on('tip', { + callback: (result) => { + switch (result.tip) { + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_BRIGHT: + prompt.showToast({ message: '光线太强,获取的图像太亮。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_DARK: + prompt.showToast({ message: '光线太暗,获取的图像太暗。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_CLOSE: + prompt.showToast({ message: '人脸距离设备过近。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_FAR: + prompt.showToast({ message: '人脸距离设备过远。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_HIGH: + prompt.showToast({ message: '设备太高,仅获取到人脸上部。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_LOW: + prompt.showToast({ message: '设备太低,仅获取到人脸下部。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_RIGHT: + prompt.showToast({ message: '设备太靠右,仅获取到人脸右部。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_LEFT: + prompt.showToast({ message: '设备太靠左,仅获取到人脸左部。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_MUCH_MOTION: + prompt.showToast({ message: '在图像采集过程中,用户人脸移动太快。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_POOR_GAZE: + prompt.showToast({ message: '没有正视摄像头。' }) + break + + case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_NOT_DETECTED: + prompt.showToast({ message: '没有检测到人脸信息。' }) + break + + default : + console.debug('[AdvancedAPI] %s', JSON.stringify(result)) + } + } + }) + if (authContent) { + console.debug('[AdvancedAPI] showToast authContent = %s', authContent) + prompt.showToast({ + message: authContent + }) + } + auth.start() + console.debug('[AdvancedAPI] authV9 start success') + } catch (error) { + console.debug('[AdvancedAPI] authV9 start error = %s', error) + reject({ errCode: 90007, errMsg: 'General operation fail.' }) + } + }) + } + + getSupportedType() { + console.debug('[AdvancedAPI] start getSupportedType') + return new Promise((resolve) => { + resolve({ supportMode: ['facial'] }) + }) + } + + isEnrolled(params) { + console.debug('[AdvancedAPI] start isEnrolled') + return new Promise((resolve, reject) => { + const checkAuthMode = (params && params.checkAuthMode) || '' + if (checkAuthMode === 'fingerPrint') { + resolve({ isEnrolled: false, errMsg: '' }) + } else if (checkAuthMode === 'facial') { + resolve({ isEnrolled: false, errMsg: 'The type of credential has not been enrolled.' }) + } + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBGAudio/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBGAudio/index.js new file mode 100644 index 0000000000..f392897b75 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBGAudio/index.js @@ -0,0 +1,311 @@ +import avSession from '@ohos.multimedia.avsession' +import wantAgent from '@ohos.app.ability.wantAgent' +import media from '@ohos.multimedia.media' +import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager' +import { isFileUri, getFdFromUriOrSandBoxPath, isSandboxPath } from '../../util/index' +import audio from '@ohos.multimedia.audio' +import { AbilityBase, context } from '../../../base/bridge/abilityBase' + +// 音频播放状态 +const StateType = { + // 音频播放空闲 + IDLE: 'idle', + // 音频正在播放 + PLAYING: 'playing', + // 音频暂停播放 + PAUSED: 'paused', + // 音频停止播放 + STOPPED: 'stopped', + // 错误状态 + ERROR: 'error' +} +function createAVSession(backgroundAudioManager) { + console.debug('[AdvancedAPI] createAVSession begin') + avSession.createAVSession(context, 'player', 'audio').then((data) => { + console.debug('[AdvancedAPI] createAVSession succeed') + backgroundAudioManager.avSession = data + }) +} +function destroyAVSession(backgroundAudioManager) { + console.debug('[AdvancedAPI] destroyAVSession begin') + if (backgroundAudioManager.avSession === null) { + console.debug('[AdvancedAPI] avSession is null') + return + } + backgroundAudioManager.avSession.destroy() +} +function startBackgroundTask() { + AbilityBase.getAbilityInfo().then(abilityInfo => { + const wantAgentInfo = { + wants: [ + { + bundleName: abilityInfo.bundleName, + abilityName: abilityInfo.name + } + ], + operationType: wantAgent.OperationType.START_ABILITY, + requestCode: 0, + wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] + } + // use WantAgent to notify + wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { + return backgroundTaskManager.startBackgroundRunning(context, backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK, wantAgentObj) + }).then(() => { + console.debug('[AdvancedAPI] start bg operation succeeded') + }).catch((err) => { + console.error('[AdvancedAPI] start bg operation failed Cause: ' + err) + }) + }) +} +function stopBackgroundTask() { + backgroundTaskManager.stopBackgroundRunning(context).then(() => { + console.debug('[AdvancedAPI] stop operation succeeded') + }).catch((err) => { + console.error('[AdvancedAPI] stop operation fail cause: ' + JSON.stringify(err)) + }) +} +export default class ASBGAudio { + constructor() { + this.backgroundAudioManager = new BackgroundAudioManager() + } +} +class BackgroundAudioManager { + constructor() { + this.bufferedS = 0 + this.avSession = null + this.startTimeS = 0 + this.onWaitingCallback = null + this.titleS = null + this.epnameS = null + this.singerS = null + this.coverImgUrlS = null + this.webUrlS = null + this.protocolS = 'http' + this.onFinishCallback = null + this.tempSrc = '' + this.onCanplayCallback = null + this.onPlayCallback = null + this.onPauseCallback = null + this.onStopCallback = null + this.onTimeUpdateCallback = null + this.onErrorCallback = null + this.init() + } + init() { + this.audioPlayer = media.createAudioPlayer() + this.audioPlayer.on('finish', () => { + destroyAVSession(this) + stopBackgroundTask() + if (this.onFinishCallback) { + this.onFinishCallback({}) + } + }) + this.audioPlayer.on('dataLoad', () => { + if (this.onCanplayCallback) { + this.onCanplayCallback({}) + } + }) + this.audioPlayer.on('bufferingUpdate', (infoType, value) => { + console.info(`[AdvancedAPI] bgAudio bufferingUpdate ${infoType} ${value}`) + if (infoType === 3 && value !== 0) { + this.bufferedS = value + if ((this.audioPlayer.currentTime / 1000) >= (this.audioPlayer.duration * value / 100000) && this.onWaitingCallback) { + this.onWaitingCallback({}) + } + } + }) + this.audioPlayer.on('audioInterrupt', (InterruptEvent) => { + console.info('[AdvancedAPI] audioInterrupt:' + JSON.stringify(InterruptEvent)) + if (InterruptEvent.hintType === audio.InterruptHint.INTERRUPT_HINT_PAUSE) { + this.audioPlayer.pause() + } + if (InterruptEvent.hintType === audio.InterruptHint.INTERRUPT_HINT_RESUME) { + this.audioPlayer.play() + } + }) + + this.audioPlayer.on('play', () => { + if (this.onPlayCallback) { + this.onPlayCallback({}) + } + }) + + this.audioPlayer.on('pause', () => { + if (this.onPauseCallback) { + this.onPauseCallback({}) + } + }) + + this.audioPlayer.on('timeUpdate', res => { + if (this.onTimeUpdateCallback) { + this.onTimeUpdateCallback(res / 1000) + } + }) + + this.audioPlayer.on('error', (err) => { + if (this.onErrorCallback) { + this.onErrorCallback(err) + } + }) + } + get duration() { + return this.audioPlayer.duration / 1000 + } + get currentTime() { + return this.audioPlayer.currentTime / 1000 + } + get paused() { + return this.audioPlayer.state === StateType.PAUSED + } + get src() { + return this.audioPlayer.src + } + set src(value) { + if (typeof (value) !== 'string') { + console.error(`[AdvancedAPI] src: ${value} is invalid`) + return + } + if (!value || !(value.startsWith('http:') || value.startsWith('https:') + || isFileUri(value) || isSandboxPath(value))) { + console.error(`[AdvancedAPI] src: ${value} is invalid`) + return + } + let path + if (value.startsWith('http:') || value.startsWith('https:')) { + path = value + } else if (isFileUri(value) || isSandboxPath(value)) { + try { + const fd = getFdFromUriOrSandBoxPath(value) + path = `fd://${fd}` + } catch (error) { + console.info(`${JSON.stringify(error)}`) + } + } + if (this.audioPlayer.src && path !== this.audioPlayer.src) { + this.audioPlayer.reset() + } + this.audioPlayer.src = path + this.tempSrc = value + this.audioPlayer.play() + if (this.startTimeS) { + this.audioPlayer.seek(this.startTimeS) + } + startBackgroundTask() + createAVSession(this) + } + get startTime() { + return this.startTimeS / 1000 + } + set startTime(time) { + this.startTimeS = time * 1000 + } + get buffered() { + return this.audioPlayer.duration * this.bufferedS / 100000 + } + get title() { + return this.titleS + } + set title(titleName) { + this.titleS = titleName + } + get epname() { + return this.epnameS + } + set epname(epName) { + this.epnameS = epName + } + get singer() { + return this.singerS + } + set singer(singerName) { + this.singerS = singerName + } + get coverImgUrl() { + return this.coverImgUrlS + } + set coverImgUrl(url) { + this.coverImgUrlS = url + } + get webUrl() { + return this.webUrlS + } + set webUrl(url) { + this.webUrlS = url + } + get protocol() { + return this.protocolS + } + set protocol(protocolType) { + this.protocolS = protocolType + } + play() { + const state = this.audioPlayer.state + if (![StateType.PAUSED, StateType.STOPPED, StateType.IDLE].includes(state)) { + return + } + if (this.tempSrc && this.audioPlayer.src === '') { + this.src = this.tempSrc + } + this.audioPlayer.play() + startBackgroundTask() + createAVSession(this) + } + pause() { + const state = this.audioPlayer.state + if (StateType.PLAYING !== state) { + return + } + this.audioPlayer.pause() + } + stop() { + const state = this.audioPlayer.state + if (![StateType.PAUSED, StateType.PLAYING].includes(state)) { + return + } + this.audioPlayer.stop() + if (this.onStopCallback) { + this.onStopCallback({}) + } + this.audioPlayer.release() + this.init() + destroyAVSession(this) + stopBackgroundTask() + } + seek(position) { + const state = this.audioPlayer.state + if (![StateType.PAUSED, StateType.PLAYING].includes(state)) { + return + } + this.audioPlayer.seek(position * 1000) + } + onCanplay(callback) { + this.onCanplayCallback = callback + } + onPlay(callback) { + this.onPlayCallback = callback + } + onPause(callback) { + this.onPauseCallback = callback + } + onStop(callback) { + this.onStopCallback = callback + } + onEnded(callback) { + this.onFinishCallback = callback + } + onTimeUpdate(callback) { + this.onTimeUpdateCallback = callback + } + onError(callback) { + this.onErrorCallback = callback + } + onPrev(callback) { + console.info('ios only') + } + onNext(callback) { + console.info('ios only') + } + onWaiting(callback) { + this.onWaitingCallback = callback + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBluetooth/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBluetooth/index.js new file mode 100644 index 0000000000..6176779c4a --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBluetooth/index.js @@ -0,0 +1,496 @@ +import { BluetoothBase } from '../../../base/bridge/bluetoothBase' +import { BluetoothBaseModule, BLESTATE } from '../../../base/module/Bluetooth/BluetoothBaseModule' +import { BLHErrorCode } from '../../../base/util/ErrorCode' +import { isString, isNumber } from '../../../base/util/checkDataType' + +export default class ASBluetooth extends BluetoothBaseModule { + constructor() { + super() + this.deviceFoundCallback = undefined + this.adapterStateCallback = undefined + this.BLEConnectionStateCallback = undefined + this.initBluetoothDeviceFound() + this.initBluetoothAdapterStateChange() + this.initBLEConnectionStateChange() + } + /** + * Turn on Bluetooth. + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + openBluetoothAdapter() { + return new Promise(async (resolve, reject) => { + const permission = await BluetoothBase.getPermissions() + if (!permission) { + return reject(['permission fail', ErrorCode.USER_REJECT]) + } + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON // 获取当前设备蓝牙状态 + if (bluetoothState) { + this.isInit = true + resolve('ok') // 当前蓝牙为打开状态时走success + } else { + reject([['not available', BLHErrorCode.NOT_AVAILABLE]]) + } + }) + } + + /** + * Turn off Bluetooth + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + closeBluetoothAdapter () { + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_OFF // 获取当前设备蓝牙状态 + return new Promise((resolve, reject) => { + if (bluetoothState) { + reject([['bluetooth is not turned', BLHErrorCode.NOT_AVAILABLE]]) // 当前蓝牙为关闭状态时走fail + } else { + this.isInit = false + BluetoothBase.stopBluetoothDiscovery() + // 适配器扫描状态关闭 + this.state.discovering = false + // 存储成功连接ble设备的deviceId + this.deviceIdBle = '' + + // 蓝牙开启期间扫描到的全部设备 + this.scanResult = [] + + // clent实例 + if (this.gattClient) { + try { + this.gattClient.disconnect() + this.gattClient.close() + this.gattClient = null + } catch (err) {} + } + // 扫描监听模式(true:低功耗,false:蓝牙) + this.isOnBle = { mode: false } + // 低功耗蓝牙连接状态 + this.stateBLE = {} + this.services = [] + this.bleCharacteristic = {} + this.characteristicValue = null + this.devicesFoundListeners = [] + this.adapterStateChangeListeners = [] + this.BLEConnectionStateListeners = [] + this.BLECharacteristicListeners = [] + resolve('ok') + } + }) + } + + /** + * Start searching for nearby Bluetooth peripherals. + * @param {services} Array + * @param {allowDuplicatesKey} boolean + * @param {interval} number + * @param {powerLevel} string + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + startBluetoothDevicesDiscovery(params) { + if (this.isInit) { + return this.startDevicesDiscovery(params) + } else { + return new Promise((resolve, reject) => { + console.warn('[AdvancedAPI] bluetooth is no init') + reject([['not init', BLHErrorCode.NOT_INIT]]) + }) + } + } + + /** + * Stop searching for nearby Bluetooth peripherals. + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + stopBluetoothDevicesDiscovery(params) { + if (this.isInit) { + return this.stopDevicesDiscovery(params) + } else { + return new Promise((resolve, reject) => { + console.warn('[AdvancedAPI] bluetooth is no init') + reject([['not init', BLHErrorCode.NOT_INIT]]) + }) + } + } + + initBluetoothDeviceFound() { + this.deviceFoundCallback = device => { + this.onFoundEvent(device) + // 遍历所有监听者,发送消息 + for (const listener of this.devicesFoundListeners) { + // 执行设置的上报间隔(默认无间隔) + setTimeout(() => { + listener([this.scanResult]) + }, this.interval) + } + } + try { + // 开启蓝牙监听 + BluetoothBase.on(this.deviceFoundCallback) + + // 开启低功耗监听 + BluetoothBase.onBLE(this.deviceFoundCallback) + } catch (errMessage) { + console.error(`[AdvancedAPI] openHarmony ondevicefound fail ${errMessage}`) + } + } + + /** + * Listen to the event that a new device is found. + * @param {cb} function + * @param {scanResult} object + */ + onBluetoothDeviceFound(cb) { + this.devicesFoundListeners.push(cb) + } + + offBluetoothDeviceFound(cb) { + if (cb === undefined) { + this.devicesFoundListeners.splice(0) + return + } + if (typeof cb !== 'function') { + console.error('[AdvancedAPI] offBluetoothAdapterStateChange, param is invalid:' + typeof cb) + return + } + const index = this.devicesFoundListeners.indexOf(cb) + if (index > -1) { + this.devicesFoundListeners.splice(index, 1) + } + } + + initBluetoothAdapterStateChange() { + this.adapterStateCallback = (data) => { + const stateValue = this.state.available + if (data === 2) { + this.state.available = true + } else if (data === 0) { + this.state.available = false + } + if (stateValue !== this.state.available) { + // 遍历所有监听者,发送消息 + for (const listener of this.adapterStateChangeListeners) { + listener(stateValue) + } + } + } + + try { + BluetoothBase.onStateChange(data => { + this.adapterStateCallback(data) + }) + } catch (err) { + console.error('[AdvancedAPI] onBluetoothAdapterStateChange errCode:' + err.code + ',errMessage:' + err.message) + } + } + + /** + * Listening for Bluetooth adapter status change events. + * @param {cbFunc} function + * @param {available} boolean + * @param {discovering} boolean + */ + onBluetoothAdapterStateChange(cbFunc) { + this.adapterStateChangeListeners.push(cbFunc) + } + + offBluetoothAdapterStateChange(cb) { + if (cb === undefined) { + this.devicesFoundListeners.splice(0) + return + } + if (typeof cb !== 'function') { + console.error('[AdvancedAPI] offBluetoothAdapterStateChange, param is invalid:') + return + } + const index = this.adapterStateChangeListeners.indexOf(cb) + if (index > -1) { + this.adapterStateChangeListeners.splice(index, 1) + } + } + + /** + * Obtains the connected device based on the UUID. + * @param {services} Array + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + getConnectedBluetoothDevices(params) { + if (this.isInit) { + return this.getConnectedDevices(params) + } else { + return new Promise((resolve, reject) => { + console.warn('[AdvancedAPI] bluetooth is no init') + reject([['not init', BLHErrorCode.NOT_INIT]]) + }) + } + } + + /** + * Obtains all discovered Bluetooth devices during the validity period of the Bluetooth module. + * Including devices that are already connected to the local machine. + * @param {success} function + * @param {fail} function + * @param {complete} function + * @return {devices} Array + */ + getBluetoothDevices() { + if (this.isInit) { + return this.getDevices() + } else { + return new Promise((resolve, reject) => { + console.warn('[AdvancedAPI] bluetooth is no init') + reject([['not init', BLHErrorCode.NOT_INIT]]) + }) + } + } + + /** + * Gets the status of the local Bluetooth adapter. + * @param {discovering} boolean + * @param {available} boolean + */ + getBluetoothAdapterState() { + if (this.isInit) { + return this.getAdapterState() + } else { + return new Promise((resolve, reject) => { + console.warn('[AdvancedAPI] bluetooth is no init') + reject([['not init', BLHErrorCode.NOT_INIT]]) + }) + } + } + + /** + * Sets the Bluetooth MTU.The value range of MTU is 22–512. + * @param {deviceId} string + * @param {mtu} number + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asSetBLEMTU(params) { + return new Promise((resolve, reject) => { + if (!params || !params.deviceId || !params.mtu) { + console.error('[AdvancedAPI] setBLEMTU fail, params error') + reject([['param error', BLHErrorCode.SYSTEM_ERROR]]) + return + } + if (!isString(params.deviceId) || !isNumber(params.mtu)) { + console.error('[AdvancedAPI] setBLEMTU fail, params error') + reject([['param error', BLHErrorCode.SYSTEM_ERROR]]) + return + } + try { + console.debug('[AdvancedAPI] asSetBLEMTU deviceId:' + params.deviceId + ' this.deviceIdBLE = ' + this.deviceIdBle) + // 获取实例 + let gattClient + if (this.gattClient && params.deviceId.toLowerCase() === this.deviceIdBle.toLowerCase()) { + console.debug('[AdvancedAPI] asSetBLEMTU deviceId:' + params.deviceId) + gattClient = this.gattClient + } else { + gattClient = BluetoothBase.createGattClientDevice(params.deviceId) + gattClient.connect() + this.gattClient = gattClient + this.deviceIdBle = params.deviceId + } + this.gattClient.setBLEMtuSize(params.mtu) + resolve('ok') + } catch (err) { + console.error('[AdvancedAPI] setBLEMtuSize fail, errCode:' + err.code + ',errMessage:' + err.message) + reject([[err.message, BLHErrorCode.SYSTEM_ERROR]]) + } + }) + } + + /** + * Writes binary data to the Bluetooth Low Energy device characteristic value. + * Note: The function can be successfully called only when the feature value of the device supports write. + * @param {deviceId} string + * @param {serviceId} string + * @param {characteristicId} string + * @param {value} ArrayBuffer + * @param {writeType} string + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asWriteBLECharacteristicValue(params) { + return this.writeBLECharacteristicValue(params) + } + + /** + * Reads the binary data value of the Bluetooth Low Energy device's characteristic value + * Note: The function can be successfully invoked only when the feature value of the device supports read. + * @param {deviceId} string + * @param {serviceId} string + * @param {characteristicId} string + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asReadBLECharacteristicValue(params) { + return this.readBLECharacteristicValue(params) + } + + initBLEConnectionStateChange() { + this.BLEConnectionStateCallback = (stateChange) => { + // 遍历所有的监听者 + this.BLEConnectionStateListeners.forEach(callback => { + callback(stateChange) + }) + } + this.stateBLE = new Proxy({}, { + get: (target, key) => { + return target[key] + }, + set: (target, key, value) => { + target[key] = value + const state = { + deviceId: key, + connected: value + } + console.debug('AdvancedAPI bleConnectionStateChange') + this.BLEConnectionStateCallback(state) + return true + } + }) + } + + /** + * Listen for Bluetooth low energy connection status change events. + * including the developer's active connection or disconnection, device loss, and abnormal disconnection. + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asOnBLEConnectionStateChange(cb) { + this.BLEConnectionStateListeners.push(cb) + } + + asOffBLEConnectionStateChange(cb) { + if (cb === undefined) { + this.BLEConnectionStateListeners.splice(0) + return + } + if (typeof cb !== 'function') { + console.error('[AdvancedAPI] offBLEConnectionStateChange, param is invalid:') + return + } + const index = this.BLEConnectionStateListeners.indexOf(cb) + if (index > -1) { + this.BLEConnectionStateListeners.splice(index, 1) + } + } + + /** + * Turn on Bluetooth. + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asOnBLECharacteristicValueChange(cb) { + this.BLECharacteristicListeners.push(cb) + } + + asOffBLECharacteristicValueChange(cb) { + if (cb === undefined) { + this.BLECharacteristicListeners.splice(0) + return + } + if (typeof cb !== 'function') { + console.error('[AdvancedAPI] offBLECharacteristicValueChange, param is invalid:') + return + } + const index = this.BLECharacteristicListeners.indexOf(cb) + if (index > -1) { + this.BLECharacteristicListeners.splice(index, 1) + } + } + + /** + * Turn on Bluetooth. + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asNotifyBLECharacteristicValueChange(params) { + console.debug('[AdvancedAPI] params = ' + JSON.stringify(params)) + return this.notifyBLECharacteristicValueChange(params) + } + + /** + * Turn on Bluetooth. + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asGetBLEDeviceServices(params) { + return this.getBLEDeviceServices(params) + } + + /** + * Obtains the signal strength of a Bluetooth device. + * @param {deviceId} string + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asGetBLEDeviceRSSI(params) { + return new Promise((resolve, reject) => { + if (!params || !params.deviceId || typeof params.deviceId !== 'string') { + reject([['invalidParams', BLHErrorCode.SYSTEM_ERROR]]) + return + } + this.getBLEDeviceRSSI(params.deviceId).then((result) => { + resolve({ rssi: result }) + }).catch(err => { + reject([[err, BLHErrorCode.SYSTEM_ERROR]]) + }) + }) + } + + /** + * Obtains all feature values in a service of a Bluetooth device. + * @param {deviceId} string + * @param {serviceId} string + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asGetBLEDeviceCharacteristics(params) { + return this.getBLEDeviceCharacteristics(params) + } + + /** + * Connect the Bluetooth Low Energy device. + * @param {deviceId} string + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asCreateBLEConnection(params) { + if (params) { + console.info('[AdvancedAPI] asCreateBLEConnection params = ' + JSON.stringify(params)) + } + return this.createBLEConnection(params) + } + + /** + * Disconnect the Bluetooth Low Energy device. + * @param {deviceId} string + * @param {success} function + * @param {fail} function + * @param {complete} function + */ + asCloseBLEConnection(params) { + return this.closeBLEConnection(params) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBrightness/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBrightness/index.js new file mode 100644 index 0000000000..248c35f64b --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBrightness/index.js @@ -0,0 +1,25 @@ +import { ErrorCode } from '../../../base/util/ErrorCode' +import { BrightnessBaseModule } from '../../../base/module/Brightness/BrightnessBaseModule' + +export default class ASBrightness extends BrightnessBaseModule { + setScreenBrightness(params) { + console.info('[AdvancedAPI] params = ' + JSON.stringify(params)) + if (params && params.value !== undefined && (typeof params.value === 'number')) { + const value = params.value + if (value <= 1 && value >= 0) { + return this.setValue({ value: Math.round(params.value * 255) }) + } + } + return new Promise((resolve, reject) => { + reject(['param is invalid.', ErrorCode.PARAMETER_ERROR]) + }) + } + + getScreenBrightness() { + return this.getValue() + } + + asSetKeepScreenOn(params) { + return this.setKeepScreenOn(params) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBuffer/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBuffer/index.js new file mode 100644 index 0000000000..dfa265bd98 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASBuffer/index.js @@ -0,0 +1,20 @@ +import buffer from '@ohos.buffer' + +export default class ASBuffer { + /** + * 将 ArrayBuffer 对象转成 Base64 字符串 + * @param {arrayBuffer} arrayBuffer - 要转化成 ArrayBuffer 对象的 Base64 字符串 + * @return {string} - base64编码的字符串 + */ + arrayBufferToBase64 (arrayBuffer) { + if (!arrayBuffer || arrayBuffer.byteLength === undefined) { + return new Error('[AdvancedAPI] [arrayBufferToBase64] param type is not arrayBuffer') + } + if (!(arrayBuffer instanceof Uint8Array)) { + arrayBuffer = new Uint8Array(arrayBuffer) + } + const buf = buffer.allocUninitializedFromPool(arrayBuffer.byteLength) + const b = buf.fill(arrayBuffer) + return b.toString('base64') + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCapture/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCapture/index.js new file mode 100644 index 0000000000..e4f1b5020d --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCapture/index.js @@ -0,0 +1,86 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced capture screen event api + * Create: 04/10/2023 + * Notes: + */ +import window from '@ohos.window' + +// AS API class +export default class ASCapture { + /** + * constructor function, init callback map + */ + constructor() { + this.captureCallback = null + } + + /** + * subscribe user capture screen event + * @callback params path {String}: capture file storage path (ohos not support) + */ + onUserCaptureScreen(callback) { + if (!callback) { + console.error('[AdvancedAPI] params illegal, empty callback') + return + } + try { + window.getLastWindow(globalThis.abilityContext).then((data) => { + this.windowClass = data + + function screenshotCallback() { + callback('ohos not support path') + } + + if (this.captureCallback) { + this.windowClass.off('screenshot') + this.captureCallback = null + } + this.captureCallback = callback + + console.info('[AdvancedAPI] Succeeded in obtaining the top window. Listen to screenshot event.') + try { + this.windowClass.on('screenshot', screenshotCallback) + } catch (exception) { + console.error('[AdvancedAPI] Failed to register callback. Cause: ' + JSON.stringify(exception)) + } + }).catch((err) => { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(err)) + }) + } catch (exception) { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(exception)) + } + } + + /** + * unsubscribe user capture screen event + * remove all if callback is null, otherwise remove the specialized callback + */ + offUserCaptureScreen(callback) { + try { + window.getLastWindow(globalThis.abilityContext).then((data) => { + this.windowClass = data + console.info('[AdvancedAPI] Succeeded in obtaining the top window. Unsubscribe screenshot event.') + try { + if (callback) { + if (this.captureCallback && this.captureCallback === callback) { + this.windowClass.off('screenshot') + this.captureCallback = null + } else { + console.info('[AdvancedAPI] Invalid callback.') + } + } else { + this.windowClass.off('screenshot') + this.captureCallback = null + } + } catch (exception) { + console.error('[AdvancedAPI] Failed to unregister callback. Cause: ' + JSON.stringify(exception)) + } + }).catch((err) => { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(err)) + }) + } catch (exception) { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(exception)) + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCompass/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCompass/index.js new file mode 100644 index 0000000000..4698d14b94 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASCompass/index.js @@ -0,0 +1,85 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: Advanced API Compass + * Author: 00430169 + * Create: 7/4/2023 + * Notes: N/A + */ + +import { OhosSensorBase } from '../../../base/bridge/sensorBase' +import { ErrorCode } from '../../../base/util/ErrorCode' + +export default class ASCompass { + constructor () { + this.callBackCompassSet = new Set() + } + + onCompassChange (callback) { + return new Promise(async (resolve, reject) => { + if (typeof callback !== 'function') { + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + return + } + if (this.callBackCompassSet.has(callback)) { + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + } else { + this.callBackCompassSet.add(callback) + OhosSensorBase.ohosSubscribeCompass({ callback: (data) => { + const accuracy = 3 // 高精度 + const res = { + direction: data.alpha, + accuracy: data.alpha ? accuracy : 0 + } + for (const cb of this.callBackCompassSet.keys()) { + cb(res) + } + } }) + resolve() + } + }) + } + + offCompassChange (callback) { + return new Promise(async (resolve, reject) => { + if (typeof callback !== 'function') { + // compass off change默认不传参数时不取消所有监听 + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + return + } + if (!this.callBackCompassSet.has(callback)) { + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + } else { + this.callBackCompassSet.delete(callback) + if (this.callBackCompassSet.size === 0) { + OhosSensorBase.ohosUnsubscribeCompass() + } + resolve('success') + } + }) + } + + startCompass (object) { + return new Promise(async (resolve, reject) => { + OhosSensorBase.ohosSubscribeCompass({ + callback: (data) => { + const accuracy = 3 // 高精度 + const res = { + direction: data.alpha, + accuracy: data.alpha ? accuracy : 0 + } + for (const cb of this.callBackCompassSet.keys()) { + cb(res) + } + } + }) + resolve('success') + }) + } + + stopCompass () { + return new Promise(async (resolve, reject) => { + OhosSensorBase.ohosUnsubscribeCompass() + resolve('success') + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASContact/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASContact/index.js new file mode 100644 index 0000000000..12cdf6e704 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASContact/index.js @@ -0,0 +1,188 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: default description + * Author: weisufang + * Create: 04/12/2023 + * 需要权限: ohos.permission.WRITE_CONTACTS + */ + +import contact from '@ohos.contact' +import { context } from '../../../base/bridge/abilityBase' +import abilityAccessCtrl from '@ohos.abilityAccessCtrl' +import { ErrorCode } from '../../../base/util/ErrorCode' + +export default class ASContact { + /** + * 调用后,用户可以选择将该表单以“新增联系人”或“添加到已有联系人”的方式(APP端目前没有选择步骤,将直接写入) + * 写入手机系统通讯录,完成手机通讯录联系人和联系方式的增加。 + * @param {string} photoFilePath 头像本地文件路径 + * @param {string} nickName 昵称 + * @param {string} lastName 姓氏 + * @param {string} middleName 中间名 + * @param {string} firstName 名字 + * @param {string} remark 备注 + * @param {string} mobilePhoneNumber 手机号 + * @param {string} weChatNumber 微信号 + * @param {string} addressCountry 联系地址国家 + * @param {string} addressState 联系地址省份 + * @param {string} addressCity 联系地址城市 + * @param {string} addressStreet 联系地址街道 + * @param {string} addressPostalCode 联系地址邮政编码 + * @param {string} organization 公司 + * @param {string} title 职位 + * @param {string} workFaxNumber 工作传真 + * @param {string} workPhoneNumber 工作电话 + * @param {string} hostNumber 公司电话 + * @param {string} email 电子邮件 + * @param {string} url 网站 + * @param {string} workAddressCountry 工作地址国家 + * @param {string} workAddressState 工作地址省份 + * @param {string} workAddressCity 工作地址城市 + * @param {string} workAddressStreet 工作地址街道 + * @param {string} workAddressPostalCode 工作地址邮政编码 + * @param {string} homeFaxNumber 住宅传真 + * @param {string} homePhoneNumber 住宅电话 + * @param {string} homeAddressCountry 住宅地址国家 + * @param {string} homeAddressState 住宅地址省份 + * @param {string} homeAddressCity 住宅地址城市 + * @param {string} homeAddressStreet 住宅地址街道 + * @param {string} homeAddressPostalCode 住宅地址邮政编码 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + addPhoneContact (params) { + return new Promise(async (resolve, reject) => { + try { + const atManager = abilityAccessCtrl.createAtManager() + const { authResults, dialogShownResults} = await atManager.requestPermissionsFromUser(context, ['ohos.permission.WRITE_CONTACTS']) + if (authResults[0] === 0) { + console.debug('[AdvancedAPI] request WRITE_CONTACTS permission success') + } else { + // 权限拒绝 + reject(['request permission fail', ErrorCode.USER_REJECT, authResults[0], dialogShownResults[0]]) + return + } + } catch (err) { + reject(['request permission fail', ErrorCode.USER_REJECT]) + return + } + const { + photoFilePath, + nickName = '', + lastName = '', + middleName = '', + firstName = '', + remark, + mobilePhoneNumber, + weChatNumber, + addressCountry = '', + addressState = '', + addressCity = '', + addressStreet = '', + addressPostalCode, + organization, + url, + workPhoneNumber, + workFaxNumber, + hostNumber, + email, + title, + workAddressCountry = '', + workAddressState = '', + workAddressCity = '', + workAddressStreet = '', + workAddressPostalCode, + homeFaxNumber, + homePhoneNumber, + homeAddressCountry = '', + homeAddressState = '', + homeAddressCity = '', + homeAddressStreet = '', + homeAddressPostalCode + } = params + + if (!weChatNumber) { + console.error('[AdvancedAPI] weChatNumber do not support.') + } + + if (!firstName) { + console.error('[AdvancedAPI] firstName is required.') + reject(['fail Missing required parameter `firstName`', ErrorCode.PARAMETER_ERROR]) + return + } + + const contactInfo = { + name: { + familyName: lastName, + middleName: middleName, + givenName: firstName, + fullName: lastName + middleName + firstName + }, + nickName: { + nickName + }, + emails: [{ + email: email, + displayName: '邮箱' + }], + phoneNumbers: [{ + phoneNumber: homePhoneNumber, + labelId: contact.PhoneNumber.NUM_HOME + }, { + phoneNumber: mobilePhoneNumber, + labelId: contact.PhoneNumber.NUM_MOBILE + }, { + phoneNumber: homeFaxNumber, + labelId: contact.PhoneNumber.NUM_FAX_HOME + }, { + phoneNumber: workFaxNumber, + labelId: contact.PhoneNumber.NUM_FAX_WORK + }, { + phoneNumber: workPhoneNumber, + labelId: contact.PhoneNumber.NUM_WORK + }, { + phoneNumber: hostNumber, + labelId: contact.PhoneNumber.NUM_COMPANY_MAIN + }], + portrait: { uri: photoFilePath }, + postalAddresses: [{ + city: homeAddressCity, + country: homeAddressCountry, + postcode: homeAddressPostalCode, + street: homeAddressStreet, + postalAddress: homeAddressCountry + homeAddressState + homeAddressCity + homeAddressStreet, + labelId: contact.PostalAddress.ADDR_HOME + }, { + city: workAddressCity, + country: workAddressCountry, + postcode: workAddressPostalCode, + street: workAddressStreet, + postalAddress: workAddressCountry + workAddressState + workAddressCity + workAddressStreet, + labelId: contact.PostalAddress.ADDR_WORK + }, { + city: addressCity, + country: addressCountry, + postcode: addressPostalCode, + street: addressStreet, + postalAddress: addressCountry + addressState + addressCity + addressStreet, + labelId: contact.PostalAddress.CUSTOM_LABEL + }], + websites: [{ website: url }], + note: { noteContent: remark }, + organization: { + name: organization, + title + } + } + + contact.addContact(contactInfo).then((contactId) => { + console.debug(`[AdvancedAPI] addContact callback: success contactId = ${contactId}`) + resolve() + }).catch((err) => { + console.debug(`[AdvancedAPI] addContact callback: err->${JSON.stringify(err)}`) + reject([err.data, err.code]) + }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASDevice/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASDevice/index.js new file mode 100644 index 0000000000..7d7c6bd214 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASDevice/index.js @@ -0,0 +1,351 @@ +import { DeivceBase } from '../../../base/bridge/deviceBase' +import { DisplayBase } from '../../../base/bridge/displayBase' +import I18n from '@ohos.i18n' +import abilityAccessCtrl from '@ohos.abilityAccessCtrl' +import { context } from '../../../base/bridge/abilityBase' +import bluetooth from '@ohos.bluetooth' +import geoLocationManager from '@ohos.geoLocationManager' +import wifiManager from '@ohos.wifiManager' +import window from '@ohos.window' + +export default class ASDevice { + getSystemInfoSync () { + const { + brand: deviceBrand, + productModel: deviceModel, + osFullName, + deviceType, + udid: deviceId, + sdkApiVersion: ohosAPILevel + } = DeivceBase.getDeviceInfo() + const romName = osFullName.split('-')[0] + const osName = romName + const romVersion = osFullName.split('-')[1] + const osVersion = romVersion + + const osLanguage = I18n.System.getSystemLanguage() + const displayInfo = DisplayBase.ohosGetDisplay() + const { rotation, densityPixels: devicePixelRatio } = displayInfo + let { width: screenWidth, height: screenHeight } = displayInfo + screenWidth = Math.round(screenWidth / devicePixelRatio) + screenHeight = Math.round(screenHeight / devicePixelRatio) + const deviceOrientation = (rotation === 1 || rotation === 3) ? 'landscape' : 'portrait' + + const { + signatureInfo, + versionName: appVersion, + versionCode: appVersionCode, + appInfo + } = globalThis.bundleInfoForSelf + const appName = context.resourceManager.getStringSync(appInfo.labelId) + const appId = signatureInfo.appId + + const { + language: appLanguage + } = context.config + + let { + width: windowWidth, + height: windowHeight, + top: windowTop + } = globalThis.lastWindow.getWindowProperties()?.windowRect + const { + isFullScreen, isLayoutFullScreen + } = globalThis.lastWindow.getWindowProperties() + const systemCutout = globalThis.lastWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM) + const statusBarHeight = Math.round((systemCutout?.topRect?.height || 0) / devicePixelRatio) + const windowBottom = (isFullScreen || isLayoutFullScreen) ? Math.round(windowHeight / devicePixelRatio) : + Math.round((windowHeight + statusBarHeight) / devicePixelRatio) + windowTop = Math.round(windowTop / devicePixelRatio) + windowWidth = Math.round(windowWidth / devicePixelRatio) + windowHeight = Math.round(windowHeight / devicePixelRatio) + + const brand = deviceBrand + const model = deviceModel + const pixelRatio = devicePixelRatio + const system = osFullName + const language = osLanguage + const platform = osName + const version = osVersion + const result = { + deviceType, + deviceBrand, + brand, + deviceModel, + platform, + model, + deviceOrientation, + devicePixelRatio, + pixelRatio, + system, + osName, + osVersion, + version, + osLanguage, + language, + ohosAPILevel, + romName, + romVersion, + appId, + appName, + appVersion, + appVersionCode, + appLanguage, + screenWidth, + screenHeight, + windowWidth, + windowHeight, + windowTop, + windowBottom, + statusBarHeight + } + if (deviceId) { + result.deviceId = deviceId + } + return result + } + + getDeviceInfo () { + console.debug('[AdvancedAPI] start ASDevice getDeviceInfo') + const { + brand, + productModel: deviceModel, + osFullName: system, + deviceType, + osFullName, + udid: deviceId + } = DeivceBase.getDeviceInfo() + const deviceBrand = brand + const model = deviceModel + const platform = osFullName.split('-')[0] + const { + densityPixels: devicePixelRatio, + rotation + } = DisplayBase.ohosGetDisplay() + const deviceOrientation = (rotation === 1 || rotation === 3) ? 'landscape' : 'portrait' + const result = { + platform, + deviceBrand, + deviceModel, + deviceType, + deviceOrientation, + devicePixelRatio, + system, + brand, + model + } + if (deviceId) { + result.deviceId = deviceId + } + return result + } + + getWindowInfo () { + console.debug('[AdvancedAPI] start ASDevice getWindowInfo') + const display = DisplayBase.ohosGetDisplay() + + const { densityPixels: pixelRatio } = display + let { + width: screenWidth, + height: screenHeight + } = display + + let { + width: windowWidth, + height: windowHeight, + top: windowTop + } = globalThis.lastWindow.getWindowProperties()?.windowRect + const { + isFullScreen, + isLayoutFullScreen + } = globalThis.lastWindow.getWindowProperties() + const systemCutout = globalThis.lastWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM) + const statusBarHeight = Math.round((systemCutout?.topRect?.height || 0) / pixelRatio) + const windowBottom = (isFullScreen || isLayoutFullScreen) ? Math.round(windowHeight / pixelRatio) : + Math.round((windowHeight + statusBarHeight) / pixelRatio) + windowTop = Math.round(windowTop / pixelRatio) + windowWidth = Math.round(windowWidth / pixelRatio) + windowHeight = Math.round(windowHeight / pixelRatio) + screenWidth = Math.round(screenWidth / pixelRatio) + screenHeight = Math.round(screenHeight / pixelRatio) + return { + pixelRatio, + screenWidth, + screenHeight, + windowWidth, + windowHeight, + windowTop, + windowBottom, + statusBarHeight + } + } + getAppBaseInfo() { + console.debug('[AdvancedAPI] start ASDevice getAppBaseInfo') + const { + signatureInfo, + versionName: appVersion, + versionCode: appVersionCode, + appInfo + } = globalThis.bundleInfoForSelf + const enableDebug = appInfo.debug + const appName = context.resourceManager.getStringSync(appInfo.labelId) + const appId = signatureInfo.appId + const { + language: appLanguage + } = context.config + // eslint-disable-next-line no-undef + Environment.envProp('colorMode', -1) + const colorMode = AppStorage.get('colorMode') + const theme = colorMode === 0 ? 'light' : (colorMode === 1 ? 'dark' : 'auto') + return { + appId, + appName, + appVersion, + appVersionCode, + appLanguage, + enableDebug, + theme + } + } + getAppAuthorizeSetting() { + console.debug('[AdvancedAPI] start ASDevice getAppAuthorizeSetting') + const permissionsList = { + album: 'ohos.permission.WRITE_IMAGEVIDEO', + bluetooth: 'ohos.permission.USE_BLUETOOTH', + camera: 'ohos.permission.CAMERA', + location: 'ohos.permission.LOCATION', + locationAccuracy: 'ohos.permission.APPROXIMATELY_LOCATION', + microphone: 'ohos.permission.MICROPHONE', + notification: 'ohos.permission.NOTIFICATION_CONTROLLER', + phoneCalendar: 'ohos.permission.READ_CALENDAR' + } + + const atManager = abilityAccessCtrl.createAtManager() + const info = globalThis.bundleInfoForSelf + const tokenID = info.appInfo.accessTokenId + const grantStatus = (flag) => { + if (flag === -1) { + return 'denied' + } else if (flag === 0) { + return 'authorized' + } + return 'config error' + } + let albumAuthorized = 'not determined' + try { + albumAuthorized = atManager.checkAccessTokenSync(tokenID, permissionsList.album) + albumAuthorized = grantStatus(albumAuthorized) + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken album fail') + } + let bluetoothAuthorized = 'not determined' + try { + bluetoothAuthorized = atManager.checkAccessTokenSync(tokenID, permissionsList.bluetooth) + bluetoothAuthorized = grantStatus(bluetoothAuthorized) + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken bluetooth fail') + } + let cameraAuthorized = 'not determined' + try { + cameraAuthorized = atManager.checkAccessTokenSync(tokenID, permissionsList.camera) + cameraAuthorized = grantStatus(cameraAuthorized) + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken camera fail') + } + let locationAuthorized = 'not determined' + try { + locationAuthorized = atManager.checkAccessTokenSync(tokenID, permissionsList.location) + locationAuthorized = grantStatus(locationAuthorized) + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken location fail') + } + let locationAccuracy = 'not determined' + try { + locationAccuracy = (atManager.checkAccessTokenSync(tokenID, permissionsList.locationAccuracy)) === 0 ? 'full' : 'reduced' + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken locationAccuracy fail') + } + let microphoneAuthorized = 'not determined' + try { + microphoneAuthorized = atManager.checkAccessTokenSync(tokenID, permissionsList.microphone) + microphoneAuthorized = grantStatus(microphoneAuthorized) + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken microphone fail') + } + let notificationAuthorized = 'not determined' + try { + notificationAuthorized = atManager.checkAccessTokenSync(tokenID, permissionsList.notification) + notificationAuthorized = grantStatus(notificationAuthorized) + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken notification fail') + } + let phoneCalendarAuthorized = 'not determined' + try { + phoneCalendarAuthorized = atManager.checkAccessTokenSync(tokenID, permissionsList.phoneCalendar) + phoneCalendarAuthorized = grantStatus(phoneCalendarAuthorized) + } catch (e) { + console.debug('[AdvancedAPI] ASDevice getAppAuthorizeSetting checkAccessToken phoneCalendar fail') + } + + const result = { + albumAuthorized, + bluetoothAuthorized, + cameraAuthorized, + locationAuthorized, + locationAccuracy, + microphoneAuthorized, + notificationAuthorized, + phoneCalendarAuthorized + } + return result + } + getSystemSetting() { + let bluetoothEnabled + let locationEnabled + let wifiEnabled + let bluetoothError + let locationError + try { + bluetoothEnabled = bluetooth.getState() + bluetoothEnabled = !!(bluetoothEnabled === 2 || bluetoothEnabled === 5) + } catch (err) { + console.error('errCode:' + err.code + ',errMessage:' + err.message) + bluetoothError = err.message + } + try { + locationEnabled = geoLocationManager.isLocationEnabled() + } catch (err) { + console.error('errCode:' + err.code + ',errMessage:' + err.message) + locationError = err.message + } + try { + wifiEnabled = wifiManager.isWifiActive() + } catch (err) { + console.error('errCode:' + err.code + ',errMessage:' + err.message) + } + const { + rotation + } = DisplayBase.ohosGetDisplay() + const deviceOrientation = (rotation === 1 || rotation === 3) ? 'landscape' : 'portrait' + return { + bluetoothEnabled, + bluetoothError, + locationEnabled, + locationError, + wifiEnabled, + deviceOrientation + } + } + + openAppAuthorizeSetting() { + const want = { + bundleName: 'com.huawei.hmos.settings', + abilityName: 'com.huawei.hmos.settings.MainAbility', + uri: 'application_info_entry', + parameters: { + pushParams: context.applicationInfo.name // 打开指定应用的详情页面 + } + } + return context.startAbilityForResult(want) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileCallback.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileCallback.js new file mode 100644 index 0000000000..631be5fec1 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileCallback.js @@ -0,0 +1,49 @@ +import { checkDataType } from '../../../base/util/checkDataType' + +export default class FileCallback { + constructor({ success, fail, complete }) { + if (checkDataType(success, false, 'function')) { + this.successFn = success + } + if (checkDataType(fail, false, 'function')) { + this.failFn = fail + } + if (checkDataType(complete, false, 'function')) { + this.completeFn = complete + } + } + + success (...args) { + if (this.successFn) { + try { + this.successFn(...args) + } catch (err) { + console.error(err) + } + } + if (this.completeFn) { + try { + this.completeFn(...args) + } catch (err) { + console.error(err) + } + } + } + + fail (...args) { + if (this.failFn) { + try { + this.failFn(...args) + } catch (err) { + console.error(err) + } + } + if (this.completeFn) { + try { + this.completeFn(...args) + } catch (err) { + console.error(err) + } + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileError.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileError.js new file mode 100644 index 0000000000..a656319f84 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileError.js @@ -0,0 +1,41 @@ +const FILE_ERROR = { + OPERATION_NOT_PERMITTED: 1300001, // 操作不被允许(例如,filePath 预期传入一个文件而实际传入一个目录) + NO_SUCH_FILE_OR_DIRECTORY: 1300002, // 文件/目录不存在,或者目标文件路径的上层目录不存在 + INPUT_ERROR: 1300005, // 输入流不可用 + OUTPUT_ERROR: 1300005, // 输出流不可用 + BAD_FILE_DESCRIPTOR: 1300009, // 无效的文件描述符 + PERMISSION_DENIED: 1300013, // 权限错误,文件是只读或只写 + PATH_PERMISSION_DENIED: 1300014, // 传入的路径没有权限 + NOT_DIRECTORY: 1300020, // dirPath 指定路径不是目录,常见于指定的写入路径的上级路径为一个文件的情况 + IS_DIRECTORY: 1300021, // 指定路径是一个目录 + INVALID_ARGUMENT: 1300022, // 无效参数,可以检查length或offset是否越界 + FILE_NAME_TOO_LONG: 1300036, // 文件名过长 + DIRECTORY_NOT_EMPTY: 1300066, // directory not empty + SYSTEM_ERROR: 1300201, // 系统接口调用失败 + STORAGE_MAXIMUN_SIZE_EXCEEDED: 1300202, // 存储空间不足,或文件大小超出上限(上限100M) + BASE64_ENCODE_ERROR: 1300203, // 字符编码转换失败(例如 base64 格式错误) + SDCARD_NOT_MOUNTED: 1300300, // android sdcard 挂载失败 + UNABLE_OPEN_AS_FILETYPE: 1300301, // 无法以fileType打开文件 + CANNOT_ACCESS_FILE_PATH: 1301000, // 目标路径无访问权限(usr目录) + DATA_TO_WRITE_EMPTY: 1301002, // 写入数据为空 + ILLEGAL_OPERATION_ON_DIRECTORY: 1301003, // 不可对目录进行此操作(例如,指定的 filePath 是一个已经存在的目录) + ILLEGAL_OPERATION_ON_PACKAGE_DIRECTORY: 1301004, // 不可对代码包目录进行此操作 + FILE_ALREADY_EXISTS: 1301005, // 已有同名文件或目录 + LENGTH_VALUE_OUTOF_RANGE: 1301006, // 传入的 length 不合法 + OFFSET_VALUE_OUTOF_RANGE: 1301007, // 传入的 offset 不合法 + POSITION_VALUE_OUTOF_RANGE: 1301009, // position值越界 + STORE_DERECTORY_EMPTY: 1301100, // store目录为空 + UNZIP_OPEN_FEIL_FAIL: 1301102, // 压缩文件打开失败 + UNZIP_ENTRY_FAIL: 1301103, // 解压单个文件失败 + UNZIP_FAIL: 1301104, // 解压失败 + BROTLI_DECOMPRESS_FAIL: 1301111, // brotli解压失败(例如,指定的 compressionAlgorithm 与文件实际压缩格式不符) + TEMPFILEPATH_FILE_NOT_EXIST: 1301112, // 指定的 tempFilePath 找不到文件 + FAIL_PERMISSION_DENIED: 1302001, // 指定的 fd 路径没有读权限/没有写权限 + EXCCED_MAX_CONCURRENT_FD_LIMIT: 1302002, // fd数量已达上限 + INVALID_FLAG: 1302003, // 无效的flag + PERMISSION_DENIED_WHEN_OPEN_USING_FLAG: 1302004, // 无法使用flag标志打开文件 + ARRAY_BUFFER_DOES_NOT_EXISTl: 1302005, // 未传入arrayBuffer + ARRAY_BUFFER_IS_READONLY: 1302100 // arrayBuffer只读 +} + +export default FILE_ERROR diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileSystemManager.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileSystemManager.js new file mode 100644 index 0000000000..6f8c101b76 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/FileSystemManager.js @@ -0,0 +1,998 @@ +import fs from '@ohos.file.fs' +import buffer from '@ohos.buffer' +import { context } from '../../../base/bridge/abilityBase' +import { checkDataType } from '../../../base/util/checkDataType' +import FileCallback from './FileCallback' +import { + getOpenMode, + modeReflect, + getFileTypeMode, + mkdirRecursive, + checkFd, + checkFdSync, + checkEncoding, + checkPath, + checkPathSync, + checkPathExistence, + checkPathExistenceSync, + obtainFileName, + obtainUpperPath, +} from './util' +import { isSandboxPath, switchInternalToHapSandBox } from '../../util' + +const ERROR = { + PARAMETER_ERROR: 1001 +} + +const DEFAULT_ENCODING = 'utf-8' +const DEFAULT_POSITION = 0 +const DEFAULT_LENGTH = 0 +const DEFAULT_FLAG = 'r' +const DEFAULT_OFFSET = 0 +const FLAG = [ + 'a', // 打开文件用于追加。 如果文件不存在,则创建该文件 + 'ax', // 类似于 'a',但如果路径存在,则失败 + 'a+', // 打开文件用于读取和追加。 如果文件不存在,则创建该文件 + 'ax+', // 类似于 'a+',但如果路径存在,则失败 + 'as', // 打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件 + 'as+', // 打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件 + 'r', // 打开文件用于读取。 如果文件不存在,则会发生异常 + 'r+', // 打开文件用于读取和写入。 如果文件不存在,则会发生异常 + 'w', // 打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件 + 'wx', // 类似于 'w',但如果路径存在,则失败 + 'w+', // 打开文件用于读取和写入。 如果文件不存在则创建文件,如果文件存在则截断文件 + 'wx+', // 类似于 'w+',但如果路径存在,则失败 +] + +export default class FileSystemManager { + constructor() { + this.pathDir = context.filesDir // 沙箱路径 + } + + access ({ path, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + const fileUri = isSandboxPath(path) ? switchInternalToHapSandBox(path) : path + if (!checkDataType(fileUri, true, 'string')) { + cb.fail({ + errMsg: 'access:fail parameter error: parameter.path should be String', + errno: ERROR.PARAMETER_ERROR // 对齐微信错误码 + }) + return + } + fs.access(fileUri).then(res => { + if (res) { + console.debug('[AdvancedAPI] file access exist') + cb.success({ errMsg: 'access:ok' }) + } else { + cb.fail({ errMsg: 'access:fail no such file or directory' }) + } + }, (err) => { + console.debug('[AdvancedAPI] access failed with error message: %s, code = %d', err.message, err.code) + }) + } + + accessSync (path) { + if (!checkDataType(path, true, 'string')) { + throw new Error('accessSync:fail path must be a string') + } + const res = fs.accessSync(path) + if (!res) { + throw new Error('accessSync:fail no such file or directory') + } + } + + // 当数据是string类型时有效,表示数据的编码方式,默认 ‘utf-8’。当前仅支持 ‘utf-8’ + appendFile ({ filePath, data, encoding = DEFAULT_ENCODING, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + if (!checkDataType(filePath, true, 'string')) { + cb.fail({ + errMsg: 'access:fail parameter error: parameter.filePath should be String', + errno: ERROR.PARAMETER_ERROR + }) + return + } + if (!checkDataType(data, true, ['string', 'arraybuffer'])) { + cb.fail({ + errMsg: 'access:fail parameter error: parameter.data should be String/ArrayBuffer', + errno: ERROR.PARAMETER_ERROR + }) + return + } + + const res = fs.accessSync(filePath) + if (!res) { + cb.fail({ errMsg: `appendFile:fail no such file or directory, open "${filePath}"` }) + return + } + + const file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.APPEND) + fs.write(file.fd, data).then(writeLen => { + cb.success({ errMsg: 'appendFile:ok' }) + fs.closeSync(file) + }).catch((err) => { + console.error('[AdvancedAPI] appendFile failed with error message: ' + err.message + ', error code: ' + err.code) + cb.fail({ errMsg: `appendFile:fail ${err.message}` }) + }) + } + + // 当数据是string类型时有效,表示数据的编码方式,默认 ‘utf-8’。当前仅支持 ‘utf-8’ + appendFileSync (filePath, data, encoding = DEFAULT_ENCODING) { + if (!checkDataType(filePath, true, 'string')) { + throw new Error('access:fail parameter error: parameter.filePath should be String') + } + if (!checkDataType(data, true, ['string', 'arraybuffer'])) { + throw new Error('access:fail parameter error: parameter.data should be String/ArrayBuffer') + } + + const res = fs.accessSync(filePath) + if (!res) { + throw new Error(`appendFile:fail no such file or directory, open "${filePath}"`) + } + + const file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.APPEND) + fs.writeSync(file.fd, data) + } + + // 打开文件,返回文件描述符 + open ({ filePath, flag = DEFAULT_FLAG, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + if (!checkDataType(filePath, true, 'string')) { + cb.fail({ + errMsg: 'open:fail parameter error: parameter.filePath should be String', + errno: ERROR.PARAMETER_ERROR + }) + return + } + if (!FLAG.includes(flag)) { + flag = DEFAULT_FLAG + } + + if (Object.keys(modeReflect).includes(flag)) { + const res = fs.accessSync(filePath) + if (!res) { + console.debug('[AdvancedAPI] access fail') + flag = modeReflect[flag] + } else { + cb.fail({ errMsg: 'open:fail EXIST: file already exists' }) + return + } + } + + fs.open(filePath, getOpenMode(flag), (err, file) => { + if (err) { + console.error('[AdvancedAPI] open failed with error message: ' + err.message + ', error code: ' + err.code) + cb.fail({ + errMsg: `open:fail ${err.message}`, + errno: ERROR.NO_SUCH_FILE_OR_DIRECTORY + }) + } else { + cb.success({ fd: file.fd.toString(), errMsg: 'open:ok' }) + } + }) + } + + openSync ({ filePath, flag }) { + if (!checkDataType(filePath, true, 'string')) { + throw new Error('openSync:fail parameter error: parameter.filePath should be String') + } + if (!FLAG.includes(flag)) { + flag = DEFAULT_FLAG + } + + if (Object.keys(modeReflect).includes(flag)) { + const res = fs.accessSync(filePath) + if (!res) { + console.debug('[AdvancedAPI] access fail') + flag = modeReflect[flag] + } else { + throw new Error('openSync:fail EXIST: file already exists') + } + } + + const file = fs.openSync(filePath, getOpenMode(flag)) + return file.fd.toString() + } + + close ({ fd, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + if (fd === '' || !checkDataType(fd, true, 'string')) { + cb.fail({ + errMsg: 'close:fail invalid fd', + errno: ERROR.PARAMETER_ERROR + }) + return + } + fd = Number(fd) + if (isNaN(fd)) { + cb.fail({ errMsg: `close:fail bad file descriptor` }) + return + } + fs.close(fd, err => { + if (err) { + cb.fail({ errMsg: `close:fail bad file descriptor` }) + } else { + cb.success({ errMsg: 'close:ok' }) + } + }) + } + + closeSync ({ fd }) { + if (fd === '' || !checkDataType(fd, true, 'string')) { + throw new Error('closeSync:fail invalid fd') + } + fd = Number(fd) + if (isNaN(fd)) { + throw new Error('closeSync:fail invalid fd') + } + fs.closeSync(fd) + } + + // 差异: srcPath与destPath相同时,微信提示成功,但鸿蒙抛出异常,提示Error: File exists + copyFile ({ srcPath, destPath, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + const checkResOfSrcPath = checkPathExistence('copyFile', 'srcPath', srcPath) + if (!checkResOfSrcPath.isValid) { + cb.fail(checkResOfSrcPath.checkMsg) + return + } + + const checkResOfDestPath = checkPath('copyFile', 'destPath', destPath) + if (!checkResOfDestPath.isValid) { + cb.fail(checkResOfDestPath.checkMsg) + return + } + + // 判断srcPath是否为一个目录 + if (fs.statSync(srcPath).isDirectory()) { + cb.fail({ errMsg: `copyFile: fail illegal operation on a directory, open: ${srcPath}` }) + return + } + + // 判断destPath路径是否存在 + if (!fs.accessSync(destPath)) { + const getUpperPath = obtainUpperPath(destPath) + + // copyFile不支持创建目录 upperPath不存在直接报错 + if (!fs.accessSync(getUpperPath.upperPath)) { + cb.fail({ errMsg: `copyFile: fail no such file or directory, open: ${destPath}` }) + return + } + } else { + const destPathStat = fs.statSync(destPath) + // 路径存在且为目录,则拼接srcPath的文件名作为destPath + if (destPathStat.isDirectory()) { + destPath = destPath + obtainFileName(srcPath).fileName + } else { + // 路径存在且为文件,源路径必须与目标路径相同 + if (destPathStat.isFile() && (srcPath !== destPath)) { + cb.fail({ errMsg: 'copyFile: fail copyFile failed' }) + return + } + } + } + + fs.copyFile(srcPath, destPath) + .then(() => { + cb.success({ errMsg: 'copyFile: ok' }) + }) + .catch((err) => { + cb.fail({ errMsg: `copyFile: failed with error message: ${err.message}, error code: ${err.code}` }) + }) + } + + // 差异: srcPath与destPath相同时,微信提示成功,但鸿蒙抛出异常,提示Error: File exists + copyFileSync (srcPath, destPath) { + const checkResSrc = checkPathExistenceSync('copyFileSync', 'srcPath', srcPath) + if (!checkResSrc.isValid) { + throw new Error(checkResSrc.errMsg) + } + + const checkResDest = checkPathSync('copyFileSync', 'destPath', destPath) + if (!checkResDest.isValid) { + throw new Error(checkResDest.errMsg) + } + + if (fs.statSync(srcPath).isDirectory()) { + throw new Error(`copyFileSync: fail illegal operation on a directory: ${srcPath}`) + } + + if (!fs.accessSync(destPath)) { + const getUpperPath = obtainUpperPath(destPath) + if (!fs.accessSync(getUpperPath.upperPath)) { + throw new Error(`copyFileSync: fail no such file or directory: ${destPath}`) + } + } else { + // 判断存在的路径是目录还是文件 + const destPathStat = fs.statSync(destPath) + // 判断存在的路径是目录还是文件 + if (destPathStat.isDirectory()) { + const index = destPath.lastIndexOf('/') + let namePath = destPath.substring(index) + + // 处理' ../test.txt/ '的情况 + if (destPath.endsWith('/')) { + namePath = destPath.substring(destPath.lastIndexOf('/', destPath.length - 2) + 1, destPath.length - 1) + } + + destPath = destPath + namePath + } else { + // 判断destPath是否等于srcPath, 若不等,则报错 + if (destPathStat.isFile() && (srcPath !== destPath)) { + throw new Error('copyFileSync: fail copyFile failed') + } + } + } + + try { + fs.copyFileSync(srcPath, destPath) + } catch (err) { + throw new Error(`copyFileSync: ${err.message}`) + } + } + + fstat ({ fd, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + const res = checkFd('fstat', fd) + if (!res.isValid) { + cb.fail(res.checkMsg) + return + } else { + fd = res.fd + } + + fs.stat(fd, (err, stat) => { + if (err) { + cb.fail({ errMsg: `fstat: failed with error message: ${err.message}, error code: ${err.code}` }) + } else { + const combinationMode = getFileTypeMode(stat) | stat.mode + cb.success({ + stat: { + mode: combinationMode, + size: stat.size, + lastAccessedTime: stat.atime, + lastModifiedTime: stat.mtime, + isDirectory: () => { return stat.isDirectory() }, + isFile: () => { return stat.isFile() }, + }, + errMsg: 'fstat: ok' + }) + } + }) + } + + fstatSync ({ fd }) { + const res = checkFdSync('fstatSync', fd) + if (!res.isValid) { + throw new Error(res.errMsg) + } else { + fd = res.fd + } + + try { + const stat = fs.statSync(fd) + const combinationMode = getFileTypeMode(stat) | stat.mode + return { + stat: { + mode: combinationMode, + size: stat.size, + lastAccessedTime: stat.atime, + lastModifiedTime: stat.mtime, + isDirectory: () => { return stat.isDirectory() }, + isFile: () => { return stat.isFile() } + } + } + } catch (err) { + throw new Error(`fstatSync: ${err.message}`) + } + } + + ftruncate ({ fd, length, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + const res = checkFd('ftruncate', fd) + if (!res.isValid) { + cb.fail(res.checkMsg) + return + } else { + fd = res.fd + } + + if (!checkDataType(length, true, 'number') || length < 0) { + length = DEFAULT_LENGTH // 非number类型 设为默认值DEFAULT_LENGTH ,DEFAULT_LENGTH=0 + } + + fs.truncate(fd, length).then(() => { + cb.success({ errMsg: 'ftruncate: ok' }) + }).catch((err) => { + cb.fail({ errMsg: `ftruncate: failed with error message: ${err.message}, error code: ${err.code}` }) + }) + } + + ftruncateSync ({ fd, length }) { + const res = checkFdSync('ftruncateSync', fd) + if (!res.isValid) { + throw new Error(res.errMsg) + } else { + fd = res.fd + } + + if (!checkDataType(length, true, 'number') || length < 0) { + length = DEFAULT_LENGTH // 非number类型 设为默认值DEFAULT_LENGTH ,DEFAULT_LENGTH=0 + } + + try { + fs.truncateSync(fd, length) + } catch (err) { + throw new Error(`ftruncateSync: ${err.message}`) + } + } + + mkdir ({ dirPath, recursive, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + // 将非boolean类型的入参转换为boolean类型 + if (!checkDataType(recursive, false, 'boolean')) { + recursive = Boolean(recursive) + } + + const checkRes = checkPath('mkdir', 'dirPath', dirPath) + if (!checkRes.isValid) { + cb.fail(checkRes.checkMsg) + return + } + + // 检查目录是否已经存在 + if (fs.accessSync(dirPath)) { + cb.fail({ errMsg: `mkdir: dirPath already exists: ${dirPath}` }) + return + } + + // 是否递归创建 + if (recursive) { + mkdirRecursive('', dirPath.split('/')) + cb.success({ errMsg: 'mkdir: ok' }) + } else { + const getSubPath = obtainUpperPath(dirPath) + if (fs.accessSync(getSubPath.upperPath)) { + fs.mkdir(dirPath) + .then(() => { + cb.success({ errMsg: 'mkdir: ok' }) + }) + .catch((err) => { + cb.fail({ + errMsg: `mkdir: failed with error message: ${err.message}, error code: ${err.code}` + }) + }) + } else { + cb.fail({ errMsg: 'mkdir: failed' }) + } + } + } + + mkdirSync (dirPath, recursive) { + // 将非boolean类型的入参转换为boolean类型 + if (!checkDataType(recursive, false, 'boolean')) { + recursive = Boolean(recursive) + } + + const res = checkPathSync('mkdirSync', 'dirPath', dirPath) + if (!res.isValid) { + throw new Error(res.errMsg) + } + + // 检查目录是否已经存在 + if (fs.accessSync(dirPath)) { + throw new Error(`mkdirSync: dirPath already exists: ${dirPath}`) + } + + // recursive为false且上级目录不存在 + if (!recursive && !fs.accessSync(obtainUpperPath(dirPath).upperPath)) { + throw new Error(`mkdirSync: fail, recursive is false and upper path does not exist`) + } + + if (recursive) { + try { + mkdirRecursive('', dirPath.split('/')) + } catch (err) { + throw new Error(`mkdirSync: ${err.message}`) + } + } else { + try { + fs.mkdirSync(dirPath) + } catch (err) { + throw new Error(`mkdirSync: ${err.message}`) + } + } + } + + // 仅负责读取文件,需要开发者手动打开文件,调完read接口后,手动关闭文件 + read ({ fd, arrayBuffer, offset = DEFAULT_OFFSET, length, position, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + + if (!checkDataType(fd, true, 'string') || fd === '' || isNaN(Number(fd))) { + cb.fail({ errMsg: 'read: fail invalid fd' }) + return + } else { + fd = Number(fd) + } + + if (!checkDataType(arrayBuffer, true, 'arraybuffer')) { + cb.fail({ errMsg: `read: fail invalid arrayBuffer: ${arrayBuffer}` }) + return + } + + // offset、length、position为负数时,微信不报错也读不出内容,但鸿蒙接口会crash + if (!checkDataType(offset, false, 'number') || offset < 0) { + offset = Number(offset) // 转换非number类型的数据,转换结果:true = 1, false = 0, '12' = 12, null = 0 + if (isNaN(offset) || offset < 0) { + offset = DEFAULT_OFFSET // 其他类型如object、undefined, 设为默认值 + } + } + + if (!checkDataType(length, false, 'number') || length < 0) { + length = Number(length) + if (isNaN(length) || length < 0) { + length = DEFAULT_LENGTH + } + } + + const allowedSize = arrayBuffer.byteLength - offset // ArrayBuffer中允许读取的最大容量 + if (allowedSize < length) { + cb.fail({ errMsg: `read: fail RangeError [ERR_OUT_OF_RANGE]: The value length is out of range. It must be <= ${allowedSize}. Received ${length}` }) + return + } + + if (!checkDataType(position, false, 'number') || position < 0) { + position = DEFAULT_POSITION // 非number类型,设为默认值 + } + + /* + * 参数说明: + * 【微信中】 + * offset: number类型,缓冲区中的写入偏移量,默认0 + * length: number类型,要从文件中读取的字节数,默认0 + * position: number类型,文件读取的起始位置,如不传或传 null,则会从当前文件指针的位置读取。 + * 如果 position 是正整数,则文件指针位置会保持不变并从 position 读取文件 + * 【鸿蒙中】 + * offset: number类型,期望读取文件的位置。默认从当前位置开始读。 + * length: number类型,期望读取数据的长度。默认缓冲区长度。 + */ + const offsetArrayBuffer = offset // 缓冲区要求写入的偏移量 + const newBuffer = arrayBuffer.slice(offsetArrayBuffer) // 临时申请一块新的空间 + fs.read(fd, newBuffer, { offset: position, length }) + .then((readLen) => { + const viewNewBuffer = new Uint8Array(newBuffer) + const viewArrayBuffer = new Uint8Array(arrayBuffer) + viewArrayBuffer.set(viewNewBuffer, offsetArrayBuffer) + console.debug('[AdvancedAPI] the content of arrayBuffer: %s', String.fromCharCode.apply(null, new Uint8Array(newBuffer.slice(0, readLen)))) + cb.success({ + bytesRead: readLen, + arrayBuffer: arrayBuffer, + errMsg: 'read: ok' + }) + }) + .catch((err) => { + cb.fail({ errMsg: `read: failed with error message: ${err.message},error code: ${err.code}` }) + }) + } + + // 仅负责读取文件,需要开发者手动打开文件,调完read接口后,手动关闭文件 + readSync ({ fd, arrayBuffer, offset, length, position }) { + if (!checkDataType(fd, true, 'string') || fd === '' || isNaN(Number(fd))) { + throw new Error('readSync:fail invalid fd') + } else { + fd = Number(fd) + } + + if (!checkDataType(arrayBuffer, true, 'arraybuffer')) { + throw new Error('readSync: fail invalid arrayBuffer') + } + + if (!checkDataType(offset, false, 'number') || offset < 0) { + offset = Number(offset) // 转换非number类型的数据,转换结果:true = 1, false = 0, '12' = 12, null = 0 + if (isNaN(offset) || offset < 0) { + offset = DEFAULT_OFFSET // 其他类型如object、undefined, 设为默认值 + } + } + + if (!checkDataType(length, false, 'number') || length < 0) { + length = Number(length) + if (isNaN(length) || length < 0) { + length = DEFAULT_LENGTH + } + } + + const allowedSize = arrayBuffer.byteLength - offset // ArrayBuffer中允许读取的最大容量 + if (allowedSize < length) { + throw new Error(`readSync: fail RangeError [ERR_OUT_OF_RANGE]: The value length is out of range. It must be <= ${allowedSize}. Received ${length}`) + } + + if (!checkDataType(position, false, 'number') || position < 0) { + position = DEFAULT_POSITION // 非number类型,设为默认值 + } + + /* + * 参数说明: + * @微信中 + * offset: number类型,缓冲区中的写入偏移量,默认0 + * length: number类型,要从文件中读取的字节数,默认0 + * position: number类型,文件读取的起始位置,如不传或传 null,则会从当前文件指针的位置读取。 + * 如果 position 是正整数,则文件指针位置会保持不变并从 position 读取文件 + * @鸿蒙中 + * offset: number类型,期望读取文件的位置。默认从当前位置开始读。 + * length: number类型,期望读取数据的长度。默认缓冲区长度。 + */ + try { + const offsetArrayBuffer = offset // 缓冲区要求写入的偏移量 + const newBuffer = arrayBuffer.slice(offsetArrayBuffer) // 临时申请一块新的空间 + const len = fs.readSync(fd, newBuffer, { offset: position, length }) + const viewNewBuffer = new Uint8Array(newBuffer) // 创建视图用于操纵数据,在入参arrayBuffer的偏移量为offsetArrayBuffer的位置写入数据 + const viewArrayBuffer = new Uint8Array(arrayBuffer) + viewArrayBuffer.set(viewNewBuffer, offsetArrayBuffer) + console.debug('[AdvancedAPI] the content of arrayBuffer: %s', String.fromCharCode.apply(null, new Uint8Array(arrayBuffer.slice(0, len)))) + + return { bytesRead: len, arrayBuffer: arrayBuffer } + } catch (err) { + throw new Error(`readSync: ${err.message}`) + } + } + + /** + * 功能:readdir读取目录的文件列表 使用鸿蒙的listFile实现(列出文件夹下所有文件名) + * 差异:微信支持访问空串,读取到的结果是根目录的文件列表;鸿蒙listFile判定空串是合法的,但读不到根目录的内容,返回的内容为空 + * 由于鸿蒙的一些接口如accessSync 、 statSync 认为空串是非法的,所以该接口也将空串按照非法值处理,不返回空内容 + */ + readdir ({ dirPath, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + const checkRes = checkPathExistence('readdir', 'dirPath', dirPath) + if (!checkRes.isValid) { + cb.fail(checkRes.checkMsg) + return + } + + const stat = fs.statSync(dirPath) + if (stat.isFile()) { + cb.fail({ errMsg: `readdir: fail, dirPath not a directory: ${dirPath}` }) + return + } + + fs.listFile(dirPath) + .then((files) => { + cb.success({ + files, + errMsg: 'readdir: ok' + }) + }) + .catch((err) => { + cb.fail({ errMsg: `readdir: failed with error message: ${err.message}, error code: ${err.code}` }) + }) + } + + readdirSync (dirPath) { + const res = checkPathExistence('readdirSync', 'dirPath', dirPath) + if (!res.isValid) { + throw new Error(res.errMsg) + } + + if (fs.statSync(dirPath).isFile()) { + throw new Error('readdirSync: fail not a directory: ${dirPath}') + } + + try { + const files = fs.listFileSync(dirPath) + return { files } + } catch (err) { + throw new Error(`readdirSync: ${err.message}`) + } + } + + readFile ({ filePath, encoding, position = DEFAULT_POSITION, length, success, fail, complete }) { + filePath = isSandboxPath(filePath) ? switchInternalToHapSandBox(filePath) : filePath + const cb = new FileCallback({ success, fail, complete }) + const checkRes = checkPathExistence('readFile', 'filePath', filePath) + if (!checkRes.isValid) { + cb.fail(checkRes.checkMsg) + return + } + + const stat = fs.statSync(filePath) + if (stat.isDirectory()) { + cb.fail({ errMsg: `readFile:fail not absolute path: ${filePath}` }) + return + } + + const res = checkEncoding('readFile', encoding) + if (!res.isValid) { + cb.fail({ errMsg: res.checkMsg }) + return + } + + const lengthOfFile = stat.size + length = (length === undefined || length === null) ? lengthOfFile : length + + if (!checkDataType(position, false, 'number')) { + cb.fail({ errMsg: `readFile:fail invalid position: ${position}` }) + return + } + + if (!checkDataType(length, false, 'number')) { + cb.fail({ errMsg: `readFile:fail invalid length: ${length}` }) + return + } + + if (position < 0 || position > lengthOfFile) { + cb.fail({ errMsg: 'readFile:fail the value of "position" is out of range' }) + return + } + + if (length < 0 || length + position > lengthOfFile) { + cb.fail({ errMsg: 'readFile:fail the value of "length" is out of range' }) + return + } + + const file = fs.openSync(filePath, fs.OpenMode.READ_ONLY) + const buf = new ArrayBuffer(length) + fs.read(file.fd, buf, { position, length }) + .then(() => { + const data = encoding ? buffer.from(buf).toString(encoding) : buf + cb.success({ + data, + errMsg: 'readFile:ok' + }) + }) + .catch((err) => { + cb.fail({ errMsg: `readFile:fail error message: ${err.message}, error code: ${err.code}` }) + }) + .finally(() => { + fs.closeSync(file) + }) + } + + readFileSync (filePath, encoding, position = DEFAULT_POSITION, length) { + filePath = isSandboxPath(filePath) ? switchInternalToHapSandBox(filePath) : filePath + const res1 = checkPathExistenceSync('readFileSync', 'filePath', filePath) + if (!res1.isValid) { + throw new Error(res1.errMsg) + } + // 判断filePath是文件还是目录 + const stat = fs.statSync(filePath) + if (stat.isDirectory()) { + throw new Error(`readFileSync:fail illegal operation on a directory, open: ${filePath}`) + } + + const res2 = checkEncoding('readFile', encoding) + if (!res2.isValid) { + throw new Error(res2.checkMsg) + } + + const lengthOfFile = stat.size + length = (length === undefined || length === null) ? lengthOfFile : length + + if (!checkDataType(position, false, 'number')) { + throw new Error(`readFileSync:fail invalid position: ${position}`) + } + + if (!checkDataType(length, false, 'number')) { + throw new Error(`readFileSync:fail invalid length: ${length}`) + } + + if (position < 0 || position > lengthOfFile) { + throw new Error('readFileSync:fail the value of "position" is out of range') + } + + if (length < 0 || length + position > lengthOfFile) { + throw new Error('readFileSync:fail the value of "length" is out of range') + } + + try { + const file = fs.openSync(filePath, fs.OpenMode.READ_ONLY) + const buf = new ArrayBuffer(length) + fs.readSync(file.fd, buf, { position, length }) + fs.closeSync(file) + const data = encoding ? buffer.from(buf).toString(encoding) : buf + return data + } catch (err) { + throw new Error(`readFileSync:fail ${err.message}`) + } + } + + rename ({ oldPath, newPath, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + const checkRes1 = checkPathExistence('rename', 'oldPath', oldPath) + if (!checkRes1.isValid) { + cb.fail(checkRes1.checkMsg) + return + } + + const checkRes2 = checkPath('rename', 'newPath', newPath) + if (!checkRes2.isValid) { + cb.fail(checkRes2.checkMsg) + return + } + + const ifAccessNewPath = fs.accessSync(newPath) + if (!ifAccessNewPath) { + const getUpperPath = obtainUpperPath(newPath) + if (!fs.accessSync(getUpperPath.upperPath)) { + cb.fail({ errMsg: `rename: fail no such file or directory: ${newPath}` }) + return + } + } + + if (ifAccessNewPath && (oldPath !== newPath)) { + cb.fail({ errMsg: 'rename: fail' }) + return + } + + fs.rename(oldPath, newPath).then(() => { + cb.success({ errMsg: 'rename: ok' }) + }).catch((err) => { + cb.fail({ errMsg: `rename: failedwith error message: ${err.message}, error code: ${err.code}` }) + }) + } + + renameSync (oldPath, newPath) { + // 差异:微信的'' 代指根目录,鸿蒙是不支持访问根目录的 + const res1 = checkPathExistenceSync('renameSync', 'oldPath', oldPath) + if (!res1.isValid) { + throw new Error(res1.errMsg) + } + + const res2 = checkPathSync('renameSync', 'newPath', newPath) + if (!res2.isValid) { + throw new Error(res2.errMsg) + } + + // 若新路径不存在且上级目录也不存在 + const ifAccessNewPath = fs.accessSync(newPath) + if (!ifAccessNewPath && !fs.accessSync(obtainUpperPath(newPath).upperPath)) { + throw new Error(`renameSync: fail no such file or directory, open: ${newPath}`) + } + + // 判断newPath是否存在 若存在且oldPath不等于newPath 则报错 + if (ifAccessNewPath && (oldPath !== newPath)) { + throw new Error('renameSync: fail') + } + + try { + fs.renameSync(oldPath, newPath) + } catch (err) { + throw new Error(`renameSync: ${err.message}`) + } + } + + rmdir ({ dirPath, recursive, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + + // 将非boolean类型的入参转换为boolean类型 + if (!checkDataType(recursive, false, 'boolean')) { + recursive = Boolean(recursive) + } + + const res = checkPathExistence('rmdir', 'dirPath', dirPath) + if (!res.isValid) { + cb.fail(res.checkMsg) + return + } + + if (!fs.statSync(dirPath).isDirectory()) { + cb.fail({ errMsg: `rmdir: fail no such directory, open: ${dirPath}` }) + return + } + + // recursive为false时,判断该目录下是否有文件 + if (!recursive) { + const filenames = fs.listFileSync(dirPath) + if (filenames.length) { + cb.fail({ errMsg: `rmdir: fail directory not empty` }) + return + } + } + + fs.rmdir(dirPath).then(() => { + console.debug('[AdvanceAPI] rmdir succeed') + cb.success({ errMsg: 'rmdir: ok' }) + }).catch((err) => { + console.error(`[AdvanceAPI] rmdir failed with error message: ${err.message}, error code: ${err.code}`) + cb.fail({ errMsg: 'rmdir: failed' }) + }) + } + + rmdirSync (dirPath, recursive) { + // 将非boolean类型的入参转换为boolean类型 + if (!checkDataType(recursive, false, 'boolean')) { + recursive = Boolean(recursive) + } + + const res = checkPathExistenceSync('rmdirSync', 'dirPath', dirPath) + if (!res.isValid) { + throw new Error(res.errMsg) + } + + // 判断路径是否存在,且不能是文件 + if (!fs.statSync(dirPath).isDirectory()) { + throw new Error(`rmdirSync: fail no such directory, open: ${dirPath}`) + } + + // recursive为false时 且该路径下仍有其他文件 + if (!recursive && (fs.listFileSync(dirPath).length > 0)) { + throw new Error(`rmdirSync: fail directory not empty`) + } + + try { + fs.rmdirSync(dirPath) + } catch (err) { + throw new Error(`rmdirSync: ${err.message}`) + } + } + + truncate ({ filePath, length, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + const res = checkPathExistence('truncate', 'filePath', filePath) + if (!res.isValid) { + cb.fail(res.checkMsg) + return + } + + // 判断filePath是文件还是目录 + const stat = fs.statSync(filePath) + if (stat.isDirectory()) { + cb.fail({ errMsg: `truncate: fail, illegal operation on a directory, open: ${filePath}` }) + return + } + + if (!checkDataType(length, true, 'number') || length < 0) { + length = DEFAULT_LENGTH // 非number类型 设为默认值DEFAULT_LENGTH ,DEFAULT_LENGTH=0 + } + + fs.truncate(filePath, length).then(() => { + console.debug('[AdvancedAPI] truncate: success, the read length is: %d', length) + cb.success({ errMsg: 'truncate: ok' }) + }).catch((err) => { + console.error(`[AdvancedAPI] truncate: fail with error message: ${err.message}, error code: ${err.code}`) + cb.fail({ errMsg: `truncate: failed with error message: ${err.message}, error code: ${err.code}` }) + }) + } + + truncateSync ({ filePath, length }) { + const res = checkPathExistenceSync('truncateSync', 'filePath', filePath) + if (!res.isValid) { + throw new Error(res.errMsg) + } + + if (fs.statSync(filePath).isDirectory()) { + throw new Error(`truncateSync: fail, illegal operation on a directory, open: ${filePath}`) + } + + if (!checkDataType(length, true, 'number') || length < 0) { + length = DEFAULT_LENGTH // 非number类型 设为默认值DEFAULT_LENGTH ,DEFAULT_LENGTH=0 + } + + try { + fs.truncateSync(filePath, length) + } catch (err) { + throw new Error(`truncateSync: ${err.message}`) + } + } + + /** + * 获取文件信息 + * @param {string} filePath - 本地文件路径 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + getFileInfo ({ filePath, success, fail, complete }) { + const cb = new FileCallback({ success, fail, complete }) + filePath = isSandboxPath(filePath) ? switchInternalToHapSandBox(filePath) : filePath + if (!filePath || !checkDataType(filePath, true, 'string')) { + cb.fail({ errMsg: 'getFileInfo:fail invalid filePath ' }) + return + } + if (!fs.accessSync(filePath)) { + cb.fail({ errMsg: 'getFileInfo: fail no such file or directory : ' + filePath }) + return + } + const stat = fs.statSync(filePath) + cb.success({ size: stat.size, errMsg: 'getFileInfo:ok ' }) + return + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/index.js new file mode 100644 index 0000000000..1fc7261e1d --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/index.js @@ -0,0 +1,212 @@ +import { context } from '../../../base/bridge/abilityBase' +import { FileioBase } from '../../../base/bridge/fileioBase' +import { SecurityBase } from '../../../base/bridge/securityBase' +import { getFdFromUriOrSandBoxPath, isSandboxPath, switchInternalToHapSandBox } from '../../util' +import FileSystemManager from './FileSystemManager' +import util from '@ohos.util' +import fileuri from '@ohos.file.fileuri' +import { ErrorCode } from '../../../base/util/ErrorCode' + +export default class ASFile { + constructor() { + this.DIGESTALGORITHM_VALUES = ['MD5', 'SHA1'] + // 文件保存路径:/data/storage/el2/base/haps/advancedDEMO/files/saveFiles + this.saveFileDir = context.filesDir + '/saveFiles' + this.fileSystemManager = new FileSystemManager() + this.init() + } + + init () { + try { + FileioBase.ohosMkdirSync(this.saveFileDir) + } catch (error) { + console.debug('[AdvancedAPI] %s 已存在', this.saveFileDir) + } + } + + /** + * 保存文件到本地 + * @param {string} tempFilePath - 需要保存的文件的临时路径 + * @param {function} success - 返回文件的保存路径,res = {savedFilePath: '文件的保存路径'} + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + saveFile (params) { + return new Promise(async (resolve, reject) => { + const { tempFilePath } = params + if (!tempFilePath) { + console.error('[AdvancedAPI] invalid tempFilePath.') + reject(['tempFilePath is required.', ErrorCode.PARAMETER_ERROR]) + return + } + try { + const fileName = tempFilePath.substr(tempFilePath.lastIndexOf('/')) + const fileType = fileName && fileName.split('.').pop() + let newFileName = new Date().getTime() + if (fileType) { + newFileName += `.${fileType}` + } + const fileUri = isSandboxPath(tempFilePath) ? + fileuri.getUriFromPath(switchInternalToHapSandBox(tempFilePath)) : tempFilePath + const fd = getFdFromUriOrSandBoxPath(fileUri) + const destPath = this.saveFileDir + '/' + newFileName // 保存路径 + FileioBase.ohosCopy(fd, destPath).then(() => { + console.debug('[AdvancedAPI] saveFile succeed') + resolve({ savedFilePath: destPath }) + }).catch((err) => { + console.error('[AdvancedAPI] saveFile failed with error message: ' + err.message + ', error code: ' + err.code) + reject([err.message, ErrorCode.IO_ERROR]) + }) + } catch (err) { + console.error('[AdvancedAPI] tempFilePath does not exist') + reject(['tempFilePath does not exist', ErrorCode.PARAMETER_ERROR]) + } + }) + } + + /** + * 获取本地已保存的文件列表 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + getSavedFileList () { + return new Promise((resolve, reject) => { + const dir = FileioBase.ohosOpendirSync(this.saveFileDir) + const fileList = [] + const dirent = dir.ohosReadsync() + for (let i = 0; i < dirent.length; i++) { + const filePath = `${this.saveFileDir}/${dirent[0]}` + const stat = FileioBase.ohosStatSync(filePath) + if (stat.isFile()) { + const fileItem = { + filePath: filePath, + createTime: stat.mtime, + size: stat.size + } + fileList.push(fileItem) + } + } + resolve({ fileList }) + }) + } + + /** + * 获取本地文件的文件信息。此接口只能用于获取已保存到本地的文件。 + * @param {string} filePath - 文件路径 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + getSavedFileInfo (params) { + return new Promise((resolve, reject) => { + const { filePath } = params + if (!filePath) { + console.error('[AdvancedAPI] filePath is required.') + reject(['filePath is required', ErrorCode.PARAMETER_ERROR]) + return + } + const fileUri = isSandboxPath(filePath) ? + fileuri.getUriFromPath(switchInternalToHapSandBox(filePath)) : filePath + const fd = getFdFromUriOrSandBoxPath(fileUri) + const stat = FileioBase.ohosStatSync(fd) + const fileInfo = { + createTime: stat.mtime, + size: stat.size, + errMsg: 'getSavedFileInfo:ok' + } + resolve(fileInfo) + }) + } + + /** + * 删除本地存储的文件。 + * @param {string} filePath - 文件路径 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + removeSavedFile (params) { + return new Promise((resolve, reject) => { + const { filePath } = params + if (!filePath) { + console.error('[AdvancedAPI] filePath is required.') + reject(['filePath is required', ErrorCode.PARAMETER_ERROR]) + return + } + try { + const destPath = isSandboxPath(filePath) ? switchInternalToHapSandBox(filePath) : filePath + FileioBase.ohosUnlinkSync(destPath) + resolve('success') + } catch (err) { + reject(['removeSavedFile is fail', ErrorCode.IO_ERROR]) + } + }) + } + + /** + * 获取文件信息 + * @param {string} filePath - 本地文件路径 + * @param {string} digestAlgorithm - 计算文件摘要的算法,可取值 md5、sha1。 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + getFileInfo (params) { + return new Promise((resolve, reject) => { + const { filePath } = params + let { digestAlgorithm = 'MD5' } = params + if (!filePath) { + console.error('[AdvancedAPI] filePath is required.') + reject(['filePath is required', ErrorCode.PARAMETER_ERROR]) + return + } + if (typeof digestAlgorithm === 'string') { + digestAlgorithm = digestAlgorithm.toUpperCase() + } + + if (!this.DIGESTALGORITHM_VALUES.includes(digestAlgorithm)) { + console.error('[AdvancedAPI] digestAlgorithm is invalid.') + digestAlgorithm = 'MD5' + } + try { + const fileUri = isSandboxPath(filePath) ? + fileuri.getUriFromPath(switchInternalToHapSandBox(filePath)) : filePath + const fd = FileioBase.ohosOpenSync(fileUri, 0o2).fd + const stat = FileioBase.ohosStatSync(fd) + const buf = new ArrayBuffer(stat.size) + FileioBase.ohosReadSync(fd, buf) + SecurityBase.rsa(digestAlgorithm, { data: new Uint8Array(buf) }).then(resultBuf => { + const textDecoder = new util.TextDecoder('utf-8', { ignoreBOM: true }) + resolve({ size: stat.size, digest: textDecoder.decodeWithStream(resultBuf, { stream: false }) }) + }) + } catch (err) { + console.error(`[AdvancedAPI] getFileInfo fail err = ${JSON.stringify(err)}`) + reject(['getFileInfo is fail', ErrorCode.IO_ERROR]) + } + }) + } + + /** + * 新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx。 + * @param {string} filePath - 文件路径,可通过 downFile 获得 + * @param {string} fileType - 文件类型,指定文件类型打开文件,有效值 doc, xls, ppt, pdf, docx, xlsx, pptx,支付宝小程序仅支持pdf + * @param {boolean} showMenu - 右上角是否有可以转发分享的功能,不支持 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + openDocument (params) { + return new Promise((resolve, reject) => { + // eslint-disable-next-line no-unused-vars + const { filePath, fileType, showMenu = false } = params + if (showMenu) { + console.error('[AdvancedAPI] showMenu do not support.') + } + }) + } + + getFileSystemManager () { + return this.fileSystemManager + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/util.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/util.js new file mode 100644 index 0000000000..986e683e21 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASFile/util.js @@ -0,0 +1,280 @@ +import fs from '@ohos.file.fs' +import { checkDataType } from '../../../base/util/checkDataType' + +const openMode = fs.OpenMode +const ERROR = { + PARAMETER_ERROR: 1001 +} + +export const modeReflect = { + 'ax': 'a', + 'ax+': 'a+', + 'wx': 'w', + 'wx+': 'w+' +} + +const ENCODING = [ + 'utf8', + 'utf-8', + 'ascii', + 'base64', + 'binary', + 'hex', + 'ucs2', + 'ucs-2', + 'utf16le', + 'utf-16le', + 'latin1', +] + +export function getOpenMode (flag) { + let mode + switch (flag) { + case 'a': + mode = openMode.CREATE | openMode.APPEND + break + case 'a+': + mode = openMode.CREATE | openMode.READ_WRITE | openMode.APPEND + break + case 'as': + mode = openMode.SYNC | openMode.CREATE | openMode.APPEND + break + case 'as+': + mode = openMode.SYNC | openMode.CREATE | openMode.READ_WRITE | openMode.APPEND + break + case 'r': + mode = openMode.READ_ONLY + break + case 'r+': + mode = openMode.READ_WRITE + break + case 'w': + mode = openMode.CREATE | openMode.WRITE_ONLY | openMode.TRUNC + break + case 'w+': + mode = openMode.CREATE | openMode.READ_WRIT | openMode.TRUNC + break + } + return mode +} + +// 获取文件的类型码并返回 +export function getFileTypeMode (stat) { + if (stat.isBlockDevice()) { + return 0o060000 + } + if (stat.isCharacterDevice()) { + return 0o020000 + } + if (stat.isDirectory()) { + return 0o040000 + } + if (stat.isFIFO()) { + return 0o010000 + } + if (stat.isFile()) { + return 0o100000 + } + if (stat.isSocket()) { + return 0o140000 + } + if (stat.isSymbolicLink()) { + return 0o120000 + } +} + +// 递归创建目录 +export function mkdirRecursive (path, dirNames) { + const curDirName = dirNames.shift() + if (!path && !curDirName) { + path = '' + } else { + path = path + '/' + curDirName + } + if (!curDirName) { + if (dirNames.length > 0) { + mkdirRecursive(path, dirNames) + } + return + } + + // 如果目录存在 + if (fs.accessSync(path)) { + if (dirNames.length > 0) { + mkdirRecursive(path, dirNames) + } + } else { + // 目录不存在 + fs.mkdirSync(path) + if (dirNames.length > 0) { + mkdirRecursive(path, dirNames) + } + } +} + +export function ohosMkdir (dirPath, cb) { + fs.mkdir(dirPath) + .then(() => { + cb.success({ errMsg: 'mkdir: ok' }) + }) + .catch((err) => { + cb.fail({ + errMsg: `mkdir: failed with error message: ${err.message}, error code: ${err.code}` + }) + }) +} + +// 获取目录路径 +export function obtainUpperPath (inputPath) { + const index = inputPath.lastIndexOf('/') + const upperPath = inputPath.substring(0, index) + return { index, upperPath } +} + +export function obtainFileName (inputPath) { + const index = inputPath.lastIndexOf('/') + let fileName = inputPath.substring(index) + + // 处理' ../test.txt/ '的情况 + if (inputPath.endsWith('/')) { + fileName = inputPath.substring(inputPath.lastIndexOf('/', inputPath.length - 2) + 1, inputPath.length - 1) + } + + return { index, fileName } +} + +export function checkFd (methodName, fd) { + let checkMsg = {} + const isValid = false + if (!checkDataType(fd, true, 'string')) { + checkMsg = { + errno: ERROR.PARAMETER_ERROR, + errMsg: `${methodName}: fail, invalid fd` + } + return { checkMsg, isValid } + } + + const transFdToNum = Number(fd) + if (fd === '' || isNaN(transFdToNum)) { + checkMsg = { errMsg: `${methodName}: fail, invalid fd` } + return { checkMsg, isValid } + } + return { isValid: true, fd: transFdToNum } +} + +export function checkFdSync (methodName, fd) { + const isValid = false + if (!checkDataType(fd, true, 'string')) { + return { + errMsg: `${methodName}: fail invalid fd`, + isValid + } + } + + const transFdToNum = Number(fd) + if (fd === '' || isNaN(transFdToNum)) { + return { + errMsg: `${methodName}: fail invalid fd`, + isValid + } + } + + return { isValid: true, fd: transFdToNum } +} + +export function checkEncoding (methodName, encoding) { + if (!encoding) { + return { isValid: true } + } + const isValid = false + if (!checkDataType(encoding, false, 'string')) { + const checkMsg = `${methodName}:fail invalid encoding: ${encoding}` + return { checkMsg, isValid } + } + if (!ENCODING.includes(encoding)) { + const checkMsg = `${methodName}:fail Unknown encoding: ${encoding}` + return { checkMsg, isValid } + } + return { isValid: true } +} + +// 检验路径的合法性:string 和 空串 +export function checkPath (methodName, pathName, path) { + let checkMsg = {} + const isValid = false + if (!checkDataType(path, true, 'string')) { + checkMsg = { + errno: ERROR.PARAMETER_ERROR, + errMsg: `${methodName}: fail, ${pathName} should be String instead of: ${typeof path}` + } + return { checkMsg, isValid } + } + + if (path === '') { + // eslint-disable-next-line no-useless-escape + checkMsg = { errMsg: `${methodName}: fail permission denied, open:\'\'` } + return { checkMsg, isValid } + } + + // 校验通过 + return { isValid: true } +} + +// 检验路径的合法性:string 、空串 、必须存在 +export function checkPathExistence (methodName, pathName, path) { + let checkMsg = {} + const isValid = false + if (!checkDataType(path, true, 'string')) { + checkMsg = { + errno: ERROR.PARAMETER_ERROR, + errMsg: `${methodName}: fail, ${pathName} should be String instead of: ${typeof path}` + } + return { checkMsg, isValid } + } + + if (path === '') { + // eslint-disable-next-line no-useless-escape + checkMsg = { errMsg: `${methodName}: fail permission denied, open:\'\'` } + return { checkMsg, isValid } + } + + // 判断srcPath路径是否存在 + if (!fs.accessSync(path)) { + checkMsg = { errMsg: `${methodName}: fail no such file or directory, open: ${path}` } + return { checkMsg, isValid } + } + // 校验通过 + return { isValid: true } +} + +export function checkPathSync (methodName, pathName, path) { + const isValid = false + if (path === '' || !checkDataType(path, true, 'string')) { + return { + errMsg: `${methodName}: failed, ${pathName} should be a non-empty string`, + isValid + } + } + + return { isValid: true } +} + +export function checkPathExistenceSync (methodName, pathName, path) { + const isValid = false + if (path === '' || !checkDataType(path, true, 'string')) { + return { + errMsg: `${methodName}: failed, ${pathName} should be a non-empty string`, + isValid + } + } + + // 判断Path是否存在 + if (!fs.accessSync(path)) { + return { + errMsg: `${methodName}: fail no such file or directory: ${path}`, + isValid + } + } + + return { isValid: true } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASGyroscope/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASGyroscope/index.js new file mode 100644 index 0000000000..f29f5b557c --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASGyroscope/index.js @@ -0,0 +1,68 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: Advanced API gyroscope + * Author: 00430169 + * Create: 7/4/2023 + * Notes: N/A + */ + +import { OhosSensorBase } from '../../../base/bridge/sensorBase' +import { ErrorCode } from '../../../base/util/ErrorCode' + +const intervalType = [ + { label: 'game', value: 20000000 }, + { label: 'ui', value: 60000000 }, + { label: 'normal', value: 200000000 } +] + +export default class ASGyroscope { + constructor () { + this.callBackGyroscopeSet = new Set() + } + + onGyroscopeChange (callback) { + return new Promise((resolve, reject) => { + if (typeof callback !== 'function') { + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + return + } + if (this.callBackGyroscopeSet.has(callback)) { + reject('param is invalid.', ErrorCode.PARAMETER_ERROR) + } else { + this.callBackGyroscopeSet.add(callback) + resolve() + } + }) + } + + startGyroscope (object = {}) { + return new Promise((resolve, reject) => { + let value = intervalType.find(i => i.label === 'normal').value + if (object.interval && typeof object.interval === 'string') { + const target = intervalType.find(i => i.label === object.interval) + if (target) { + value = target.value + } + } + + OhosSensorBase.ohosSubscribeGyroscope({ intervalValue: value, callback: (data) => { + const res = { + x: data.x, + y: data.y, + z: data.z + } + for (const cb of this.callBackGyroscopeSet.keys()) { + cb(res) + } + } }) + resolve() + }) + } + + stopGyroscope () { + return new Promise((resolve, reject) => { + OhosSensorBase.ohosUnsubscribeGyroscope() + resolve() + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASImage/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASImage/index.js new file mode 100644 index 0000000000..edce1381cb --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASImage/index.js @@ -0,0 +1,345 @@ +import { ErrorCode } from '../../../base/util/ErrorCode' +import { FileioBase } from '../../../base/bridge/fileioBase' +import { MediaLibraryBase } from '../../../base/bridge/mediaLibraryBase' +import { WantConstantBase } from '../../../base/bridge/wantConstantBase' +import { context } from '../../../base/bridge/abilityBase' +import { + isFileUri, + getFdFromUriOrSandBoxPath, + getFileAssetFromUri, + isSandboxPath, + switchInternalToHapSandBox, + saveMedia, +} from '../../util/index' +import bundleManager from '@ohos.bundle.bundleManager' +import image from '@ohos.multimedia.image' +import { Base64 } from 'js-base64' +import picker from '@ohos.file.picker' +import fs from '@ohos.file.fs' +import photoAccessHelper from '@ohos.file.photoAccessHelper' +import fileUri from '@ohos.file.fileuri' + +// 启动图库模式 +// eslint-disable-next-line no-unused-vars +const PHOTO = { + SINGLE: 'singleselect', + MULTIPLE: 'multipleselect', + PREVIEW: 'photodetail', +} + +// eslint-disable-next-line no-unused-vars +const ORI = { + 0: 'up', + 90: 'right', + 180: 'down', + 270: 'left', +} + +// eslint-disable-next-line no-unused-vars +const MEDIATYPE = ['FILE', 'IMAGE', 'VIDEO', 'AUDIO'] +export default class ASImage { + chooseImage(params) { + if (!params) { + params = {} + } + return new Promise(async (resolve, reject) => { + const permission = await MediaLibraryBase.getPermissions() + if (permission.perNum === -1) { + return reject(['permission fail', ErrorCode.USER_REJECT, permission.perNum, permission.dialogShownResults]) + } + if (params.count && typeof (params.count) !== 'number') { + return reject(['chooseImage:fail parameter `count`. Expected Number with value NaN, ' + + 'got String with value "' + params.count + '".', ErrorCode.PARAMETER_ERROR]) + } + if (params.count < 1) { + params.count = 9 + } + let uris = [] + if (params.sourceType && params.sourceType.length === 1 && params.sourceType.includes('camera')) { + // 单独指定使用相机 + const info = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT) + const data = await context.startAbilityForResult({ + action: WantConstantBase.getAction('ACTION_IMAGE_CAPTURE'), + parameters: { + uri: 'capture', + callBundleName: info.name, + }, + }) + if (data.resultCode === 0) { + uris = [data.want.parameters.resourceUri] + if (!data.want.parameters.resourceUri) { + return + } + } else { + return reject(['Failed to pull up camera app', ErrorCode.SERVICE_UNAVIALABLE]) + } + } else { + // 拉去图库应用 + const PhotoSelectOptions = new picker.PhotoSelectOptions() + PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE + PhotoSelectOptions.maxSelectNumber = params.count + const photoPicker = new picker.PhotoViewPicker() + const photoSelectResult = await photoPicker.select(PhotoSelectOptions) + uris = photoSelectResult.photoUris + } + + if (!uris) { + return reject(['get uri fail', ErrorCode.SERVICE_UNAVIALABLE]) + } else if (uris === 'cancel') { + // 取消时不触发success和fail + return + } + + const tempFilePaths = [] + const tempFiles = [] + for (let i = 0; i < uris.length; i++) { + let compress + if (params.sizeType && params.sizeType.length === 1 && params.sizeType.includes('compressed')) { + compress = await this.compressImage({ src: uris[i] }) + if (compress.tempFilePath) { + tempFilePaths.push(compress.tempFilePath) + tempFiles.push({ + path: compress.tempFilePath, + size: compress.tempSize, + name: compress.tempName, + type: compress.tempFilePath.split('.').pop(), + }) + } + } else { + const asset = await getFileAssetFromUri(uris[i]) + tempFilePaths.push(uris[i]) + tempFiles.push({ + path: uris[i], + size: asset.size, + name: asset.displayName, + type: asset.displayName.split('.').pop(), + }) + } + } + return resolve({ + tempFilePaths, tempFiles, + }) + }) + } + + getImageInfo(params) { + return new Promise(async (resolve, reject) => { + try { + const ORI = { + 0: 'up', + 90: 'right', + 180: 'down', + 270: 'left', + } + const uri = params.src + if (isFileUri(uri)) { + const asset = await getFileAssetFromUri(uri) + const orientation = ORI[asset.orientation] + return resolve({ + width: asset.width, + height: asset.height, + path: uri, + orientation, + type: asset.displayName.split('.').pop(), + }) + } else if (isSandboxPath(uri)) { + const imageSourceApi = image.createImageSource(switchInternalToHapSandBox(uri)) + const orientation = 'up' + const type = uri.split('.').pop() + const imageInfo = await imageSourceApi.getImageInfo() + return resolve({ + width: imageInfo.size.width, + height: imageInfo.size.height, + path: params.src, + orientation, + type, + }) + } else { + return reject(['get uri fail', ErrorCode.SERVICE_UNAVIALABLE]) + } + } catch (err) { + return reject(['get uri fail', ErrorCode.SERVICE_UNAVIALABLE]) + } + }) + } + + saveImageToPhotosAlbum(params) { + return new Promise(async (resolve, reject) => { + try { + const filePath = params.filePath + if (typeof filePath !== 'string') { + return reject(['filePath format is not supported.', ErrorCode.PARAMETER_ERROR]) + } + if (isFileUri(filePath)) { + const uri = filePath + const fd = getFdFromUriOrSandBoxPath(uri) + const stat = fs.statSync(fd) + const size = stat.size + const buf = new ArrayBuffer(size) + FileioBase.ohosReadSync(fd, buf) + const fileAsset = await getFileAssetFromUri(uri) + const displayName = 'IMAGE_' + new Date().getTime() + '_' + fileAsset.displayName + // uri = fileUri.getUriFromPath(uri) + const imageUri = await saveMedia(photoAccessHelper.PhotoType.IMAGE, displayName, uri, buf) + resolve({ path: imageUri }) + return + } else if (isSandboxPath(filePath)) { + let uri = filePath + // 对于internal开头的路径,需要转换 + if (uri.startsWith('internal://')) { + uri = switchInternalToHapSandBox(filePath) + } + if (!fs.accessSync(uri)) { + reject(['saveImageToPhotosAlbum fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + return + } + const file = fs.openSync(uri, fs.OpenMode.READ_ONLY) + if (!file) { + reject(['saveImageToPhotosAlbum fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + return + } + const fd = file.fd + // 根据文件大小定义空arrayBuffer用来写入文件 + const stat = fs.statSync(uri) + const size = stat.size + const buf = new ArrayBuffer(size) + // 读取传入文件信息到缓冲区 + FileioBase.ohosReadSync(fd, buf) + // 获取文件显示名 + let displayName = 'IMAGE_' + new Date().getTime() + '_' + uri.split('/').splice(-1, 1).toString() + // 对于internal这种有可能结尾不带.jpg的情况,需要加上.jpg + if (!displayName.includes('.')) { + displayName += '.jpg' + } + // 获取file://应用沙箱路径 + uri = fileUri.getUriFromPath(uri) + const imageUri = await saveMedia(photoAccessHelper.PhotoType.IMAGE, displayName, uri, buf) + resolve({ path: imageUri }) + return + } else if (filePath.startsWith('data:image/')) { + const base64Array = filePath.split(';') + if (base64Array.length === 2 && base64Array[1].startsWith('base64')) { + const imageType = base64Array[0].replace('data:image/', '') + const imageData = Base64.atob(filePath.split(',')[1]) + const displayName = 'IMAGE_' + new Date().getTime() + '.' + imageType + const arrayBuffer = new ArrayBuffer(imageData.length) + const ia = new Uint8Array(arrayBuffer) + for (let i = 0; i < imageData.length; i++) { + ia[i] = imageData.charCodeAt(i) + } + // 获取file://应用沙箱路径 + const uri = fileUri.getUriFromPath(filePath) + const imageUri = await saveMedia(photoAccessHelper.PhotoType.IMAGE, displayName, uri, ia.buffer) + resolve({ path: imageUri }) + return + } + } + reject(['filePath format is not supported.', ErrorCode.PARAMETER_ERROR]) + } catch (error) { + console.error(`[AdvancedAPI] saveImageToPhotosAlbum is fail!errMsg:${JSON.stringify(error)}`) + } + }) + } + + /** + * 图片压缩 现在支持两种路径,沙箱路径或者公共文件URI,输出的是沙箱路径的临时文件目录 + * @param params + * @returns {Promise} + */ + compressImage(params) { + return new Promise(async (resolve, reject) => { + const src = switchInternalToHapSandBox(params.src) + const fileName = src.split('/').pop() || '' + const suffix = fileName.indexOf('.') >= 0 ? (params.src.toLowerCase().split('.').pop() || 'jpg') : 'jpg' + let quality = params.quality || 80 + const permission = await MediaLibraryBase.getPermissions() + if (permission.perNum === -1) { + return reject(['permission fail', ErrorCode.USER_REJECT, permission.perNum, permission.dialogShownResults]) + } + if (quality && typeof (quality) !== 'number') { + return reject(['compressImage fail, input parameter quality is illegal.', ErrorCode.PARAMETER_ERROR]) + } + if (quality > 100 || quality < 0) { + quality = 80 + } + try { + let fd + const supportTypes = ['jpg', 'png', 'webp', 'jpeg'] + if (isSandboxPath(src)) { + if (!fs.accessSync(src)) { + reject(['compressImage fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + return + } + const file = fs.openSync(src, fs.OpenMode.READ_ONLY) + if (!file) { + reject(['compressImage fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + return + } + fd = file.fd + } else if (isFileUri(src)) { + fd = getFdFromUriOrSandBoxPath(src) + } + if (supportTypes.includes(suffix)) { + const arrayBuf = await this.getArrayBuffer(quality, fd, suffix, params.compressHeight, params.compressedWidth) + const dirName = new Date().getTime() + const jpgName = 'IMAGE_' + dirName + const tmpPath = context.tempDir + '/' + dirName + '/' + jpgName + '.' + `${params.src.toLowerCase().split('.').pop()}` + let size + try { + await fs.mkdir(context.tempDir + '/' + dirName) + fs.openSync(tmpPath, fs.OpenMode.CREATE) + const fileOpen = fs.openSync(tmpPath, fs.OpenMode.READ_WRITE) + FileioBase.ohosWriteSync(fileOpen.fd, arrayBuf) + // 获取临时文件的大小 + const tempFile = fs.openSync(tmpPath, fs.OpenMode.READ_ONLY) + const stat = fs.statSync(tempFile.fd) + size = stat.size + fs.closeSync(fileOpen) + } catch (error) { + console.info(`${JSON.stringify(error)}`) + } + resolve({ + tempFilePath: tmpPath, + tempSize: size, + tempName: jpgName, + }) + } + } catch (error) { + reject(['compressImage fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + } + }) + } + + getArrayBuffer = async (quality, fd, suffix, height, width) => { + if (height !== undefined || width !== undefined) { + const widthSize = width || height || 0 + const imageSourceApi = image.createImageSource(fd) + const imagePackerApi = image.createImagePacker() + const imageInfo = await imageSourceApi.getImageInfo() + const rate = imageInfo.size.width / width + const pixelMap = await imageSourceApi.createPixelMap({ + desiredSize: { + width: widthSize, + // height: heightSize + height: imageInfo.size.height / rate // width和height必须同时存在,只有width时,compressedWidth和compressHeight不奏效 + } + }) + const packOpts = { format: `image/jpeg`, quality } + const arrayBuf = await imagePackerApi.packing(pixelMap, packOpts) + return arrayBuf + } else { + const imageSourceApi = image.createImageSource(fd) // 创建图片源实例 + const imagePackerApi = image.createImagePacker() // 创建ImagePacker实例 + const packOpts = { format: `image/jpeg`, quality } // format目标格式 + const imageInfo = await imageSourceApi.getImageInfo() + const pixelMap = await imageSourceApi.createPixelMap({ + desiredSize: { + width: imageInfo.size.width, + height: imageInfo.size.height + } + }) + const arrayBuf = await imagePackerApi.packing(pixelMap, packOpts) + return arrayBuf + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASInterceptor/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASInterceptor/index.js new file mode 100644 index 0000000000..54a390fd27 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASInterceptor/index.js @@ -0,0 +1,131 @@ +export default class ASInterceptor { + constructor () { + this.apiLists = {} + this.globals = [] + } + + checkApiName (apiName) { + if (apiName === 'addInterceptor' + || apiName === 'removeInterceptor') { + return false + } + return true + } + + invoke (apiName, args) { + // 1. 触发全局拦截器 + this.globals.forEach(option => { + const invoke = option.invoke + if (typeof invoke === 'function') { + invoke(...args) + } + }) + // 2. 触发api拦截器 + const apiOptions = this.apiLists[apiName] || [] + apiOptions.forEach(option => { + const invoke = option.invoke + if (typeof invoke === 'function') { + invoke(...args) + } + }) + } + + success (apiName, args) { + const tasks = [] + // 1. 触发全局拦截器 + this.globals.forEach(option => { + const success = option.success + if (typeof success === 'function') { + tasks.push(success) + } + }) + // 2. 触发api拦截器 + const apiOptions = this.apiLists[apiName] || [] + apiOptions.forEach(option => { + const success = option.success + if (typeof success === 'function') { + tasks.push(success) + } + }) + + if (tasks.length) { + const methodArgs = args && JSON.parse(JSON.stringify(args)) + tasks.forEach(task => { + task(...methodArgs) + }) + return methodArgs + } + } + + fail (apiName, args) { + const tasks = [] + // 1. 触发全局拦截器 + this.globals.forEach(option => { + const fail = option.fail + if (typeof fail === 'function') { + tasks.push(fail) + } + }) + // 2. 触发api拦截器 + const apiOptions = this.apiLists[apiName] || [] + apiOptions.forEach(option => { + const fail = option.fail + if (typeof fail === 'function') { + tasks.push(fail) + } + }) + + if (tasks.length) { + const methodArgs = args && JSON.parse(JSON.stringify(args)) + tasks.forEach(task => { + task(...methodArgs) + }) + return methodArgs + } + } + + complete (apiName, args) { + const tasks = [] + // 1. 触发全局拦截器 + this.globals.forEach(option => { + const complete = option.complete + if (typeof complete === 'function') { + tasks.push(complete) + } + }) + // 2. 触发api拦截器 + const apiOptions = this.apiLists[apiName] || [] + apiOptions.forEach(option => { + const complete = option.complete + if (typeof complete === 'function') { + tasks.push(complete) + } + }) + + if (tasks.length) { + const methodArgs = args && JSON.parse(JSON.stringify(args)) + tasks.forEach(task => { + task(...methodArgs) + }) + return methodArgs + } + } + + returnValue (apiName, args) { + // 1. 触发全局拦截器 + this.globals.forEach(option => { + const returnValue = option.returnValue + if (typeof returnValue === 'function') { + returnValue(args) + } + }) + // 2. 触发api拦截器 + const apiOptions = this.apiLists[apiName] || [] + apiOptions.forEach(option => { + const returnValue = option.returnValue + if (typeof returnValue === 'function') { + returnValue(args) + } + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASKeyboard/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASKeyboard/index.js new file mode 100644 index 0000000000..853a536913 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASKeyboard/index.js @@ -0,0 +1,112 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced keyboard api + * Create: 04/10/2023 + * Notes: + */ +import inputMethod from '@ohos.inputMethod' +import window from '@ohos.window' +import { DisplayBase } from '../../../base/bridge/displayBase' + +// AS API class +export default class ASKeyboard { + /** + * constructor function, init callback map + */ + constructor () { + this.changeCallback = new Map() + } + + /** + * hide software keyboard + * need system permission ohos.permission.CONNECT_IME_ABILITY + */ + hideKeyboard() { + return new Promise((resolve, reject) => { + try { + const inputMethodController = inputMethod.getController() + inputMethodController.hideTextInput().then(() => { + console.debug('[AdvancedAPI] Succeeded in hiding softKeyboard.') + resolve() + }).catch((err) => { + console.error('[AdvancedAPI] Failed to hideSoftKeyboard: ' + JSON.stringify(err)) + reject() + }) + } catch (exception) { + console.error('[AdvancedAPI] Failed to get inputMethod Controller. Cause: ' + JSON.stringify(exception)) + reject() + } + }) + } + + /** + * subscribe keyboard height change event + * Callback + * @obj params height {Number}: keyboard height + */ + onKeyboardHeightChange(callback) { + if (!callback) { + console.error('[AdvancedAPI] params illegal, empty callback') + return + } + + try { + window.getLastWindow(globalThis.abilityContext).then((data) => { + this.windowClass = data + const { + densityPixels: devicePixelRatio, + } = DisplayBase.ohosGetDisplay() + + const heightChangeCallback = function (data) { + // ohos notify twice when keyboard popup + callback({ height: Math.round(data / devicePixelRatio) }) + } + if (!this.changeCallback.has(callback)) { + this.changeCallback.set(callback, heightChangeCallback) + } + console.info('[AdvancedAPI] Succeeded in obtaining the top window. Listen to keyboard height change') + try { + this.windowClass.on('keyboardHeightChange', this.changeCallback.get(callback)) + } catch (exception) { + console.error('[AdvancedAPI] Failed to enable the listener for keyboard height changes. Cause: ' + JSON.stringify(exception)) + } + }).catch((err) => { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(err)) + }) + } catch (exception) { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(exception)) + } + } + + /** + * unsubscribe keyboard height change event + * remove all if callback is null, otherwise remove the specialized callback + */ + offKeyboardHeightChange(callback) { + try { + window.getLastWindow(globalThis.abilityContext).then((data) => { + this.windowClass = data + console.info('[AdvancedAPI] Succeeded in obtaining the top window. Unsubscribe keyboard change event.') + try { + if (callback) { + if (this.changeCallback.has(callback)) { + this.windowClass.off('keyboardHeightChange', this.changeCallback.get(callback)) + this.changeCallback.delete(callback) + } else { + console.info('[AdvancedAPI] Invalid callback.') + } + } else { + this.windowClass.off('keyboardHeightChange') + this.changeCallback.clear() + } + } catch (exception) { + console.error('[AdvancedAPI] Failed to unregister callback. Cause: ' + JSON.stringify(exception)) + } + }).catch((err) => { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(err)) + }) + } catch (exception) { + console.error('[AdvancedAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(exception)) + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASLocation/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASLocation/index.js new file mode 100644 index 0000000000..aebfa05093 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASLocation/index.js @@ -0,0 +1,189 @@ +import { AbilityBase, context } from '../../../base/bridge/abilityBase' +import abilityAccessCtrl from '@ohos.abilityAccessCtrl' +import geoLocationManager from '@ohos.geoLocationManager' +import mapCommon from '@hms.core.map.mapCommon' +import map from '@hms.core.map.map' +import wantAgent from '@ohos.app.ability.wantAgent' +import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager' +import { ErrorCode } from '../../../base/util/ErrorCode' +import Result from '../../../base/util/Result' + +export default class ASLocation { + constructor () { + this.locationChangeCallbacks = [] + this.locationChangeErrorCallback = (location, err) => {} + this.bothCallback = (location, err) => { + if (err) { + this.locationChangeErrorCallback({ + errMsg: err[2].arguments[0], errCode: err[2].arguments[1] + }) + } else { + for (let i = 0; i < this.locationChangeCallbacks.length; i++) { + this.locationChangeCallbacks[i].invokeAndKeepAlive(Result.success(location)) + } + } + } + } + + getLocation(params) { + console.debug('[AdvancedAPI] start ASLocation getLocation') + let permissions = ['ohos.permission.APPROXIMATELY_LOCATION'] + if (params?.isHighAccuracy) { + permissions = ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION'] + } + const atManager = abilityAccessCtrl.createAtManager() + return atManager.requestPermissionsFromUser(context, permissions).then((data) => { + const grantStatus = data.authResults + const dialogShownResults = data.dialogShownResults + const length = grantStatus.length + for (let i = 0; i < length; i++) { + if (grantStatus[i] !== 0 && data.permissions[i] === 'ohos.permission.APPROXIMATELY_LOCATION') { + return Promise.reject(['Permissions check failed,auth deny', ErrorCode.USER_REJECT, grantStatus[0], dialogShownResults[0]]) + } + } + + let requestInfo = { 'priority': 0x203, 'scenario': 0x300, 'maxAccuracy': 0 } + if (params?.highAccuracyExpireTime) { + requestInfo = { 'priority': 0x203, 'scenario': 0x300, 'maxAccuracy': 0, timeoutMs: params.highAccuracyExpireTime } + } + try { + return geoLocationManager.getCurrentLocation(requestInfo).then((result) => { + console.debug('[AdvancedAPI] current location: %s', JSON.stringify(result)) + if (params?.type === 'gcj02') { + const wgs84Position = { + latitude: result.latitude, + longitude: result.longitude + } + return map.convertCoordinate(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02, wgs84Position).then((gcj02Position) => { + result.latitude = gcj02Position.latitude + result.longitude = gcj02Position.longitude + return Promise.resolve(result) + }).catch((error) => { + console.debug('[AdvancedAPI] promise, convertCoordinate: error= %s', JSON.stringify(error)) + return Promise.reject([[error.message, ErrorCode.SERVICE_UNAVIALABLE]]) + }) + } else { + return Promise.resolve(result) + } + }) + .catch((error) => { + console.debug('[AdvancedAPI] promise, getCurrentLocation: error= %s', JSON.stringify(error)) + return Promise.reject([[error.message, ErrorCode.SERVICE_UNAVIALABLE]]) + }) + } catch (error) { + console.error('[AdvancedAPI] errCode:' + error.code + ',errMessage:' + error.message) + return Promise.reject([[error.message, ErrorCode.SERVICE_UNAVIALABLE]]) + } + }) + } + onLocationChange(callback) { + console.debug('[AdvancedAPI] start ASLocation onLocationChange') + this.locationChangeCallbacks.push(callback) + } + offLocationChange(callback) { + console.debug('[AdvancedAPI] start ASLocation offLocationChange') + if (callback) { + const index = this.locationChangeCallbacks.indexOf(callback) + if (index >= 0) { + this.locationChangeCallbacks.splice(index, 1) + } + } else { + this.locationChangeCallbacks = [] + } + } + onLocationChangeError(callback) { + console.debug('[AdvancedAPI] start ASLocation onLocationChangeError') + this.locationChangeErrorCallback = callback + } + offLocationChangeError() { + console.debug('[AdvancedAPI] start ASLocation offLocationChangeError') + this.locationChangeErrorCallback = (location, err) => {} + } + startLocationUpdate() { + console.debug('[AdvancedAPI] start ASLocation startLocationUpdate') + const permissions = ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION'] + const atManager = abilityAccessCtrl.createAtManager() + try { + return atManager.requestPermissionsFromUser(context, permissions).then((data) => { + const grantStatus = data.authResults + const length = grantStatus.length + for (let i = 0; i < length; i++) { + if (grantStatus[i] !== 0 && data.permissions[i] === 'ohos.permission.APPROXIMATELY_LOCATION') { + return Promise.reject([['Permissions check failed,auth deny', ErrorCode.USER_REJECT]]) + } + } + const requestInfo = { 'priority': 0x203, 'scenario': 0x300, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0 } + try { + geoLocationManager.on('locationChange', requestInfo, this.bothCallback) + return Promise.resolve('SUCCESS') + } catch (error) { + return Promise.reject([[error.message, error.code]]) + } + }) + } catch (err) { + return Promise.reject([['startLocationUpdate failed', ErrorCode.COMMON_ERROR]]) + } + } + startLocationUpdateBackground() { + console.debug('[AdvancedAPI] start ASLocation startLocationUpdateBackground') + const permissions = ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION', 'ohos.permission.LOCATION_IN_BACKGROUND'] + const atManager = abilityAccessCtrl.createAtManager() + try { + return atManager.requestPermissionsFromUser(context, permissions).then((data) => { + const grantStatus = data.authResults + const length = grantStatus.length + for (let i = 0; i < length; i++) { + if (grantStatus[i] !== 0 + && (data.permissions[i] === 'ohos.permission.APPROXIMATELY_LOCATION' + || data.permissions[i] === 'ohos.permission.LOCATION_IN_BACKGROUND')) { + return Promise.reject([['Permissions check failed,auth deny', ErrorCode.USER_REJECT]]) + } + } + AbilityBase.getAbilityInfo().then(abilityInfo => { + const wantAgentInfo = { + wants: [ + { + bundleName: abilityInfo.bundleName, + abilityName: abilityInfo.name + } + ], + operationType: wantAgent.OperationType.START_ABILITY, + requestCode: 0, + wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] + } + // use WantAgent to notify + wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj) => { + return backgroundTaskManager.startBackgroundRunning(context, backgroundTaskManager.BackgroundMode.LOCATION, wantAgentObj) + }).then(() => { + console.debug('[AdvancedAPI] start bg operation succeeded') + }).catch((err) => { + console.error('[AdvancedAPI] start bg operation failed Cause: ' + err) + }) + }) + const requestInfo = { 'priority': 0x203, 'scenario': 0x300, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0 } + try { + geoLocationManager.on('locationChange', requestInfo, this.bothCallback) + return Promise.resolve('SUCCESS') + } catch (error) { + return Promise.reject([[error.message, error.code]]) + } + }) + } catch (err) { + return Promise.reject([['startLocationUpdateBackground failed', ErrorCode.COMMON_ERROR]]) + } + } + stopLocationUpdate(params) { + console.debug('[AdvancedAPI] start ASLocation stopLocationUpdate') + backgroundTaskManager.stopBackgroundRunning(context).then(() => { + console.debug('[AdvancedAPI] stop operation succeeded') + }).catch((err) => { + console.error('[AdvancedAPI] stop operation fail cause: ' + JSON.stringify(err)) + }) + try { + geoLocationManager.off('locationChange') + return Promise.resolve('SUCCESS') + } catch (err) { + return Promise.reject([['stopLocationUpdate failed', ErrorCode.COMMON_ERROR]]) + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASPhone/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASPhone/index.js new file mode 100644 index 0000000000..0c4254b682 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASPhone/index.js @@ -0,0 +1,13 @@ +import call from '@ohos.telephony.call' +import { ErrorCode } from '../../../base/util/ErrorCode' +export default class ASPhone { + makePhoneCall(number) { + if (!number || !number.phoneNumber || (typeof number.phoneNumber !== 'string') || number === '') { + return new Promise((resolve, reject) => { + reject(['param is invalid.', ErrorCode.PARAMETER_ERROR]) + }) + } + const promise = call.makeCall(number.phoneNumber) + return promise + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRequest/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRequest/index.js new file mode 100644 index 0000000000..7b2724e690 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRequest/index.js @@ -0,0 +1,739 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + * Description: advanced request api + * Create: 04/01/2023 + * Notes: Permissions: ohos.permission.INTERNET + */ +import http from '@ohos.net.http' +import request from '@ohos.request' +import { pathToCache, switchInternalToHapSandBox } from '../../util' +import { arrayBufferToBase64 } from '../../as/base/arrayBuffer2Base64' + +// Http errCode +const errMsgMap = new Map([ + [401, 'Parameter error'], + [201, 'Permission denied'], + [2300003, 'URL using bad/illegal format or missing URL'], + [2300006, 'Could not resolve host name'], + [2300007, 'Couldn not connect to server'], + [2300009, 'Access denied to remote resource'], + [2300023, 'Failed writing received data to disk/application'], + [2300025, 'Upload failed'], + [2300026, 'Failed to open/read local data from file/application'], + [2300028, 'Timeout was reached'], + [2300073, 'Remote file already exists'], + [2300078, 'Remote file not found'], + [2300999, 'Unknown Other Error'] +]) + +// AS API class +export default class ASRequest { + /** + * make a network request + * Required + * @object params url {String}: server address + * Optional + * @object params data {Object|String|ArrayBuffer}: request params + * @object params header {Object}: HTTP request Header + * @object params method {String}: support OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT, default is GET + * @object params timeout {Number}: timeout time, default is 60000 + * @object params dataType {String}: data type, default is json (ohos not support) + * @object params responseType {String}: response data type, text or arraybuffer, default is text + * @object params sslVerify {Boolean}: verify ssl certificate, default is true (ohos not support) + * @object params withCredentials {Boolean}: cross-domain requests with credentials, default is false (ohos not support) + * @object params firstIpv4 {Boolean}: use ipv4 first when DNS resolution, default is false (ohos not support) + * @object params enableHttp2 {Boolean}: enable http2, default is false (ohos not support) + * @object params enableQuic {Boolean}: enable quic, default is false (ohos not support) + * @object params enableCache {Boolean}: enable cache, default is false + * @object params enableHttpDNS {Boolean}: enable HttpDNS service with httpDNSServiceId, default is false (ohos not support) + * @object params httpDNSServiceId {String}: httpDNS service provider ID (ohos not support) + * @object params enableChunked {Boolean}: enable transfer-encoding chunked, default is false (ohos not support) + * @object params forceCellularNetwork {Boolean}: Use mobile network under wifi, default is false (ohos not support) + * @object params enableCookie {Boolean}: can edit cookies in headers if enabled, default is false (ohos not support) + * @object params defer {Boolean}: data type, default is false (ohos not support) + * @object params cloudCache {Object|Boolean}: enable cloud acceleration, default is false (ohos not support) + * @object params success {Function}: success callback + * @object params fail {Function}: fail callback + * @object params complete {Function}: complete callback + * Callback + * @success params data {Object|String|ArrayBuffer}: data returned by server + * @success params statusCode {Number}: status code returned by server + * @success params header {Object}: HTTP Response Header returned by server + * @success params cookies {Array.}: cookies returned by server + * + * @returns {requestTask|Promise} : return requestTask if has callback otherwise return promise (handled in interface class) + */ + request(object) { + console.debug('[AdvancedAPI] ASRequest request') + return new RequestTask(object) + } + + /** + * request to upload files + * Required + * @object params url {String}: server address + * Required Optional 1 + * @object params files {Array}: upload files list, file object include name{String}, file{File}, uri{String} + * Required Optional 2 + * @object params filePath {String}: upload file path + * @object params name {String}: upload file key + * Optional + * @object params fileType {String}: file type, image/video/audio (ohos not support) + * @object params file {File}: upload file object (ohos not support) + * @object params header {Object}: HTTP request Header + * @object params timeout {Number}: timeout time (ohos not support) + * @object params formData {Object}: extra form data + * @object params success {Function}: success callback + * @object params fail {Function}: fail callback + * @object params complete {Function}: complete callback + * Callback + * @success params data {String}: data returned by server (ohos not support) + * @success params statusCode {Number}: status code returned by server, 200 for HTTP OK (ohos not support) + * + * @returns {uploadTask|Promise} : return uploadTask if has callback otherwise return promise (handled in interface class) + * + * Note + * ohos only support internal:// uri + */ + uploadFile(object) { + console.debug('[AdvancedAPI] ASRequest uploadFile : %s', JSON.stringify(object)) + return new UploadTask(object) + } + + /** + * request to download files + * Required + * @object params url {String}: file server address + * Optional + * @object params header {Object}: HTTP request Header + * @object params timeout {Number}: timeout time (ohos not support) + * @object params success {Function}: success callback + * @object params fail {Function}: fail callback + * @object params complete {Function}: complete callback + * @object params filePath {String}: specialized the local storage path (ohos required) + * Callback + * @success params tempFilePath {String}: temp file storage path + * @success params statusCode {Number}: status code returned by server, 200 for HTTP OK + * + * @returns {downloadTask|Promise} : return downloadTask if has callback otherwise return promise (handled in interface class) + */ + downloadFile(object) { + console.debug('[AdvancedAPI] ASRequest downloadFile %s', JSON.stringify(object)) + return new DownloadTask(object) + } +} + +// RequestTask class +class RequestTask { + /** + * constructor function, create http request + * Required + * @object params url {String}: server address + * Optional + * @object params data {Object|String|ArrayBuffer}: request params + * @object params header {Object}: HTTP request Header + * @object params method {String}: support OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT, default is GET + * @object params timeout {Number}: timeout time, default is 60000 + * @object params responseType {String}: response data type, text or arraybuffer, default is text + * @object params enableCache {Boolean}: enable cache, default is false + * @object params success {Function}: success callback + * @object params fail {Function}: fail callback + * @object params complete {Function}: complete callback + * Callback + * @success params data {Object|String|ArrayBuffer}: data returned by server + * @success params statusCode {Number}: status code returned by server, 200 for HTTP OK + * @success params header {Object}: HTTP Response Header returned by server + * @success params cookies {Array.}: cookies returned by server + */ + constructor(object) { + const { url, header, method = 'GET', timeout, responseType, enableCache } = object || {} + let { data } = object || {} + const { success, fail, complete } = object || {} + + this.abortFlag = false + this.fail = fail + this.complete = complete + this.httpRequest = http.createHttp() + this.headersCallback = new Map() + + if (!object) { + console.error('[AdvancedAPI] request error: params illegal') + return + } + + let isFormUrlEncoded = false + for (const key in header) { + if (key.toLowerCase() === 'content-type') { + if (header[key].toLowerCase().includes('application/x-www-form-urlencoded')) { + isFormUrlEncoded = true + } + break + } + } + + // data为Object类型时,属性的值类型如果是number, request请求时信息会丢失. 故将data转成string类型进行规避 + if (data && (isFormUrlEncoded || ['GET', 'OPTIONS', 'DELETE', 'TRACE', 'CONNECT'].includes(method))) { + const dataArray = [] + for (const key in data) { + dataArray.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key])) + } + data = dataArray.join('&') + } + // header的属性的值类型如果是number, request请求时信息会丢失. 故将各个属性转成string类型 + if (header) { + for (const key in header) { + header[key] = `${header[key]}` + } + } + + const httpRequestOptions = { + method: method, + extraData: data || {}, + header: header, + expectDataType: (responseType && responseType === 'arraybuffer') ? http.HttpDataType.ARRAY_BUFFER : http.HttpDataType.STRING, + usingCache: enableCache || false + } + let isTimeout = false + const timer = setTimeout(() => { + console.error('[AdvancedAPI] request error: Timeout was reached') + isTimeout = true + if (fail && !this.abortFlag) { + const res = { errMsg: 'Timeout was reached' } + this.result = res + fail(res) + } + if (complete && !this.abortFlag) { + complete(this.result) + } + if (this.httpRequest) { + this.httpRequest.destroy() + this.httpRequest = undefined + } + }, timeout || 60000) + this.httpRequest.request((typeof url === 'string') ? url : '', httpRequestOptions) + .then((data) => { + clearTimeout(timer) + console.debug('[AdvancedAPI] request url %s success', url) + if (success && !this.abortFlag) { + let result = data.result + let isArrayBuffer = false + const { responseType } = object || {} + // 返回数据类型dataType不为json时需要考虑将ArrayBuffer数据先转换为base64字符串 + if (responseType && responseType !== 'json') { + if (Object.prototype.toString.call(result) === '[object ArrayBuffer]') { + // expectDataType响应数据类型只有ARRAY_BUFFER和STRING两种 + result = arrayBufferToBase64(result) + isArrayBuffer = true + } + } else if (typeof data.result === 'string') { + // 返回数据类型dataType为json时,尝试将字符串转换为JSON对象,若无法转换则仍返回字符串 + try { + result = JSON.parse(result) + } catch (err) { } + } + const res = { + isArrayBuffer: false, + data: result, + statusCode: data.responseCode, + header: data.header, + cookies: typeof data.cookies === 'string' ? (data.cookies ? [data.cookies] : []) : data.cookies, + errMsg: 'request:ok' + } + if (isArrayBuffer) { + res.isArrayBuffer = true + } + this.result = res + success(res) + } + }) + .catch((err) => { + // 若超出request的默认超时时间,也会走超时。connectTimeout和readTimeout默认均为60000ms。 + clearTimeout(timer) + if (!isTimeout) { + console.error('[AdvancedAPI] request error: ' + JSON.stringify(err)) + if (fail && !this.abortFlag) { + const res = { errMsg: errMsgMap.has(err.code) ? errMsgMap.get(err.code) : 'Unknown Error' } + this.result = res + fail(res) + } + } + }) + .finally(() => { + if (!isTimeout) { + if (complete && !this.abortFlag) { + complete(this.result) + } + if (this.httpRequest) { + this.httpRequest.destroy() + this.httpRequest = undefined + } + } + }) + } + + /** + * interrupt request task + */ + abort() { + console.debug('[AdvancedAPI] request abort') + this.abortFlag = true + if (this.httpRequest) { + this.httpRequest.destroy() + this.httpRequest = undefined + this.res = { errMsg: 'request:fail abort' } + this.fail && this.fail(this.res) + this.complete && this.complete(this.res) + } + } + + /** + * subscribe HTTP Response Header event + * @callback params header {Object}: HTTP Response Header + */ + onHeadersReceived(callback) { + const taskCallback = (header) => { + !this.abortFlag && callback({ header }) + } + if (!callback) { + console.error('[AdvancedAPI] Invalid, callback is null') + return + } + if (!this.headersCallback.has(callback)) { + this.headersCallback.set(callback, taskCallback) + if (this.httpRequest) { + this.httpRequest.on('headersReceive', taskCallback) + } + } + } + + /** + * unsubscribe HTTP Response Header event + * remove all if callback is null, otherwise remove the specialized callback + */ + offHeadersReceived(callback) { + if (!callback) { + this.headersCallback.clear() + if (this.httpRequest) { + this.httpRequest.off('headersReceive') + } + } else if (this.headersCallback.has(callback)) { + if (this.httpRequest) { + this.httpRequest.off('headersReceive', this.headersCallback.get(callback)) + } + this.headersCallback.delete(callback) + } else { + console.debug('[AdvancedAPI] offHeadersReceived callback invalid') + } + } +} + +// UploadTask class +class UploadTask { + /** + * constructor function, create download request + * Required + * @object params url {String}: server address + * Required Optional 1 + * @object params files {Array}: upload files object list, file object include name{String}, file{File}, uri{String} + * Required Optional 2 + * @object params filePath {String}: upload file path + * @object params name {String}: upload file key + * Optional + * @object params header {Object}: HTTP request Header + * @object params formData {Object}: extra form data + * @object params success {Function}: success callback + * @object params fail {Function}: fail callback + * @object params complete {Function}: complete callback + * Callback + * @success params data {String}: data returned by server + * @success params statusCode {Number}: status code returned by server, 200 for HTTP OK + */ + constructor(object) { + const { url, files, filePath, name, header, formData } = object || {} + const { success, fail, complete } = object || {} + const filePath1 = filePath.startsWith('internal://cache/') ? filePath : pathToCache(filePath) + + this.progressCallback = new Map() + this.headersCallback = new Map() + + const uploadFiles = [] + if (files) { + files.forEach(function (file) { + if (typeof file.uri === 'string') { + const filename = file.uri.substring(file.uri.lastIndexOf('/') + 1) + const type = file.uri.substring(file.uri.lastIndexOf('.') + 1) + uploadFiles.push({ filename: filename, name: file.name, uri: file.uri, type: type }) + } + }) + } else if (typeof filePath1 === 'string') { + const filename = filePath1.substring(filePath1.lastIndexOf('/') + 1) + const type = filePath1.substring(filePath1.lastIndexOf('.') + 1) + uploadFiles.push({ filename: filename, name: name, uri: filePath1, type: type }) + } + const formDataArray = [] + for (const [key, value] of Object.entries(formData || {})) { + formDataArray.push({ + name: key, + value: typeof value === 'string' ? value : JSON.stringify(value), + }) + } + const uploadConfig = { + url: url, + header: header || {}, + method: 'POST', + files: uploadFiles, + data: formDataArray, + } + this.successHandle = (res) => { + success && success(res) + complete && complete(res) + } + this.failHandle = (res) => { + fail && fail(res) + complete && complete(res) + } + try { + console.debug('[AdvancedAPI] request upload') + request.uploadFile(globalThis.abilityContext, uploadConfig) + .then((data) => { + this.uploadTask = data + if (this.abortFlag) { + this.abortFlag = false + this.uploadTask.delete(() => { + this.res = { errMsg: 'uploadFile:fail abort' } + this.failHandle(this.res) + }) + } + if (this.progressFlag) { + this.progressFlag = false + for (const taskCallback of this.progressCallback.values()) { + this.uploadTask.on('progress', taskCallback) + } + } + if (this.headersFlag) { + this.headersFlag = false + for (const callback of this.headersCallback.values()) { + this.uploadTask.on('headerReceive', callback) + } + } + this.uploadTask.on('headerReceive', this.headersReceivedHandle.bind(this)) + this.uploadTask.on('complete', () => { + console.debug('[AdvancedAPI] upload success') + this.res = { + data: this.receivedData?.body || {}, + header: this.receivedData?.headers || {}, + cookies: [], + statusCode: 200, errMsg: + 'uploadFile:ok' + } + this.successHandle(this.res) + }) + this.uploadTask.on('fail', () => { + console.debug('[AdvancedAPI] upload fail') + this.res = { errMsg: 'uploadFile:fail' } + this.failHandle(this.res) + }) + }) + .catch((err) => { + console.error('[AdvancedAPI] upload request error: ' + err.message) + this.res = { errMsg: `uploadFile:fail ${err.message}` } + this.failHandle(this.res) + }) + } catch (err) { + console.error('[AdvancedAPI] upload request err.code : ' + err.code + ', err.message : ' + err.message) + this.res = { errMsg: `uploaddFile:fail ${err.message}` } + this.failHandle(this.res) + } + } + + /** + * interrupt upload task + */ + abort() { + this.res = { errMsg: 'uploadFile:fail abort' } + if (this.uploadTask) { + this.uploadTask.delete(() => { + this.failHandle(this.res) + }) + } else { + this.abortFlag = true + } + } + + /** + * subscribe upload process event + * @callback params progress {Number}: upload process percent + * @callback params totalBytesSent {Number}: upload Bytes + * @callback params totalBytesExpectedToSend {Number}: total Bytes + */ + onProgressUpdate(callback) { + function taskCallback(uploadedSize, totalSize) { + callback({ progress: Math.ceil(100 * uploadedSize / totalSize), totalBytesSent: uploadedSize, totalBytesExpectedToSend: totalSize }) + } + if (!callback) { + console.error('[AdvancedAPI] Invalid, callback is null') + return + } + if (!this.progressCallback.has(callback)) { + this.progressCallback.set(callback, taskCallback) + if (this.uploadTask) { + this.uploadTask.on('progress', taskCallback) + } else { + this.progressFlag = true + } + } + } + + /** + * unsubscribe upload process event + * remove all if callback is null, otherwise remove the specialized callback + */ + offProgressUpdate(callback) { + if (!callback) { + this.progressCallback.clear() + // if task is not ready, on is not set too + if (this.uploadTask) { + this.uploadTask.off('progress') + } + } else if (this.progressCallback.has(callback)) { + if (this.uploadTask) { + this.uploadTask.off('progress', this.progressCallback.get(callback)) + } + this.progressCallback.delete(callback) + } else { + console.debug('[AdvancedAPI] offProgressUpdate callback invalid') + } + } + + /** + * subscribe HTTP Response Header event + */ + headersReceivedHandle(info) { + this.receivedData = info + } + + /** + * subscribe HTTP Response Header event + * @callback params header {Object}: HTTP Response Header + */ + onHeadersReceived(callback) { + const taskCallback = (info) => { + !this.abortFlag && callback({ header: info.headers || {}}) + } + if (!callback) { + console.error('[AdvancedAPI] Invalid, callback is null') + return + } + if (!this.headersCallback.has(callback)) { + this.headersCallback.set(callback, taskCallback) + if (this.uploadTask) { + this.uploadTask.on('headerReceive', taskCallback) + } else { + this.headersFlag = true + } + } + } + + /** + * unsubscribe HTTP Response Header event + * remove all if callback is null, otherwise remove the specialized callback + */ + offHeadersReceived(callback) { + if (!callback) { + this.headersCallback.clear() + if (this.uploadTask) { + this.uploadTask.off('headerReceive') + this.uploadTask.on('headerReceive', this.headersReceivedHandle.bind(this)) + } + } else if (this.headersCallback.has(callback)) { + if (this.uploadTask) { + this.uploadTask.off('headerReceive', this.headersCallback.get(callback)) + } + this.headersCallback.delete(callback) + } else { + console.debug('[AdvancedAPI] offHeadersReceived callback invalid') + } + } +} + +// DownloadTask class +class DownloadTask { + /** + * constructor function, create download request + * Required + * @object params url {String}: file server address + * @object params filePath {String}: specialized the local storage path, if null, use default cache dir + * Optional + * @object params header {Object}: HTTP request Header + * @object params success {Function}: success callback + * @object params fail {Function}: fail callback + * @object params complete {Function}: complete callback + * Callback + * @success params tempFilePath {String}: temp file storage path + * @success params statusCode {Number}: status code returned by server, 200 for HTTP OK + */ + constructor(object) { + const { url, header, filePath } = object || {} + const { success, fail, complete } = object || {} + this.progressCallback = new Map() + + if (typeof url === 'string') { + const timestamp = new Date().getTime() + this.filename = 'Download_' + timestamp + '_' + url.substring(url.lastIndexOf('/') + 1).replace(/[^a-zA-Z0-9.]/, '').slice(-16) + } + + const interalFilePath = filePath || `internal://cache/${this.filename}` + const sanBoxFilePath = switchInternalToHapSandBox(interalFilePath) + const downloadConfig = { + url: this.isEncodeUri(url) ? url : encodeURI(url), + header: header || {}, // undefined error + filePath: sanBoxFilePath, + } + + this.successHandle = (res) => { + success && success(res) + complete && complete(res) + } + this.failHandle = (res) => { + fail && fail(res) + complete && complete(res) + } + try { + console.debug('[AdvancedAPI] request download') + request.downloadFile(globalThis.abilityContext, downloadConfig) + .then((data) => { + this.downloadTask = data + if (this.abortFlag) { + this.abortFlag = false + this.downloadTask.delete(() => { + console.debug('[AdvancedAPI] download fail') + this.res = { errMsg: 'downloadFile:fail abort' } + this.failHandle(this.res) + }) + } + if (this.progressFlag) { + this.progressFlag = false + for (const taskCallback of this.progressCallback.values()) { + this.downloadTask.on('progress', taskCallback) + } + } + this.downloadTask.on('complete', () => { + console.debug('[AdvancedAPI] download success') + this.res = { tempFilePath: interalFilePath, statusCode: 200, errMsg: 'downloadFile:ok' } + filePath && Object.assign(this.res, { filePath }) + this.downloadTask.getTaskInfo().then((info) => { + console.debug('[AdvancedAPI] download info: %s', JSON.stringify(info)) + info.downloadTotalBytes && Object.assign(this.res, { dataLength: info.downloadTotalBytes }) + }).catch((err) => { + console.error('[AdvancedAPI] download request get task info error: ' + err.message) + }).finally(() => { + this.successHandle(this.res) + }) + }) + this.downloadTask.on('fail', () => { + console.debug('[AdvancedAPI] download fail') + this.res = { errMsg: 'downloadFile:fail' } + this.failHandle(this.res) + }) + }) + .catch((err) => { + console.error('[AdvancedAPI] download request error: ' + err.message) + this.res = { errMsg: `downloadFile:fail ${err.message}` } + this.failHandle(this.res) + }) + } catch (err) { + console.error('[AdvancedAPI] download request err.code : ' + err.code + ', err.message : ' + err.message) + this.res = { errMsg: `downloadFile:fail ${err.message}` } + this.failHandle(this.res) + } + } + + /** + * interrupt download task + */ + abort() { + if (this.downloadTask) { + this.downloadTask.delete(() => { + console.debug('[AdvancedAPI] download fail') + this.res = { errMsg: 'downloadFile:fail abort' } + this.failHandle(this.res) + }) + } else { + this.abortFlag = true + } + } + + /** + * subscribe download process event + * @callback params progress {Number}: download process percent + * @callback params totalBytesWritten {Number}: download Bytes + * @callback params totalBytesExpectedToWrite {Number}: total Bytes + */ + onProgressUpdate(callback) { + function taskCallback(receivedSize, totalSize) { + callback({ progress: Math.ceil(100 * receivedSize / totalSize), totalBytesWritten: receivedSize, totalBytesExpectedToWrite: totalSize }) + } + if (!callback) { + console.error('[AdvancedAPI] Invalid, callback is null') + return + } + if (!this.progressCallback.has(callback)) { + this.progressCallback.set(callback, taskCallback) + if (this.downloadTask) { + this.downloadTask.on('progress', taskCallback) + } else { + this.progressFlag = true + } + } + } + + /** + * unsubscribe download process event + * remove all if callback is null, otherwise remove the specialized callback + */ + offProgressUpdate(callback) { + if (!callback) { + this.progressCallback.clear() + // if task is not ready, on is not set too + if (this.downloadTask) { + this.downloadTask.off('progress') + } + } else if (this.progressCallback.has(callback)) { + if (this.downloadTask) { + this.downloadTask.off('progress', this.progressCallback.get(callback)) + this.progressCallback.delete(callback) + } + } else { + console.debug('[AdvancedAPI] offProgressUpdate callback invalid') + } + } + + /** + * subscribe HTTP Response Header event + * @callback params header {Object}: HTTP Response Header + * ohos not support + */ + onHeadersReceived(callback) { + console.debug('[AdvancedAPI] onHeadersReceived not support') + } + + /** + * unsubscribe HTTP Response Header event + * remove all if callback is null, otherwise remove the specialized callback + * ohos not support + */ + offHeadersReceived(callback) { + console.debug('[AdvancedAPI] offHeadersReceived not support') + } + + /** + * check whether a string contains only valid characters of encodeUri + */ + isEncodeUri(uri) { + const validRep = /^[a-zA-Z0-9-_.!~*'();/?:@&=+$,#]+$/ + if (!uri) { + return true + } + return validRep.test(uri) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRouter/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRouter/index.js new file mode 100644 index 0000000000..bc09bcf49f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASRouter/index.js @@ -0,0 +1,129 @@ +import router from '@ohos.router' +import { ErrorCode } from '../../../base/util/ErrorCode' + +export default class ASRouter { + /** + * 保留当前页面,跳转到应用内的某个页面 + * @param {string} url - 需要跳转的应用内非 tabBar 的页面的路径 + * @param {string} animationType - 窗口显示的动画效果(不支持) + * @param {number} animationDuration - 窗口动画持续时间,单位为 ms(不支持) + * @param {object} events - 页面间通信接口,用于监听被打开页面发送到当前页面的数据。(不支持) + * @param {function} success + * @param {function} fail + * @param {function} complete + */ + navigateTo (params) { + return new Promise((resolve, reject) => { + if (typeof params.url !== 'string') { + reject(['param url', ErrorCode.PARAMETER_ERROR]) + return + } + const { url, urlParams } = getUrlParams(params.url) + console.debug('[AdvancedAPI] navigateTo urlParams = %s', JSON.stringify(urlParams)) + router.pushUrl({ + url: url, + params: urlParams + }).then(() => { + resolve() + }).catch(err => { + console.error(`[AdvancedAPI] pushUrl failed, code is ${err.code}, message is ${err.message}`) + reject([err.message, err.code]) + }) + }) + } + + /** + * 关闭当前页面,跳转到应用内的某个页面 + * @param {string} url - 需要跳转的应用内非 tabBar 的页面的路径 + * @param {function} success + * @param {function} fail + * @param {function} complete + */ + redirectTo (params) { + return new Promise((resolve, reject) => { + if (typeof params.url !== 'string') { + reject(['param url', ErrorCode.PARAMETER_ERROR]) + return + } + const { url, urlParams } = getUrlParams(params.url) + console.debug('[AdvancedAPI] redirectTo urlParams = ' + JSON.stringify(urlParams)) + router.replaceUrl({ + url, + params: urlParams + }).then(() => { + resolve() + }).catch(err => { + console.error(`[AdvancedAPI] replaceUrl failed, code is ${err.code}, message is ${err.message}`) + reject([err.message, err.code]) + }) + }) + } + + /** + * 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。 + * 当时无法实现:需要通过api来控制tabs组件的index + * @param {string} url - 需要跳转的 tabBar 页面的路径 + * @param {function} success + * @param {function} fail + * @param {function} complete + */ + switchTab (params) { + return new Promise(async (resolve, reject) => { + reject('[AdvancedAPI] switchTab do not support') + }) + } + + /** + * 关闭当前页面,返回上一页面或多级页面。 + * @param {number} delta - 返回的页面数,如果 delta 大于现有页面数,则返回到首页。 + * @param {string} animationType - 窗口关闭的动画效果 + * @param {number} animationDuration - 窗口关闭动画的持续时间,单位为 ms + * @param {function} success + * @param {function} fail + * @param {function} complete + */ + navigateBack (params) { + return new Promise((resolve, reject) => { + let { delta = 1 } = params + if (delta === null) { + delta = 1 + } + if (typeof delta !== 'number') { + reject(['parameter delta', ErrorCode.PARAMETER_ERROR]) + return + } + const pageLengths = Number(router.getLength()) + if (delta > pageLengths) { + delta = pageLengths - 1 + } + try { + // 此处应该是要获取到页面栈所有对象的路径,然后调用鸿蒙的back接口指定返回页面的路劲 + // 但是鸿蒙没有提供获取所有页面路径的接口 + for (let i = 0; i < delta; i++) { + router.back() + } + resolve() + } catch (err) { + reject([err.data, err.code]) + } + }) + } +} + +/** + * 解析url=pages/Index?id=1&name=uniapp + * @param {string} url + * @return {object} object + */ +function getUrlParams (url = '') { + const urlParams = {} + const urlArr = url.split('?') + url = urlArr[0] + let tempParams = urlArr[1] || '' + tempParams = tempParams.split('&') + tempParams.forEach(item => { + const itemArr = item.split('=') + urlParams[itemArr[0]] = itemArr[1] + }) + return { url, urlParams } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASScan/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASScan/index.js new file mode 100644 index 0000000000..557e0acf77 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASScan/index.js @@ -0,0 +1,112 @@ +import scanCore from '@hms.core.scan.scanCore' +import scanBarcode from '@hms.core.scan.scanBarcode' +import { ErrorCode } from '../../../base/util/ErrorCode' +import { isBoolean } from '../../../base/util/checkDataType' +import { Base64 } from 'js-base64' + +const SCAN_TYPE_AS_TO_HM = { + 'barCode': scanCore?.ScanType.ONE_D_CODE, + 'qrCode': scanCore?.ScanType.TWO_D_CODE, + 'datamatrix': scanCore?.ScanType.DATAMATRIX_CODE, + 'pdf417': scanCore?.ScanType.PDF417_CODE +} + +export default class ASScan { + scanCode(params = {}) { + return new Promise((resolve, reject) => { + const { onlyFromCamera = false, hideAlbum = false, scanType = [] } = params + const scanTypes = [] + for (let i = 0; i < scanType.length; i++) { + if (SCAN_TYPE_AS_TO_HM[scanType[i]]) { + scanTypes.push(SCAN_TYPE_AS_TO_HM[scanType[i]]) + } else { + reject(['Parameter scanType invalid!', ErrorCode.PARAMETER_ERROR]) + return + } + } + if (!isBoolean(onlyFromCamera)) { + reject(['Parameter onlyFromCamera invalid!', ErrorCode.PARAMETER_ERROR]) + return + } + if (!isBoolean(hideAlbum)) { + reject(['Parameter hideAlbum invalid!', ErrorCode.PARAMETER_ERROR]) + return + } + if (scanTypes.length === 0) { + scanTypes.push(scanCore.ScanType.ALL) + } + const options = { scanTypes, enableMultiMode: false, enableAlbum: (!onlyFromCamera && !hideAlbum) } + try { + scanBarcode.startScan(options).then((result) => { + resolve({ + result: result.originalValue, + scanType: this.scanTypeHmToAs(result.scanType), + rawData: Base64.btoa(result.originalValue), + charSet: 'utf-8' + }) + }).catch((failResult) => { + reject(['scanCode fail!', ErrorCode.COMMON_ERROR]) + }) + } catch (error) { + reject(['scanCode fail!', ErrorCode.COMMON_ERROR]) + } + }) + } + + scanTypeHmToAs(type) { + let asType = 'UNKNOWN' + switch (type) { + case scanCore.ScanType.DATAMATRIX_CODE: + asType = 'DATA_MATRIX' + break + case scanCore.ScanType.PDF417_CODE: + asType = 'PDF_417' + break + case scanCore.ScanType.AZTEC_CODE: + asType = 'AZTEC' + break + case scanCore.ScanType.CODABAR_CODE: + asType = 'CODABAR' + break + case scanCore.ScanType.CODE39_CODE: + asType = 'CODE_39' + break + case scanCore.ScanType.CODE93_CODE: + asType = 'CODE_93' + break + case scanCore.ScanType.CODE128_CODE: + asType = 'CODE_128' + break + case scanCore.ScanType.EAN8_CODE: + asType = 'EAN_8' + break + case scanCore.ScanType.EAN13_CODE: + asType = 'EAN_13' + break + case scanCore.ScanType.ITF14_CODE: + asType = 'ITF' + break + case scanCore.ScanType.QR_CODE: + asType = 'QR_CODE' + break + case scanCore.ScanType.UPC_A_CODE: + asType = 'UPC_A' + break + case scanCore.ScanType.UPC_E_CODE: + asType = 'UPC_E' + break + case scanCore.ScanType.MULTIFUNCTIONAL_CODE: + asType = 'MULTIFUNCTIONAL' + break + case scanCore.ScanType.ONE_D_CODE: + asType = 'CODABAR' + break + case scanCore.ScanType.TWO_D_CODE: + asType = 'QR_CODE' + break + default: + break + } + return asType + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVibrator/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVibrator/index.js new file mode 100644 index 0000000000..e975fccc99 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVibrator/index.js @@ -0,0 +1,82 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: default description + * Author: weisufang + * Create: 04/12/2023 + * 需要权限: ohos.permission.VIBRATE + */ + +import vibrator from '@ohos.vibrator' + +export default class ASVibrator { + /** + * 使手机发生振动。 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + vibrate () { + return new Promise((resolve, reject) => { + this.triggerVibrate({ duration: 200 }).then(data => { + resolve(data) + }).catch(err => { + reject([err.data, err.code]) + }) + }) + } + + /** + * 使手机发生较长时间的振动(400ms) + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + vibrateLong () { + return new Promise((resolve, reject) => { + this.triggerVibrate({ duration: 400 }).then(data => { + resolve(data) + }).catch(err => { + reject([err.data, err.code]) + }) + }) + } + + /** + * 使手机发生较短时间的振动(15ms) + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + vibrateShort () { + return new Promise((resolve, reject) => { + this.triggerVibrate({ duration: 15 }).then(data => { + resolve(data) + }).catch(err => { + reject([err.data, err.code]) + }) + }) + } + + triggerVibrate (params) { + return new Promise((resolve, reject) => { + const effect = { + type: 'time', + duration: params.duration + } + const attribute = { + id: 0, + usage: 'alarm' + } + vibrator.startVibration(effect, attribute).then(data => { + console.debug('[AdvancedAPI] startVibration success') + resolve(data) + }, (err) => { + console.error(`[AdvancedAPI] startVibration fail err = ${JSON.stringify(err)}`) + reject(err) + }).catch((err) => { + console.error(`[AdvancedAPI] startVibration fail err = ${JSON.stringify(err)}`) + reject(err) + }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVideo/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVideo/index.js new file mode 100644 index 0000000000..79048bdfaa --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASVideo/index.js @@ -0,0 +1,165 @@ +import { + getFileAssetFromUri, + isFileUri, + isSandboxPath, + getFdFromUriOrSandBoxPath, + switchInternalToHapSandBox, + saveMedia +} from '../../util/index' +import fs from '@ohos.file.fs' +import { ErrorCode } from '../../../base/util/ErrorCode' +// import { MediaLibraryBase } from '../../../base/bridge/mediaLibraryBase' +import { FileioBase } from '../../../base/bridge/fileioBase' +import photoAccessHelper from '@ohos.file.photoAccessHelper' +// import { context } from '../../../base/bridge/abilityBase' +import fileUri from '@ohos.file.fileuri' + +// const ORI = { +// 0: 'left', +// 90: 'up', +// 180: 'right', +// 270: 'down', +// } + +export default class ASViedo { + getVideoInfo(params) { + return new Promise(async (resolve, reject) => { + return reject(['getVideoInfo is not support!']) + // const permission = await MediaLibraryBase.getPermissions() + // if (permission.perNum === -1) { + // return reject(['permission fail', ErrorCode.USER_REJECT, permission.perNum, permission.dialogShownResults]) + // } + // try { + // let uri = params.src + // if (isFileUri(uri)) { + // const asset = await getFileAssetFromUri(uri) + // const orientation = ORI[asset.orientation] + // return resolve({ + // width: asset.width, + // height: asset.height, + // path: uri, + // orientation, + // type: asset.displayName.split('.').pop(), + // duration: asset.duration / 1000, + // size: Math.round(asset.size / 1024), + // bitrate: Math.round((asset.size * 8 * 1000) / (asset.duration * 1024)), + // }) + // } else if (isSandboxPath(uri)) { + // uri = switchInternalToHapSandBox(uri) + // const fileType = uri.split('.').pop() + // const fileName = uri.split('/').pop() + // if (!fs.accessSync(uri)) { + // reject(['getVideoInfo fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + // return + // } + // const file = fs.openSync(uri, fs.OpenMode.READ_WRITE) + // if (!file) { + // reject(['saveVideoToPhotosAlbum fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + // return + // } + // // await new Promise(res => setTimeout(res, 500)) + // // const fileResult = await media.getFileAssets(videosfetchOp) + // // const asset = await fileResult.getFirstObject() + // const fd = file.fd + // const stat = fs.statSync(fd) + // const sizes = stat.size + // const buf = new ArrayBuffer(sizes) + // FileioBase.ohosReadSync(fd, buf) + // const videoUri = await saveMedia(fileName, buf) + // // const media = MediaLibraryBase.getMedia() + // const asset = await getFileAssetFromUri(videoUri) + // const width = Number(asset.get(photoAccessHelper.PhotoKeys.WIDTH)) + // const height = Number(asset.get(photoAccessHelper.PhotoKeys.HEIGHT)) + // const orientation = ORI[asset.get(photoAccessHelper.PhotoKeys.ORIENTATION)] + // const duration = Number(asset.get(photoAccessHelper.PhotoKeys.DURATION)) / 1000 + // const size = Math.round(Number(asset.get(photoAccessHelper.PhotoKeys.SIZE)) / 1024) + // const bitrate = Math.round((Number(asset.get(photoAccessHelper.PhotoKeys.SIZE)) * 8 * 1000) / (Number(asset.get(photoAccessHelper.PhotoKeys.DURATION)) * 1024)) + // const result = { + // width, + // height, + // path: params.src, + // orientation, + // type: fileType, + // duration, + // size, + // bitrate, + // } + // try { + // await asset.trash(true) + // await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [asset.uri]) + // } catch (error) { + // console.debug('[AdvancedAPI] delete tempFile fail: %s', error.message) + // } + // // fileResult.close() + // return resolve(result) + // } else { + // return reject(['get uri fail', ErrorCode.SERVICE_UNAVIALABLE]) + // } + // } catch (err) { + // console.debug(`[AdvancedAPI] getVideoInfo err %s`, JSON.stringify(err)) + // reject([err.message, err.code]) + // } + }) + } + + saveVideoToPhotosAlbum(params) { + return new Promise(async (resolve, reject) => { + const filePath = params.filePath + // const permission = await MediaLibraryBase.getPermissions() + // if (permission.perNum === -1) { + // return reject(['permission fail', ErrorCode.USER_REJECT, permission.perNum, permission.dialogShownResults]) + // } + if (typeof filePath !== 'string') { + return reject(['filePath format is not supported.', ErrorCode.PARAMETER_ERROR]) + } + console.debug('[AdvancedAPI] filePath:', filePath) + if (isFileUri(filePath)) { + const uri = filePath + const fd = getFdFromUriOrSandBoxPath(uri) + const stat = fs.statSync(fd) + const size = stat.size + const buf = new ArrayBuffer(size) + FileioBase.ohosReadSync(fd, buf) + const fileAsset = await getFileAssetFromUri(uri) + const displayName = 'VIDEO_' + new Date().getTime() + '_' + fileAsset.displayName + // uri = fileUri.getUriFromPath(uri) + const imageUri = await saveMedia(photoAccessHelper.PhotoType.VIDEO, displayName, uri, buf) + resolve({ path: imageUri }) + return + } else if (isSandboxPath(filePath)) { + let uri = filePath + if (uri.startsWith('internal://')) { + uri = switchInternalToHapSandBox(uri) + } + if (!fs.accessSync(uri)) { + reject(['saveVideoToPhotosAlbum fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + return + } + const file = fs.openSync(uri, fs.OpenMode.READ_ONLY) + if (!file) { + reject(['saveVideoToPhotosAlbum fail, src not exist.', ErrorCode.PARAMETER_ERROR]) + return + } + const fd = file.fd + + // 根据文件大小定义空arrayBuffer用来写入文件 + const stat = fs.statSync(uri) + + const size = stat.size + + const buf = new ArrayBuffer(size) + + // 读取传入文件信息到缓冲区 + FileioBase.ohosReadSync(fd, buf) + + // 获取文件显示名 + const displayName = 'VIDEO_' + new Date().getTime() + '_' + filePath.split('/').splice(-1, 1).toString() + uri = fileUri.getUriFromPath(uri) + const imageUri = await saveMedia(photoAccessHelper.PhotoType.VIDEO, displayName, uri, buf) + resolve({ path: imageUri }) + return + } + reject(['filePath format is not supported.', ErrorCode.PARAMETER_ERROR]) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASWifi/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASWifi/index.js new file mode 100644 index 0000000000..1dd7e9011f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/ASWifi/index.js @@ -0,0 +1,357 @@ + +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: default description + * Author: weisufang + * Create: 04/10/2023 + * 需要权限: + * ohos.permission.LOCATION + * ohos.permission.GET_WIFI_INFO + * ohos.permission.SET_WIFI_INFO + * ohos.permission.MANAGE_WIFI_CONNECTION + * ohos.permission.GET_WIFI_INFO_INTERNAL + * ohos.permission.SET_WIFI_CONFIG + */ + +import wifi from '@ohos.wifi' +import { WifiBase } from '../../../base/bridge/wifiBase' +import { WifiBaseModule } from '../../../base/module/Wifi/WifiBaseModule' +import { isString } from '../../../base/util/checkDataType' +import { ErrorCode, WifiErrorCode } from '../../../base/util/ErrorCode' + +// eslint-disable-next-line no-unused-vars +const WIFI_ERR_CODE = { + OK: 0, // 正常 + NOT_INIT: 12000, // 未先调用 startWifi 接口 + NOT_SUPPORT: 12001, // 当前系统不支持相关能力 + ERR_PASSWORD: 12002, // 密码错误 + NOT_TURN_ON: 12005, // Android 特有,未打开 Wi-Fi 开关 + CONFIG_EXPIPIRED: 12013 // 系统保存的 Wi-Fi 配置过期,建议忘记 Wi-Fi 后重试,仅 Android 支持 +} + +export default class ASWifi extends WifiBaseModule { + constructor() { + super() + this.connectCallbacks = [] + this.connectWithPartialInfo = [] + this._connectByNetId = [] + this.wifiScanCallbacks = [] + this.connectionChange() + this.scanChange() + } + + /** + * 初始化Wi-Fi模块 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + startWifi (params) { + return new Promise((resolve, reject) => { + if (wifi.isWifiActive()) { + console.debug('[AdvancedAPI] enableWifi success') + resolve() + } else { + if (wifi.enableWifi()) { + console.debug('[AdvancedAPI] enableWifi success') + resolve() + } else { + console.debug('[AdvancedAPI] enableWifi fail') + reject(['wifi not turned on', WifiErrorCode.WIFI_NOT_TURNED_ON]) + } + } + }) + } + + /** + * 关闭 Wi-Fi 模块 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + stopWifi () { + return new Promise((resolve, reject) => { + if (!wifi.isWifiActive()) { + console.debug('[AdvancedAPI] stopWifi success') + resolve() + } else { + if (wifi.disableWifi()) { + console.debug('[AdvancedAPI] stopWifi success') + resolve() + } else { + console.debug('[AdvancedAPI] stopWifi fail') + reject(['system not support', ErrorCode.COMMON_ERROR]) + } + } + }) + } + + /** + * 获取已连接的 Wi-Fi 信息 + * @param {boolean} partialInfo - 是否需要返回部分 Wi-Fi 信息 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + getConnectedWifi (params = {}) { + return new Promise((resolve, reject) => { + // eslint-disable-next-line no-unused-vars + const { partialInfo = false } = params + super.getConnectedWifi(partialInfo).then(([[wifi]]) => { + resolve({ wifi: wifi }) + }, (err) => { + reject(...err) + }) + }) + } + + /** + * 请求获取 Wi-Fi 列表。wifiList 数据会在 onGetWifiList 注册的回调中返回。 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + getWifiList (params) { + return new Promise((resolve, reject) => { + super.scan().then(([data = []] = []) => { + resolve(...data) + }, (err) => { + reject(...err) + }) + }) + } + + /** + * 监听获取到 Wi-Fi 列表数据事件。 + * @param {function} 获取到 Wi-Fi 列表数据事件的监听函数 + */ + onGetWifiList (callback) { + if (typeof callback !== 'function') { + console.error('[AdvancedAPI] param is invalid.') + return + } + this.wifiScanCallbacks.push(callback) + } + + /** + * 移除获取到 Wi-Fi 列表数据事件的监听函数。不支持移除某个监听函数 + * @param {function} 传入的监听函数。不传此参数则移除所有监听函数。 + */ + offGetWifiList (callback) { + const index = this.wifiScanCallbacks.indexOf(callback) + if (index >= 0) { + this.wifiScanCallbacks.splice(index, 1) + } else { + this.wifiScanCallbacks = [] + } + } + + /** + * 连接 Wi-Fi。若已知 Wi-Fi 信息,可以直接利用该接口连接。 + * @param {string} SSID Wi-Fi 设备 SSID + * @param {string} BSSID Wi-Fi 设备 BSSID + * @param {string} password Wi-Fi 设备密码 + * @param {boolean} maunal 跳转到系统设置页进行连接 + * @param {boolean} partialInfo 是否需要返回部分 Wi-Fi 信息 + * @param {function} success - 接口调用成功的回调函数 + * @param {function} fail - 接口调用失败的回调函数 + * @param {function} complete - 接口调用结束的回调函数(调用成功、失败都会执行) + */ + connectWifi (params) { + return new Promise(async (resolve, reject) => { + // eslint-disable-next-line no-unused-vars + const { SSID, BSSID = '', password = '', maunal = false, partialInfo = false } = params + if (!isString(SSID)) { + console.error('[AdvancedAPI] connectWifi invalid SSID') + reject(['wifi SSID error', WifiErrorCode.PASSWORD_ERROR]) + return + } + if (!isString(BSSID)) { + console.error('[AdvancedAPI] connectWifi invalid BSSID') + reject(['wifi BSSID error', WifiErrorCode.PASSWORD_ERROR]) + return + } + if (!isString(password)) { + console.error('[AdvancedAPI] connectWifi invalid password') + reject(['wifi password error', WifiErrorCode.PASSWORD_ERROR]) + return + } + + try { + const connectedInfo = await this.getConnectedWifi() + if (connectedInfo.wifi.SSID === SSID) { + resolve() + return + } + } catch (e) { + // 如果当前没有已连接上的wifi不影响 + console.debug('[AdvancedAPI] wifi is not connected.') + } + + try { + const netId = await wifi.addDeviceConfig({ + ssid: SSID, + bssid: BSSID, + preSharedKey: password, + securityType: 3, + isHiddenSsid: false + }) + console.debug('[AdvancedAPI] addDeviceConfig success netId = %d', netId) + this._connectByNetId.push(result => { + const wifiInfo = result.wifi + if (wifiInfo.SSID === SSID) { + resolve() + } else { + reject() + } + }) + if (maunal) { // TODO: 跳转到设置wlan页面连接 + console.error('[AdvancedAPI] 不支持跳转系统wlan页面') + return + } else { + wifi.connectToNetwork(netId) + } + } catch (err) { + console.error('[AdvancedAPI] connectWifi addDeviceConfig fail err = ' + err) + reject(['system not support', ErrorCode.COMMON_ERROR]) + } + }) + } + + /** + * 监听连接上 Wi-Fi 的事件。 + * @param {function} 连接上 Wi-Fi 的事件的监听函数 + */ + onWifiConnected (callback) { + if (typeof callback !== 'function') { + console.error('[AdvancedAPI] param is invalid.') + return + } + this.connectCallbacks.push(callback) + } + + /** + * 移除连接上 Wi-Fi 的事件的监听函数。 + * @param {function} 传入的监听函数。不传此参数则移除所有监听函数。 + */ + offWifiConnected (callback) { + const index = this.connectCallbacks.indexOf(callback) + if (index >= 0) { + this.connectCallbacks.splice(index, 1) + } else { + this.connectCallbacks = [] + } + } + + // wifi连接回调 + connectionChange () { + WifiBase.connectionChange(state => { + if (state === WifiBase.StateType.ON) { + this.getConnectedWifi().then(({ wifi }) => { + wifi.state = WifiBase.StateType.ON + this.triggerConnectCallbacks({ wifi }) + this.triggerConnectWithPartialInfo({ wifi }) + this.triggerConnectById({ wifi }) + }, () => { + const wifi = { + 'BSSID': '', + 'signalStrength': 0, + 'state': WifiBase.StateType.ON, + 'secure': false, + 'SSID': '' + } + this.triggerConnectCallbacks({ wifi }) + this.triggerConnectWithPartialInfo({ wifi }) + }) + } else if (state === WifiBase.StateType.OFF) { + const wifi = { + 'BSSID': '', + 'signalStrength': 0, + 'state': WifiBase.StateType.OFF, + 'secure': false, + 'SSID': '' + } + this.triggerConnectCallbacks({ wifi }) + this.triggerConnectWithPartialInfo({ wifi }) + } + }) + } + + // wifi扫描回调 + scanChange () { + WifiBase.scanStateChange(isScan => { + if (isScan === WifiBase.ScanState.SUCCESS) { + WifiBase.getScanInfos().then(wifiInfos => { + console.debug('[AdvancedAPI] onGetWifiList getScanInfos success') + const wifiList = wifiInfos.map(item => { + return { + BSSID: item.bssid, + SSID: item.ssid, + frequency: item.frequency, + signalStrength: super.getSignalStrength(item.rssi), + secure: super.isSecure(item.capabilities) + } + }) + this.triggerScanCallbacks({ wifiList }) + }) + } + }) + } + + triggerConnectCallbacks (result) { + console.debug('[AdvancedAPI] triggerConnectCallbacks') + result.errMsg = 'onWifiConnected:ok' + result.errCode = 0 + this.connectCallbacks.forEach(cb => { + cb(result) + }) + } + + triggerConnectById (result) { + console.debug('[AdvancedAPI] triggerConnectById') + this._connectByNetId.forEach(cb => { + cb(result) + }) + this._connectByNetId = [] + } + + triggerScanCallbacks (result) { + console.debug('[AdvancedAPI] wifiScanCallbacks') + this.wifiScanCallbacks.forEach(cb => { + cb(result) + }) + } + + /** + * 监听连接上 Wi-Fi 的事件。 + * @param {function} 连接上 Wi-Fi 的事件的监听函数 + */ + onWifiConnectedWithPartialInfo (callback) { + if (typeof callback !== 'function') { + console.error('[AdvancedAPI] param is invalid.') + return + } + this.connectWithPartialInfo.push(callback) + } + + /** + * 移除连接上 Wi-Fi 的事件的监听函数。 + * @param {function} 传入的监听函数。不传此参数则移除所有监听函数。 + */ + offWifiConnectedWithPartialInfo (callback) { + const index = this.connectWithPartialInfo.indexOf(callback) + if (index >= 0) { + this.connectWithPartialInfo.splice(index, 1) + } else { + this.connectWithPartialInfo = [] + } + } + + triggerConnectWithPartialInfo (result) { + console.debug('[AdvancedAPI] triggerConnectWithPartialInfo') + const wifi = { SSID: result.wifi.SSID } + this.connectWithPartialInfo.forEach(cb => { + cb({ wifi }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/index.js new file mode 100644 index 0000000000..35006f71e5 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/index.js @@ -0,0 +1,59 @@ +import ASDevice from './ASDevice/index' +import ASLocation from './ASLocation/index' +import ASPhone from './ASPhone/index' +import ASRequest from './ASRequest/index' +import ASBluetooth from './ASBluetooth/index' +import ASRouter from './ASRouter/index' +import ASWifi from './ASWifi/index' +import ASAuthentication from './ASAuthentication' +import ASAccelerometer from './ASAccelerometer/index' +import ASCompass from './ASCompass/index' +import ASGyroscope from './ASGyroscope/index' +import ASContact from './ASContact/index' +import ASVibrator from './ASVibrator/index' +import ASCapture from './ASCapture/index' +import ASKeyboard from './ASKeyboard/index' +import ASImage from './ASImage/index' +import ASAudio from './ASAudio/index' +import ASVideo from './ASVideo/index' +import ASBGAudio from './ASBGAudio/index' +import ASFile from './ASFile/index' +import ASBrightness from './ASBrightness/index' +import ASInterceptor from './ASInterceptor/index' +import ASScan from './ASScan/index' + +const asModulesMap = new Map() +asModulesMap.set('ASDevice', ASDevice) +asModulesMap.set('ASLocation', ASLocation) +asModulesMap.set('ASPhone', ASPhone) +asModulesMap.set('ASRequest', ASRequest) +asModulesMap.set('ASRouter', ASRouter) +asModulesMap.set('ASBluetooth', ASBluetooth) +asModulesMap.set('ASWifi', ASWifi) +asModulesMap.set('ASAuthentication', ASAuthentication) +asModulesMap.set('ASAccelerometer', ASAccelerometer) +asModulesMap.set('ASCompass', ASCompass) +asModulesMap.set('ASGyroscope', ASGyroscope) +asModulesMap.set('ASContact', ASContact) +asModulesMap.set('ASVibrator', ASVibrator) +asModulesMap.set('ASCapture', ASCapture) +asModulesMap.set('ASKeyboard', ASKeyboard) +asModulesMap.set('ASImage', ASImage) +asModulesMap.set('ASBrightness', ASBrightness) +asModulesMap.set('ASFile', ASFile) +asModulesMap.set('ASAudio', ASAudio) +asModulesMap.set('ASBGAudio', ASBGAudio) +asModulesMap.set('ASVideo', ASVideo) +asModulesMap.set('ASInterceptor', ASInterceptor) +asModulesMap.set('ASScan', ASScan) + +const moduleInstance = {} + +export function requireAPI (moduleName) { + if (!moduleInstance[moduleName]) { + console.debug('[AdvancedAPI] create %s', moduleName) + const XModule = asModulesMap.get(moduleName) + moduleInstance[moduleName] = new XModule() + } + return moduleInstance[moduleName] +} diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/module/interface.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/interface.js new file mode 100644 index 0000000000..9051d71722 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/module/interface.js @@ -0,0 +1,317 @@ +import { interceptCallback } from '../callback/callback-intercept' +import JSCallback, { jsCallbackMap } from '../callback/JSCallback' + +import { + getSystemInfoSync, + getDeviceInfo, + getWindowInfo, + getAppBaseInfo, + getAppAuthorizeSetting, + getSystemSetting, + openAppAuthorizeSetting +} from '../as/device/system' +import { navigateTo, redirectTo, navigateBack } from '../as/router/navigate' +import { + getLocation, + onLocationChange, + offLocationChange, + onLocationChangeError, + offLocationChangeError, + startLocationUpdate, + startLocationUpdateBackground, + stopLocationUpdate +} from '../as/location/location' +import { makePhoneCall } from '../as/telephony/telephony' +import { request, uploadFile, downloadFile } from '../as/request/request' +import { + openBluetoothAdapter, + startBluetoothDevicesDiscovery, + onBluetoothDeviceFound, + offBluetoothDeviceFound, + stopBluetoothDevicesDiscovery, + onBluetoothAdapterStateChange, + offBluetoothAdapterStateChange, + getConnectedBluetoothDevices, + getBluetoothAdapterState, + closeBluetoothAdapter, + getBluetoothDevices, + setBLEMTU, + writeBLECharacteristicValue, + readBLECharacteristicValue, + onBLEConnectionStateChange, + offBLEConnectionStateChange, + onBLECharacteristicValueChange, + offBLECharacteristicValueChange, + notifyBLECharacteristicValueChange, + getBLEDeviceServices, + getBLEDeviceRSSI, + getBLEDeviceCharacteristics, + createBLEConnection, + closeBLEConnection +} from '../as/bluetooth/bluetooth' +import { + startWifi, + stopWifi, + getConnectedWifi, + getWifiList, + onGetWifiList, + offGetWifiList, + connectWifi, + onWifiConnected, + offWifiConnected, + onWifiConnectedWithPartialInfo, + offWifiConnectedWithPartialInfo +} from '../as/device/wifi' +import { startSoterAuthentication, checkIsSupportSoterAuthentication, checkIsSoterEnrolledInDevice } from '../as/device/authenication' +import { + onAccelerometerChange, + offAccelerometerChange, + startAccelerometer, + stopAccelerometer +} from '../as/device/accelerometer' +import { + onCompassChange, + offCompassChange, + startCompass, + stopCompass +} from '../as/device/compass' +import { + onGyroscopeChange, + startGyroscope, + stopGyroscope +} from '../as/device/gyroscope' +import { addPhoneContact } from '../as/device/contact' +import { vibrate, vibrateLong, vibrateShort } from '../as/device/vibrate' +import { onUserCaptureScreen, offUserCaptureScreen } from '../as/device/capture' +import { hideKeyboard, onKeyboardHeightChange, offKeyboardHeightChange } from '../as/keyboard/keyboard' +import { login, getUserInfo } from '../as/account/account' +import { + chooseImage, + getImageInfo, + saveImageToPhotosAlbum, + compressImage +} from '../as/media/image' +import { setScreenBrightness, getScreenBrightness, setKeepScreenOn } from '../as/device/brightness' +import { getFileInfo, getSavedFileInfo, getSavedFileList, removeSavedFile, saveFile, getFileSystemManager, openDocument } from '../as/file/file' +import { + createInnerAudioContext +} from '../as/media/audio' +import { + saveVideoToPhotosAlbum, + getVideoInfo, +} from '../as/media/video' +import { scanCode } from '../as/scan/scan' + +/** + * needPromise默认值是true:表示默认promise化 + * [methodName]: { method: [method], needPromise: {boolean}, needCallback: {boolean} } + * needPromise: false; needCallback:false 表示不需要封装promise和JSCallback,会直接把cp的参数透传给接口 + */ +export const asInterfaceList = { + // 设备系统 + getSystemInfoSync: { method: getSystemInfoSync, needPromise: false, needCallback: false }, + getDeviceInfo: { method: getDeviceInfo, needPromise: false }, + getWindowInfo: { method: getWindowInfo, needPromise: false }, + getAppBaseInfo: { method: getAppBaseInfo, needPromise: false }, + getAppAuthorizeSetting: { method: getAppAuthorizeSetting, needPromise: false }, + getSystemSetting: { method: getSystemSetting, needPromise: false }, + openAppAuthorizeSetting: { method: openAppAuthorizeSetting }, + + // 地理位置 + getLocation: { method: getLocation }, + onLocationChange: { method: onLocationChange }, + offLocationChange: { method: offLocationChange, needPromise: false }, + startLocationUpdate: { method: startLocationUpdate }, + startLocationUpdateBackground: { method: startLocationUpdateBackground }, + stopLocationUpdate: { method: stopLocationUpdate }, + onLocationChangeError: { method: onLocationChangeError }, + offLocationChangeError: { method: offLocationChangeError }, + // 电话 + makePhoneCall: { method: makePhoneCall }, + + // 网络 + request: { method: request }, + uploadFile: { method: uploadFile }, + downloadFile: { method: downloadFile }, + + // 页面和路由 + navigateTo: { method: navigateTo }, + redirectTo: { method: redirectTo }, + navigateBack: { method: navigateBack }, + + // 蓝牙 + openBluetoothAdapter: { method: openBluetoothAdapter }, + startBluetoothDevicesDiscovery: { method: startBluetoothDevicesDiscovery }, + onBluetoothDeviceFound: { method: onBluetoothDeviceFound, needPromise: false, needCallback: false }, + offBluetoothDeviceFound: { method: offBluetoothDeviceFound, needPromise: false, needCallback: false }, + stopBluetoothDevicesDiscovery: { method: stopBluetoothDevicesDiscovery }, + onBluetoothAdapterStateChange: { method: onBluetoothAdapterStateChange, needPromise: false, needCallback: false }, + offBluetoothAdapterStateChange: { method: offBluetoothAdapterStateChange, needPromise: false, needCallback: false }, + getConnectedBluetoothDevices: { method: getConnectedBluetoothDevices }, + getBluetoothAdapterState: { method: getBluetoothAdapterState }, + closeBluetoothAdapter: { method: closeBluetoothAdapter }, + getBluetoothDevices: { method: getBluetoothDevices }, + // 低功耗蓝牙 + setBLEMTU: { method: setBLEMTU }, + writeBLECharacteristicValue: { method: writeBLECharacteristicValue }, + readBLECharacteristicValue: { method: readBLECharacteristicValue }, + onBLEConnectionStateChange: { method: onBLEConnectionStateChange, needPromise: false, needCallback: false }, + offBLEConnectionStateChange: { method: offBLEConnectionStateChange, needPromise: false, needCallback: false }, + onBLECharacteristicValueChange: { method: onBLECharacteristicValueChange, needPromise: false, needCallback: false }, + offBLECharacteristicValueChange: { method: offBLECharacteristicValueChange, needPromise: false, needCallback: false }, + notifyBLECharacteristicValueChange: { method: notifyBLECharacteristicValueChange }, + getBLEDeviceServices: { method: getBLEDeviceServices }, + getBLEDeviceRSSI: { method: getBLEDeviceRSSI }, + getBLEDeviceCharacteristics: { method: getBLEDeviceCharacteristics }, + createBLEConnection: { method: createBLEConnection }, + closeBLEConnection: { method: closeBLEConnection }, + + // 传感器 + onAccelerometerChange: { method: onAccelerometerChange, needPromise: false, needCallback: false }, + offAccelerometerChange: { method: offAccelerometerChange, needPromise: false, needCallback: false }, + startAccelerometer: { method: startAccelerometer }, + stopAccelerometer: { method: stopAccelerometer }, + // 当接口参数中包含开发者的回调接口,比如监听的场景,接口框架不需要额外创建callBack对象,此时通过needCallback关键字控制 + onCompassChange: { method: onCompassChange, needPromise: false, needCallback: false }, + offCompassChange: { method: offCompassChange, needPromise: false, needCallback: false }, + startCompass: { method: startCompass }, + stopCompass: { method: stopCompass }, + onGyroscopeChange: { method: onGyroscopeChange, needPromise: false, needCallback: false }, + startGyroscope: { method: startGyroscope }, + stopGyroscope: { method: stopGyroscope }, + // wifi + startWifi: { method: startWifi }, + stopWifi: { method: stopWifi }, + getConnectedWifi: { method: getConnectedWifi }, + getWifiList: { method: getWifiList }, + onGetWifiList: { method: onGetWifiList, needPromise: false, needCallback: false }, + offGetWifiList: { method: offGetWifiList, needPromise: false, needCallback: false }, + connectWifi: { method: connectWifi }, + onWifiConnected: { method: onWifiConnected, needPromise: false, needCallback: false }, + offWifiConnected: { method: offWifiConnected, needPromise: false, needCallback: false }, + onWifiConnectedWithPartialInfo: { method: onWifiConnectedWithPartialInfo, needPromise: false, needCallback: false }, + offWifiConnectedWithPartialInfo: { method: offWifiConnectedWithPartialInfo, needPromise: false, needCallback: false }, + + // 生物认证 + startSoterAuthentication: { method: startSoterAuthentication }, + checkIsSupportSoterAuthentication: { method: checkIsSupportSoterAuthentication }, + checkIsSoterEnrolledInDevice: { method: checkIsSoterEnrolledInDevice }, + + // 联系人 + addPhoneContact: { method: addPhoneContact }, + + // 振动 + vibrate: { method: vibrate }, + vibrateLong: { method: vibrateLong }, + vibrateShort: { method: vibrateShort }, + + // 截屏事件 + onUserCaptureScreen: { method: onUserCaptureScreen, needPromise: false, needCallback: false }, + offUserCaptureScreen: { method: offUserCaptureScreen, needPromise: false, needCallback: false }, + + // 键盘 + hideKeyboard: { method: hideKeyboard }, + onKeyboardHeightChange: { method: onKeyboardHeightChange, needPromise: false, needCallback: false }, + offKeyboardHeightChange: { method: offKeyboardHeightChange, needPromise: false, needCallback: false }, + + // 帐号 + login: { method: login }, + getUserInfo: { method: getUserInfo }, + + // 媒体 图片 + chooseImage: { method: chooseImage }, + getImageInfo: { method: getImageInfo }, + saveImageToPhotosAlbum: { method: saveImageToPhotosAlbum }, + compressImage: { method: compressImage }, + + // 屏幕亮度 + setScreenBrightness: { method: setScreenBrightness }, + getScreenBrightness: { method: getScreenBrightness }, + setKeepScreenOn: { method: setKeepScreenOn }, + + // 文件 + saveFile: { method: saveFile }, + getSavedFileList: { method: getSavedFileList }, + getSavedFileInfo: { method: getSavedFileInfo }, + removeSavedFile: { method: removeSavedFile }, + getFileInfo: { method: getFileInfo }, + openDocument: { method: openDocument }, + getFileSystemManager: { method: getFileSystemManager, needPromise: false, needCallback: false }, + + // 基础 + + // 媒体 录音管理 + + // 媒体 音频 + createInnerAudioContext: { method: createInnerAudioContext, needPromise: false, needCallback: false }, + + // 媒体 视频 + saveVideoToPhotosAlbum: { method: saveVideoToPhotosAlbum }, + getVideoInfo: { method: getVideoInfo }, + + // 二维码扫描 + scanCode: { method: scanCode }, +} + +function invokeModule (moduleName, ...args) { + console.debug('[AdvancedAPI] invokeModule moduleName = %s', moduleName) + const id = args.pop() + if (typeof id === 'number') { + let callback = jsCallbackMap.get(id) + if (!callback) { + callback = new JSCallback({ id }) + jsCallbackMap.set(id, callback) + } + args.push(callback) + } else { + args.push(id) + } + const values = asInterfaceList[moduleName] + triggerInterceptInvoke(moduleName, args) + const result = values.method.apply(null, args) + triggerInterceptReturnValue(moduleName, result) + return result +} + +function triggerInterceptInvoke (moduleName, args) { + const interceptor = requireAPI('ASInterceptor') + if (asInterfaceList[moduleName].needCallback !== false) { + const params = [...args] + params.pop() + interceptor.invoke(moduleName, params) + } +} + +function triggerInterceptReturnValue (moduleName, args) { + const interceptor = requireAPI('ASInterceptor') + interceptor.returnValue(moduleName, args) +} + +export function createAs() { + const as = {} + const moduleNames = Object.keys(asInterfaceList) + moduleNames.forEach(moduleName => { + Object.defineProperty(as, moduleName, { + get: () => { + return (...args) => { + const cbResult = interceptCallback(args, + moduleName, + asInterfaceList[moduleName].needPromise, + asInterfaceList[moduleName].needCallback) + args = cbResult.args || [] + const promise = cbResult.promise + const result = invokeModule(moduleName, ...args) + if (promise) { + return promise.promise + } + return result + } + } + }) + }) + return as +} + +const as = createAs() + +export default as diff --git a/ohos/AdvancedAPI_OHOS/src/advancedApi/util/index.js b/ohos/AdvancedAPI_OHOS/src/advancedApi/util/index.js new file mode 100644 index 0000000000..30fb5af2f0 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/advancedApi/util/index.js @@ -0,0 +1,204 @@ +import { isString, isNumber } from '../../base/util/checkDataType' +import { colors } from '../../base/util/colors' +import { context } from '../../base/bridge/abilityBase' +import fs from '@ohos.file.fs' +import photoAccessHelper from '@ohos.file.photoAccessHelper' +import dataSharePredicates from '@ohos.data.dataSharePredicates' +import { MediaLibraryBase } from '../../base/bridge/mediaLibraryBase' + +// 转换背景色为Hex argb +export function convertColorToHexARGB(color, opacity) { + if (!isString(color)) { + color = '#FFFFFF' + } + if (color.trim().match(/^[A-z]+$/) && colors[color]) { + color = `rgb(${colors[color].join(',')})` + } + if (color === 'transparent') { + return '#00000000' + } + + if (!isNumber(opacity) || opacity < 0 || opacity > 1) { + opacity = 1 + } + + if (color.startsWith('rgb')) { + const arr = color.split(',') + if (arr.length < 3) { + return color + } + if (arr.length === 4) { + const temp = arr.pop() + arr.unshift(temp) + } else { + arr.unshift(String(opacity)) + } + + return arr.reduce((prev, current, index) => { + let hex = current.replace(/[^\d\\.]/gi, '') + hex = index === 0 ? parseInt(hex * 255) : parseInt(hex) + hex = hex.toString(16).toUpperCase() + if (hex.length === 1) { + hex = `0${hex}` + } + return prev + hex + }, '#') + } + + if (color.startsWith('#')) { + // #fff ----> #ffffff + if (color.length === 4) { + color = `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}` + } + if (color.length === 7) { + const hex = color.slice(1) + let opacityHex = parseInt(opacity * 255).toString(16).toUpperCase() + if (opacityHex.length === 1) { + opacityHex = `0${opacityHex}` + } + return `#${opacityHex}${hex}` + } + } + + return color +} + +export function switchInternalToHapSandBox(path) { + if (path.startsWith('internal://bundle/')) { + return path.replace('internal://bundle', context.bundleCodeDir) + } + if (path.startsWith('internal://cache/')) { + return path.replace('internal://cache', context.cacheDir) + } + if (path.startsWith('internal://files/')) { + return path.replace('internal://files', context.filesDir) + } + if (path.startsWith('internal://preferences/')) { + return path.replace('internal://preferences', context.preferencesDir) + } + if (path.startsWith('internal://temp/')) { + return path.replace('internal://temp', context.tempDir) + } + if (path.startsWith('internal://database/')) { + return path.replace('internal://database', context.databaseDir) + } + if (path.startsWith('internal://distributedFiles/')) { + return path.replace('internal://distributedFiles', context.distributedFilesDir) + } + return path +} +export function switchHapSandBoxToInternal(path) { + if (path.startsWith(context.bundleCodeDir)) { + return path.replace(context.bundleCodeDir, 'internal://bundle') + } + if (path.startsWith(context.cacheDir)) { + return path.replace(context.cacheDir, 'internal://cache') + } + if (path.startsWith(context.filesDir)) { + return path.replace(context.filesDir, 'internal://files') + } + if (path.startsWith(context.preferencesDir)) { + return path.replace(context.preferencesDir, 'internal://preferences') + } + if (path.startsWith(context.tempDir)) { + return path.replace(context.tempDir, 'internal://temp') + } + if (path.startsWith(context.databaseDir)) { + return path.replace(context.databaseDir, 'internal://database') + } + if (path.startsWith(context.distributedFilesDir)) { + return path.replace(context.distributedFilesDir, 'internal://distributedFiles') + } + return path +} +export function isFileUri(path) { + return path && typeof (path) === 'string' && (path.startsWith('file://') || path.startsWith('datashare://')) +} + +export function isSandboxPath(path) { + return path && typeof (path) === 'string' && (path.startsWith('/data/storage/') || path.startsWith('internal://')) +} +export function getFdFromUriOrSandBoxPath(uri) { + try { + const file = fs.openSync(uri, fs.OpenMode.READ_ONLY) + return file.fd + } catch (error) { + console.info(`[AdvancedAPI] Can not get file from uri: ${uri} `) + } + throw new Error('file is not exist') +} + +export async function getFileAssetFromUri(uri) { + try { + const permission = await MediaLibraryBase.getPermissions() + if (permission.perNum === -1) { + console.debug(`[AdvancedAPI] permission fail`) + } + const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context) + const predicates = new dataSharePredicates.DataSharePredicates() + console.debug(`[AdvancedAPI] getFileAssetFromUri uri: ${uri} `) + predicates.equalTo(photoAccessHelper.PhotoKeys.URI, uri.toString()) + const fetchOption = { + fetchColumns: [ + photoAccessHelper.PhotoKeys.URI, + photoAccessHelper.PhotoKeys.PHOTO_TYPE, + photoAccessHelper.PhotoKeys.SIZE, + photoAccessHelper.PhotoKeys.DURATION, + photoAccessHelper.PhotoKeys.WIDTH, + photoAccessHelper.PhotoKeys.HEIGHT, + photoAccessHelper.PhotoKeys.TITLE, + photoAccessHelper.PhotoKeys.ORIENTATION, + ], + predicates: predicates + } + const fetchResult = await phAccessHelper.getAssets(fetchOption) + console.debug(`[AdvancedAPI] getFileAssetFromUri fetchResult: ${JSON.stringify(fetchResult)} `) + const asset = await fetchResult.getFirstObject() + console.debug(`[AdvancedAPI] getFileAssetFromUri asset: ${JSON.stringify(asset)} `) + fetchResult.close() + return asset + } catch (err) { + console.debug(`[AdvancedAPI] getAsset is fail!,${err}`) + } +} + +export function pathToCache(path) { + try { + const srcDirUriLocal = switchInternalToHapSandBox(path) + const fileName = srcDirUriLocal.slice(srcDirUriLocal.lastIndexOf('/')) + const dstDirUriLocal = context.cacheDir + fileName + fs.copyFile(srcDirUriLocal, dstDirUriLocal, (err) => { + if (err) { + console.info(`[AdvancedAPI] Failed to copy: ${JSON.stringify(err)}`) + return + } + }) + return switchHapSandBoxToInternal(dstDirUriLocal) + } catch (err) { + console.error(`[AdvancedAPI] to copy: ${JSON.stringify(err)}`) + } +} + +export async function saveMedia(photoType, displayName, uri, buffer) { + try { + const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context) + const mediaType = displayName.split('.').pop().toString() + const mediaName = displayName.split('.').shift().toString() + const photoCreationConfig = [ + { + title: mediaName.toString(), + fileNameExtension: mediaType.toString(), + photoType: photoType, + } + ] + const srcFileUris = [uri.toString()] + const phUris = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfig) + const phUri = phUris[0] + const file = fs.openSync(phUri, fs.OpenMode.READ_WRITE) + await fs.write(file.fd, buffer) + fs.closeSync(file) + return phUri + } catch (err) { + console.error(`[AdvancedAPI] saveMedia is fail!: ${JSON.stringify(err)}`) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/abilityBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/abilityBase.js new file mode 100644 index 0000000000..1d88d34f20 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/abilityBase.js @@ -0,0 +1,70 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: ohos ability + * Author: weisufang + * Create: 03/7/2022 + * Notes: N/A + */ + +import abilityFeatureAbility from '@ohos.ability.featureAbility' + +let context = abilityFeatureAbility.getContext() +function initContextOnStageModel (contextOnStageMode) { + context = contextOnStageMode + if (!context.startAbilityForResult) { + context.startAbilityForResult = context.startAbility + } + context.getAbilityInfo = function() { + return new Promise((resolve, reject) => { + try { + resolve(this.abilityInfo) + } catch (error) { + reject(error) + } + }) + } + context.getFilesDir = function() { + return new Promise((resolve, reject) => { + try { + resolve(this.filesDir) + } catch (error) { + reject(error) + } + }) + } + context.getCacheDir = function() { + return new Promise((resolve, reject) => { + try { + resolve(this.cacheDir) + } catch (error) { + reject(error) + } + }) + } +} + +class AbilityBase { + static abilityInfo = {} + + static hasAbilityInfo = false + + static getAbilityInfo () { + return new Promise((resolve, reject) => { + if (this.hasAbilityInfo) { + resolve(this.abilityInfo) + return + } + context.getAbilityInfo().then(data => { + this.hasAbilityInfo = true + this.abilityInfo = data + console.log('[QAFAPI] getAbilityInfo successful. ') + resolve(data) + }).catch((error) => { + console.error('[QAFAPI] getAbilityInfo failed. Cause: ' + JSON.stringify(error)) + reject(error) + }) + }) + } +} + +export { abilityFeatureAbility, context, AbilityBase, initContextOnStageModel } diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/bluetoothBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/bluetoothBase.js new file mode 100644 index 0000000000..f7c9a699fb --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/bluetoothBase.js @@ -0,0 +1,185 @@ +import bluetoothManager from '@ohos.bluetoothManager' +import access from '@ohos.bluetooth.access'; +import ble from '@ohos.bluetooth.ble'; +import connection from '@ohos.bluetooth.connection'; +import abilityAccessCtrl from '@ohos.abilityAccessCtrl' +import {context} from './abilityBase'; +// 扫描模式配置项 +export const SCAN_MODE = { + LIMITED: 5, + DURATION: 0 +} +export class BluetoothBase { + + static getPermissions() { + // 权限列表 + const arrMdl = ['ohos.permission.ACCESS_BLUETOOTH']; // 允许应用接入蓝牙并使用蓝牙能力 + const atManager = abilityAccessCtrl.createAtManager(); + return new Promise(async resolve => { + const { authResults } = await atManager.requestPermissionsFromUser(context, arrMdl) + if (authResults[0] === 0) { + resolve(true); // 通过用户许可 + }else { + resolve(false); // 未通过用户许可 + } + }) + } + + // 订阅蓝牙连接状态改变事件 + static onStateChange(callback) { + try { + return access.on('stateChange', callback) + } catch (err) { + console.warn('[AdvancedAPI] on bondStateChange fail') + } + } + + // 订阅蓝牙设备发现上报事件 + static on(onReceiveEvent) { + try { + return connection.on('bluetoothDeviceFind', onReceiveEvent) + } catch (err) { + console.warn('[AdvancedAPI] on fail') + } + } + + // 订阅低功耗设备发现上报事件 + static onBLE(onReceiveEvent) { + try { + ble.on('BLEDeviceFind', onReceiveEvent) + } catch (err) { + console.warn('[AdvancedAPI] BLE.on.BLEDeviceFind fail') + } + } + + // 创建client端实例 + static createGattClientDevice(deviceId) { + try { + return ble.createGattClientDevice(deviceId) + } catch (err) { + console.warn('[AdvancedAPI] createGattClientDevice fail') + } + } + // 打开蓝牙 + static enableBluetooth() { + try { + return access.enableBluetooth() + } catch (err) { + console.warn('[AdvancedAPI] enableBluetooth fail') + } + } + + // 关闭蓝牙 + static disableBluetooth() { + try { + return access.disableBluetooth() + } catch (err) { + console.warn('[AdvancedAPI] disableBluetooth fail') + } + } + + // 蓝牙开关状态 + static bluetoothState() { + try { + return access.getState() + } catch (err) { + // console.warn('[AdvancedAPI] getState fail') + console.error('[AdvancedAPI] getState fail, errCode: ' + err.code + ', errMessage: ' + err.message); + } + } + + // 开启蓝牙扫描 + static startBluetoothDiscovery() { + // 设置蓝牙扫描模式为可连接limited发现模式,设置为0为持续可发现,设置成功返回true + connection.setBluetoothScanMode( + connection.ScanMode.SCAN_MODE_LIMITED_DISCOVERABLE, + SCAN_MODE.DURATION + ) + + // 开启蓝牙扫描,成功返回true,否则返回false + try { + return connection.startBluetoothDiscovery() + } catch (err) { + console.warn('[AdvancedAPI] startBluetoothDiscovery fail') + } + } + + // 取消订阅蓝牙设备发现上报事件 + static off() { + try { + return connection.off('bluetoothDeviceFind') + } catch (err) { + console.warn('[AdvancedAPI] off fail') + } + } + + // 获取对端蓝牙设备的名称 + static getRemoteDeviceName(deviceId) { + try { + return connection.getRemoteDeviceName(deviceId) + } catch (err) { + console.warn('[AdvancedAPI] getRemoteDeviceName fail') + } + } + + // 关闭蓝牙扫描 + static stopBluetoothDiscovery() { + // 关闭蓝牙扫描,成功返回true,否则返回false + try { + return connection.stopBluetoothDiscovery() + } catch (err) { + console.warn('[AdvancedAPI] no need to stop') + } + } + + // 开启低功耗蓝牙扫描 + static startBLEScan(interval) { + try { + ble.startBLEScan(null, { + interval, + dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER, + matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE, + }) + } catch (err) { + console.error( + '[QAFAPI] startBLEScan errCode:' + err.code + ',errMessage:' + err.message + ) + } + } + + // 关闭低功耗蓝牙扫描 + static stopBLEScan() { + try { + ble.stopBLEScan() + } catch (err) { + console.error('[QAFAPI] stopBLEScan errCode:' + err.code + ',errMessage:' + err.message) + } + } + + // 取消订阅低功耗设备发现上报事件 + static offBLE() { + try { + ble.off('BLEDeviceFind') + } catch (err) { + console.warn('[AdvancedAPI] BLE.off.BLEDeviceFind fail') + } + } + + // 获取已经连接的设备地址列表 + static getProfile(ProfileId) { + try { + const a2dpSrc = bluetoothManager.getProfileInstance(ProfileId) + return a2dpSrc.getConnectionDevices() + } catch (err) { + console.warn('[AdvancedAPI] getProfileInstance fail') + } + } + + static getConnectedBLEDevices() { + try { + return ble.getConnectedBLEDevices() + } catch (err) { + console.error('[AdvancedAPI]getConnectedBLEDevices errCode:' + err.code + ',errMessage:' + err.message) + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/brightnessBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/brightnessBase.js new file mode 100644 index 0000000000..709e30757f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/brightnessBase.js @@ -0,0 +1,19 @@ +import { context } from './abilityBase' +import settings from '@ohos.settings' + +const name = settings.display.SCREEN_BRIGHTNESS_STATUS +export class BrightnessBase { + static ohoGetValue() { + const SETTINGMAX = 100 + const VAlUEMAX = 255 + try { + // 获取数据项亮度的值(该数据项在数据库中已存在) + const value = settings.getValueSync(context, name, '1') + console.log('[AdvancedAPI] success to get brightness. value:' + value) + Math.round(value * (VAlUEMAX / SETTINGMAX)) + return value + } catch (error) { + console.log('[QAFAPI] Failed to get brightness. Cause:' + JSON.stringify(error)) + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/deviceBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/deviceBase.js new file mode 100644 index 0000000000..11a0c2e897 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/deviceBase.js @@ -0,0 +1,14 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: @ohos.deviceInfo + * Author: wangtianpeng + * Create: 03/14/2022 + * Notes: N/A + */ + +import deviceInfo from '@ohos.deviceInfo' +export class DeivceBase { + static getDeviceInfo () { + return deviceInfo + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/displayBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/displayBase.js new file mode 100644 index 0000000000..59f4ddd604 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/displayBase.js @@ -0,0 +1,21 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: @ohos.display + * Author: wangtianpeng + * Create: 03/14/2022 + * Notes: N/A + */ + +import display from '@ohos.display' + +export class DisplayBase { + static ohosGetDisplay () { + let displayClass = null + try { + displayClass = display.getDefaultDisplaySync(); + } catch (exception) { + console.error(`[QAFAPI] display error message: ${JSON.stringify(exception)}`); + } + return displayClass + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/fileioBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/fileioBase.js new file mode 100644 index 0000000000..a2b24ca732 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/fileioBase.js @@ -0,0 +1,56 @@ +import fs from '@ohos.file.fs' +import fileuri from '@ohos.file.fileuri' +export class FileioBase { + static ohosOpendirSync(path) { + return new OhosOpendir(path) + } + + // 同步读取文件 + static ohosReadSync(fd, buf) { + return fs.readSync(fd, buf) + } + static ohosUnlinkSync(path) { + return fs.unlinkSync(path) + } + static ohosCopy (src, dest, mode = 0) { + return fs.copyFile(src, dest, mode) + } + static ohosMkdirSync(path, mode = 0o775) { + return fs.mkdirSync(path) + } + static ohosReadTextSync(filePath, options) { + return fs.readTextSync(filePath, options) + } + + // 同步获取文件资源信息 + static ohosStatSync(path) { + return fs.statSync(path) + } + + // 同步打开文件获取描述符 + static ohosOpenSync(path, flags, mode = 0o666) { + if (path && typeof (path) === 'string' && path.startsWith('/data/storage/')) { + path = fileuri.getUriFromPath(path) + } + return fs.openSync(path, flags) + } + + // 同步写入文件 + static ohosWriteSync(fd, buffer, options = {}) { + return fs.writeSync(fd, buffer, options) + } + + static ohosAccessSync(path, mode = 0) { + return fs.accessSync(path) + } +} +class OhosOpendir { + constructor(path) { + this.dir = fs.listFileSync(path) + } + + ohosReadsync() { + return this.dir + } +} + diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/mediaLibraryBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/mediaLibraryBase.js new file mode 100644 index 0000000000..5d38313e81 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/mediaLibraryBase.js @@ -0,0 +1,77 @@ +import { context } from './abilityBase' +import abilityAccessCtrl from '@ohos.abilityAccessCtrl' +import photoAccessHelper from '@ohos.file.photoAccessHelper' + +export class MediaLibraryBase { + static getPermissions() { + try { + // 权限列表 + const arrMdl = [ + 'ohos.permission.SHORT_TERM_WRITE_IMAGEVIDEO' + ] + const atManager = abilityAccessCtrl.createAtManager() + return new Promise(resolve => { + atManager.requestPermissionsFromUser(context, arrMdl).then(per => { + const perNum = per.authResults[0] + const dialogShownResults = per.dialogShownResults[0] + resolve({ perNum, dialogShownResults }) + }) + }) + } catch (error) { + console.error('[AdvancedAPI] getPermissions is fail!', JSON.stringify(error)) + } + } + // 获取媒体类型枚举值 + static getMediaType(type) { + return photoAccessHelper.PhotoType[type] + } + + // 获取检索列名枚举值 + static getFileKey() { + return photoAccessHelper.PhotoKeys + } + + // 获取媒体库实例用来访问文件的一系列操作 + static getMedia() { + return photoAccessHelper.getPhotoAccessHelper(context) + } + + // 创建媒体资源 + static async createAsset(media, mediaType, displayName) { + // eslint-disable-next-line camelcase + const media_type = displayName.split('.').pop().toString() + // eslint-disable-next-line camelcase + const media_name = displayName.split('.').shift().toString() + const options = { + title: media_name + } + const uri = await media.createAsset(mediaType, media_type, options) + return uri// Promise + } + + // 关闭媒体库资源文件 + static closeAsset(asset, fd) { + return new Promise(resolve => { + asset.close(fd, (closeErr) => { + if (closeErr !== undefined) { + resolve(false) + } else { + resolve(true) + } + }) + }) + } + + // 获取创建文件的描述符 + static getFd(asset) { + return new Promise(resolve => { + asset.open('rw') + .then((fd) => { + resolve(fd) + }) + .catch(() => { + resolve(false) + }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/networkBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/networkBase.js new file mode 100644 index 0000000000..b8f75ec35a --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/networkBase.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: ohos network 模块 + * Author: qianchen + * Create: 06/06/2023 + * Notes: N/A + */ +import network from '@system.network' +export class NetworkBase { + static ohoSubscribe(data) { + const { callback, fail } = data + network.subscribe({ + success: function (data) { + console.log('[QAFAPI] success to subscribe network:' + data.metered + 'type:,' + data.type) + if (callback) { + callback(data) + } + }, + fail: function (err, code) { + console.error('[QAFAPI] fail to subscribe network, code:' + code + ', err:' + err) + if (fail) { + fail(err) + } + } + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/promptBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/promptBase.js new file mode 100644 index 0000000000..a370dc5300 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/promptBase.js @@ -0,0 +1,26 @@ +import promptAction from '@ohos.promptAction' +export class PromptBase { + static showToast (params) { + return new Promise((resolve, reject) => { + promptAction.showToast(params) + resolve() + }) + } + + static showDialog (params, callback) { + return new Promise((resolve, reject) => { + promptAction.showDialog(params, callback) + }) + } + + static showActionMenu (params, callback) { + return new Promise((resolve, reject) => { + promptAction.showActionMenu(params, callback) + }) + } + + // 弹框(返回promise) + static ohosShowDialog (params) { + return promptAction.showDialog(params) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/radioBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/radioBase.js new file mode 100644 index 0000000000..fb13fd9cc9 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/radioBase.js @@ -0,0 +1,45 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: ohos radio 模块 + * Author: shenrui + * Create: 04/11/2022 + * Notes: N/A + */ + +import radio from '@ohos.telephony.radio' + +// 网络类型 +export const netWorkConnState = { + UNKNOWN: 0, // 未知网络类型。 + GSM: 1, // 网络类型为GSM(Global System For Mobile Communication)。 + CDMA: 2, // 网络类型为CDMA(Code Division Multiple Access)。 + WCDMA: 3, // 网络类型为WCDMA(Wideband Code Division Multiple Access)。 + TDSCDMA: 4, // 网络类型为TDSCDMA(TimeDivision-Synchronous Code Division Multiple Access)。 + LTE: 5, // 网络类型为LTE(Long Term Evolution)。 + NR: 6 // 网络类型为5G NR(New Radio) +} + +export class RadioBase { + static ohoGetSignalInformation(slotId) { + return new Promise((resolve, reject) => { + radio.getSignalInformation(slotId, (err, data) => { + if (err) { + console.log('[QAFAPI] Failed to get signal information Data. Cause:' + JSON.stringify(err)) + reject(err) + } else { + console.log('[QAFAPI] Success to get signal information Data:' + JSON.stringify(data)) + resolve(data) + } + }) + }) + } + + static ohoIsNrSupported(slotId) { + try { + const result = radio.isNrSupported(slotId) + return result + } catch (err) { + console.error('[QAFAPI] Failed get is supported 5G:' + err) + } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/securityBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/securityBase.js new file mode 100644 index 0000000000..0a8807795f --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/securityBase.js @@ -0,0 +1,17 @@ +import cryptoFramework from '@ohos.security.cryptoFramework' +export class SecurityBase { + static rsa(algName, blob) { + return new Promise(async (resolve, reject) => { + let md + try { + md = cryptoFramework.createMd(algName) + await md.update(blob) + const mdOutput = await md.digest() + resolve(mdOutput.data) + } catch (error) { + console.error('[QAFAPI]: rsa fail error code: ' + error.code + ', message is: ' + error.message) + reject(error) + } + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/sensorBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/sensorBase.js new file mode 100644 index 0000000000..b53921cec8 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/sensorBase.js @@ -0,0 +1,46 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: 封装鸿蒙sensor模块 + * Author: qianyuanyuan + * Create: 3/31/2022 + * Notes: N/A + */ + +import sensor from '@ohos.sensor' + +export class OhosSensorBase { + static ohosSubscribeAccelerometer(data) { + const { interval, callback } = data + sensor.on(sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER, (data) => { + callback(data) + }, + { interval: interval } + ) + } + + static ohosUnsubscribeAccelerometer() { + sensor.off(sensor.SensorType.SENSOR_TYPE_ID_ACCELEROMETER) + } + + static ohosSubscribeCompass(data) { + const { callback } = data + sensor.on(sensor.SensorType.SENSOR_TYPE_ID_ORIENTATION, (data) => { + callback(data) + }) + } + + static ohosUnsubscribeCompass() { + sensor.off(sensor.SensorType.SENSOR_TYPE_ID_ORIENTATION) + } + + static ohosSubscribeGyroscope(object) { + const { intervalValue, callback } = object + sensor.on(sensor.SensorId.GYROSCOPE, (data) => { + callback(data) + }, { interval: intervalValue }) + } + + static ohosUnsubscribeGyroscope() { + sensor.off(sensor.SensorId.GYROSCOPE) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/wantConstantBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/wantConstantBase.js new file mode 100644 index 0000000000..ddb5f2e840 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/wantConstantBase.js @@ -0,0 +1,6 @@ +import wantConstant from '@ohos.ability.wantConstant' +export class WantConstantBase { + static getAction(type) { + return wantConstant.Action[type] + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/wifiBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/wifiBase.js new file mode 100644 index 0000000000..57ce3bd8af --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/wifiBase.js @@ -0,0 +1,69 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: ohos wifi 模块 + * Author: qianchen + * Create: 04/11/2022 + * Notes: + */ + +import wifi from '@ohos.wifi' +export class WifiBase { + static ConnState = { + SCANNING: 0, // 设备正在搜索可用的AP + CONNECTING: 1, // 设备正在搜索可用的AP。 + AUTHENTICATING: 2, // WLAN连接正在认证中 + OBTAINING_IPADDR: 3, // 正在获取WLAN连接的IP地址 + CONNECTED: 4, // WLAN连接已建立 + DISCONNECTING: 5, // WLAN连接正在断开 + DISCONNECTED: 6, // WLAN连接已断开 + UNKNOWN: 7// WLAN连接建立失败 + } + static isWifiActive () { + return wifi.isWifiActive() + } + + static scan () { + return wifi.scan() + } + static ohoGetLinkedInfo() { + return new Promise((resolve, reject) => { + wifi.getLinkedInfo((err, data) => { + if (err) { + console.log('[QAFAPI] get linked info error:' + err) + reject(err) + } else { + console.log('[QAFAPI] get wifi linked info: ' + JSON.stringify(data)) + resolve(data) + } + }) + }) + } + static connectionChange (cb) { + wifi.on('wifiConnectionChange', cb) + } + + static StateType = { + OFF: 0, + ON: 1 + } + + static scanStateChange (cb) { + wifi.on('wifiScanStateChange', cb) + } + + static ScanState = { + SUCCESS: 1, + FAIL: 0 + } + + static getScanInfos () { + return new Promise((resolve, reject) => { + wifi.getScanInfos().then(scanResult => { + resolve(scanResult) + }).catch(error => { + console.info('[QAFAPI] getScanInfos error ' + JSON.stringify(error)) + reject(error) + }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/bridge/windowBase.js b/ohos/AdvancedAPI_OHOS/src/base/bridge/windowBase.js new file mode 100644 index 0000000000..d65f334a49 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/bridge/windowBase.js @@ -0,0 +1,64 @@ +import oWindow from '@ohos.window' + +export const TYPE_SYSTEM = 1 // 表示系统窗口 + +function getWinDisplay(ctx) { + return new Promise(res => { + if (globalThis.isStageModel) { + oWindow.getLastWindow(ctx, (err, data) => { + if (err.code) { + console.error('[QAFAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(err)) + } else { + res(data) + } + }) + } else { + oWindow.getLastWindow((err, data) => { + if (err.code) { + console.error('[QAFAPI] Failed to obtain the top window. Cause: ' + JSON.stringify(err)) + } else { + res(data) + } + }) + } + }) +} + +export class AsyncWindowBase { + static async getWindow (ctx) { + const windowClass1 = await getWinDisplay(ctx) + return new Promise(res => { + windowClass1.getProperties().then((data) => { + if (data.type === TYPE_SYSTEM) { + res(data.windowRect) + } + }).catch((err) => { + console.error('[QAFAPI] window.getProperties Failed to obtain the area. Cause:' + JSON.stringify(err)) + }) + }) + } + static async getCutout (ctx) { + const windowClass2 = await getWinDisplay(ctx) + return new Promise(res => { + windowClass2.getAvoidArea(oWindow.AvoidAreaType.TYPE_CUTOUT, (errs, data) => { + if (errs.code) { + console.error('[QAFAPI] window Failed to obtain the area. Cause:' + JSON.stringify(errs)) + } else { + res(data) + } + }) + }) + } + static async getSystemCutout (ctx) { + const windowClass2 = await getWinDisplay(ctx) + return new Promise(res => { + windowClass2.getAvoidArea(oWindow.AvoidAreaType.TYPE_SYSTEM, (errs, data) => { + if (errs.code) { + console.error('[QAFAPI] window Failed to obtain the area. Cause:' + JSON.stringify(errs)) + } else { + res(data) + } + }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/decorators/index.js b/ohos/AdvancedAPI_OHOS/src/base/decorators/index.js new file mode 100644 index 0000000000..8716eb851a --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/decorators/index.js @@ -0,0 +1,29 @@ +export function jsMethod (desc) { + return (target, key, descriptor) => { + let _jsMethods + // common 代表 方法为通用方法,所有模块共用 + if (desc && desc.common) { + _jsMethods = target.constructor._jsBaseMethods = target.constructor._jsBaseMethods || {} + } else { + _jsMethods = target.constructor._jsMethods = target.constructor._jsMethods || {} + } + desc = desc !== undefined ? desc : {} + const alias = desc.alias !== undefined ? desc.alias : key + const callback = desc.callback !== undefined ? desc.callback : true + const methodName = key + _jsMethods[alias] = { methodName, callback } + } +} + +export function jsField (desc) { + const PREFIX = '__FIELD__' + return (target, key, descriptor) => { + const _jsModuleAttrs = target.constructor._jsModuleAttrs = target.constructor._jsModuleAttrs || [] + desc = desc !== undefined ? desc : {} + const alias = desc.alias !== undefined ? desc.alias : key + const callback = desc.callback !== undefined ? desc.callback : true + const getMetName = desc.getMetName + const setMetName = desc.setMetName + _jsModuleAttrs[PREFIX + alias] = { getMetName, setMetName, callback } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseErrorCode.js b/ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseErrorCode.js new file mode 100644 index 0000000000..bd338a7bf8 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseErrorCode.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: 蓝牙模块错误码 + * Author: wangtianpeng + * Create: 04/26/2022 + */ + +export const BLHErrorCode = { + // 正常 + OK: 0, + + // 未启动连接 + NOT_INIT: 10000, + + // 当前蓝牙适配器不可用 + NOT_AVAILABLE: 10001, + + // 没有找到指定设备 + NO_DEVICE: 10002, + + // 连接失败 + CONNECTION_FAIL: 10003, + + // 没有找到指定服务 + NO_SERVICE: 10004, + + // 没有找到指定服务 + NO_CHARACTERISTIC: 10005, + + // 当前连接已断开 + NO_CONNECTION: 10006, + + // 当前特征值不支持此操作 + PROPERTY_NO_SUPPORT: 10007, + + // 当前特征值不支持此操作 + SYSTEM_ERROR: 10008, + + // 系统版本低于 5.0 不支持 BLE + SYSTRM_NOT_SUPPORT: 10009, + + // 入参不正确 + INVALID_PARAM: 202 +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseModule.js b/ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseModule.js new file mode 100644 index 0000000000..290910ae92 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/module/Bluetooth/BluetoothBaseModule.js @@ -0,0 +1,960 @@ +// 蓝牙开启状态 +import { jsMethod } from '../../decorators' +import { BluetoothBase } from '../../bridge/bluetoothBase' +import { BLHErrorCode, ErrorCode } from '../../util/ErrorCode' +import { isArray, isString, isArrayBuffer, isBoolean, isLower, isMac, isNumber, isUuid } from '../../util/checkDataType' +import { PromptBase } from '../../bridge/promptBase' + +export const BLESTATE = { + STATE_ON: 2, // 蓝牙已开启 + STATE_OFF: 0, // 蓝牙已关闭 + INDEX: 1, // 对话框允许按钮 + STATE_CONNECTED: 2, // 表示profile已连接 + STATE_DISCONNECTED: 0 // 表示profile已断连 +} + +// 默认值 +export const DEFAULT = { + OPEN: false, // 默认拒绝弹窗开启蓝牙 + OPEN_MSG: '快应用加载器想要开启蓝牙', + CLOSE_MSG: '快应用加载器请求关闭蓝牙', + ALLOW_BUTTON: '允许', + REFUSE_BUTTON: '拒绝' +} + +export class BluetoothBaseModule { + constructor() { + // 监听蓝牙适配器状态变化 + this.onadapterstatechange + + // 监听寻找到新设备的事件 + this.ondevicefound + + // 默认值为false。是否允许重复上报同一设备。如果允许重复上报,则bluetooth.ondevicefound 方法会多次上报同一设备,但是RSSI值会有不同。 + this.allowDuplicatesKey = false + + // 设备上报间隔 + this.interval = 0 + // 适配器状态 + this.state = { + available: BluetoothBase.bluetoothState() === BLESTATE.STATE_ON, // 蓝牙开启状态 + discovering: false // 是否处于扫描模式 cp执行开始扫描or停止函数时修改此变量 + } + // 存储成功连接ble设备的deviceId + this.deviceIdBle + + // 蓝牙开启期间扫描到的全部设备 + this.scanResult = [] + + // clent实例 + this.gattClient = null + // 扫描监听模式(true:低功耗,false:蓝牙) + this.isOnBle = { mode: false } + // 低功耗蓝牙连接状态 + this.stateBLE = {} + this.services = [] + this.bleCharacteristic = {} + this.characteristicValue = null + // uniapp需要初始化蓝牙,与快应用不一致 + this.isInit = false + + this.devicesFoundListeners = [] + this.adapterStateChangeListeners = [] + + this.BLEConnectionStateListeners = [] + this.BLECharacteristicListeners = [] + } + // 1.打开蓝牙 + @jsMethod({ alias: 'openAdapter', common: false, callback: true }) + openAdapter(object) { + const { operateAdapter = DEFAULT.OPEN } = object || {} // object默认值防止没传参 + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON // 获取当前设备蓝牙状态 + return new Promise((resolve, reject) => { + if (bluetoothState) { + resolve([['bluetooth is turned']]) // 当前蓝牙为打开状态时走success + } else { // 蓝牙未开启状态 + if (operateAdapter) { // 是否弹框显示允许/拒绝 + this.promptTemp(DEFAULT.OPEN_MSG) + .then(data => { + if (data.index === BLESTATE.INDEX) { // 选中允许按钮 + BluetoothBase.enableBluetooth() && resolve([[BLHErrorCode.OK]]) // 打开蓝牙返回0 + this.state.available = true // 修改全局监听对象 + } else { + reject([['user reject', BLHErrorCode.SYSTEM_ERROR]]) // 选中拒绝按钮返回fail + } + }) + } else { + reject([['not available', BLHErrorCode.NOT_AVAILABLE]]) // 拒绝弹框or未传参提示走fail + } + } + }) + } + + // 2.关闭蓝牙 + @jsMethod({ alias: 'closeAdapter', common: false, callback: true }) + closeAdapter(object) { + const { operateAdapter = DEFAULT.OPEN } = object || {} // object默认值防止没传参 + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_OFF // 获取当前设备蓝牙关闭状态 + return new Promise((resolve, reject) => { + if (bluetoothState) { + reject([['bluetooth is not turned', BLHErrorCode.NOT_INIT]]) // 当前蓝牙为关闭状态时走fail + } else { + if (operateAdapter) { + // 快应用拒绝时不会有任何调用 + this.promptTemp(DEFAULT.CLOSE_MSG) + .then(data => { + if (data.index === BLESTATE.INDEX) { // 选中允许按钮 + BluetoothBase.disableBluetooth() && resolve([[BLHErrorCode.OK]]) // 关闭蓝牙返回0 + this.state.available = false // 修改全局监听对象 + try { + BluetoothBase.offBLE() + } catch (err) { + console.error(`[QAFAPI] OpenHarmony Error ondevicefound,error Message:${err}`) + } + } + }) + } else { + resolve([['closeBluetoothAdapter success']]) // 并不能真正关闭蓝牙仅走成功回调(快应用逻辑问题) + } + } + }) + } + + // 3.获取本机蓝牙适配器状态 + @jsMethod({ alias: 'getAdapterState', common: false, callback: true }) + getAdapterState() { + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON // 获取当前设备蓝牙开启状态 + return new Promise((resolve) => { + resolve({ + discovering: this.state.discovering, + available: bluetoothState + }) + }) + } + + // 5.开始搜寻附近的蓝牙外围设备(参数只校验不处理) + @jsMethod({ alias: 'startDevicesDiscovery', common: false, callback: true }) + startDevicesDiscovery(object) { + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON // 获取当前设备蓝牙状态 + return new Promise((resolve, reject) => { + // 校验当前蓝牙状态 + if (!bluetoothState) { + reject([['bluetooth is not turned', BLHErrorCode.NOT_AVAILABLE]]) + return + } + + // 传参校验 + if (object) { + const { services, allowDuplicatesKey, interval } = object + if ( + (services && !isArray(services)) + || (allowDuplicatesKey && !isBoolean(allowDuplicatesKey)) + || (interval && !isNumber(interval))) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + + // services内部uuid校验 + let filters = [] + if (services) { + const isAllPass = services.every(serviceUuid => { + filters.push({ serviceUuid }) + return isUuid(serviceUuid.toLowerCase()) + }) + if (!isAllPass) { + reject([['uuid invalid', BLHErrorCode.NO_DEVICE]]) + return + } + + // 监听模式开关,当传入正确services时执行低功耗监听 + this.isOnBle.mode = true + } else { + filters = null + } + + // 调整全局重复上报参数 + if (allowDuplicatesKey) { + this.allowDuplicatesKey = allowDuplicatesKey + } + + // 调整全局上报设备间隔 + if (interval) { + this.interval = interval + } + } + + // 启动蓝牙扫描(蓝牙扫描兼容低功耗扫描) + BluetoothBase.startBLEScan(this.interval) + const isScanOpen = BluetoothBase.startBluetoothDiscovery() + + if (isScanOpen) { + this.state.discovering = true // 适配器扫描状态开启 + resolve('ok') + } else { + reject([[`[QAFAPI] openHarmony startBluetoothDiscovery fail`, BLHErrorCode.CONNECTION_FAIL]]) + } + }) + } + + // 6.停止搜寻附近的蓝牙外围设备 + @jsMethod({ alias: 'stopDevicesDiscovery', common: false, callback: true }) + stopDevicesDiscovery() { + return new Promise((resolve, reject) => { + // 仅有状态为0时认定为蓝牙处于关闭 + if (BluetoothBase.bluetoothState()) { + BluetoothBase.stopBLEScan() + const isScanClose = BluetoothBase.stopBluetoothDiscovery() + // 适配器扫描状态关闭 + this.state.discovering = false + if (isScanClose) { + resolve('ok') + this.devicesFoundListeners = [] + // 重置监听模式开关 + this.isOnBle.mode = false + + // 重置上报间隔 + this.interval = 0 + + // 重置重复上报 + this.allowDuplicatesKey = false + } else { + resolve('ok') + } + } else { + reject(['bluetooth is not turned', BLHErrorCode.NOT_AVAILABLE]) + } + }) + } + + // 7.获取在蓝牙模块生效期间所有已发现的蓝牙设备(依赖startDevicesDiscovery&&ondevicefound执行) + @jsMethod({ alias: 'getDevices', common: false, callback: true }) + getDevices() { + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON // 获取当前设备蓝牙状态 + return new Promise((resolve, reject) => { + if (bluetoothState) { + resolve([[{ devices: this.scanResult }]]) + } else { + reject([['bluetooth is not turned', BLHErrorCode.NOT_AVAILABLE]]) // 快应用无法测试到扫描关闭的情况 + } + }) + } + + saveDevice(resultObj) { + // 是否允许重复值(默认不重复) + if (this.allowDuplicatesKey) { + this.scanResult.push(resultObj) + } else { + if (!this.isRepeat(this.scanResult, resultObj.deviceId)) { + this.scanResult.push(resultObj) + } + } + } + + onFoundEvent(device) { + const resultObj = this.getTemp() + if (device[0] && device[0].deviceId) { + // 返回值 [{"deviceId":""XX:XX:XX:XX:XX:XX"","rssi":-71,"data":{}}] + const { deviceId, rssi, data } = device[0] + resultObj.deviceId = deviceId + resultObj.RSSI = rssi + resultObj.serviceData = data + try { + const GattClient = BluetoothBase.createGattClientDevice(deviceId) + GattClient.connect() + GattClient.getDeviceName((_, data) => { + resultObj.name = data + resultObj.localName = data + try { + GattClient.disconnect() + // 关闭临时客户端 + GattClient.close() + } catch (err) { + console.warn(`[QAFAPI] close client fail: ${JSON.stringify(err)}`) + } + this.saveDevice(resultObj) + }) + } catch (err) { + console.warn(`[QAFAPI] close client fail: ${JSON.stringify(err)}`) + } + } else { + // 返回值 ["XX:XX:XX:XX:XX:XX"] + resultObj.deviceId = device[0] + resultObj.name = BluetoothBase.getRemoteDeviceName(resultObj.deviceId) + resultObj.localName = resultObj.name + console.debug('[QAFAPI] onFoundEvent:' + JSON.stringify(resultObj)) + this.saveDevice(resultObj) + } + } + + // 9.根据 uuid 获取处于已连接状态的设备 + @jsMethod({ alias: 'getConnectedDevices', common: false, callback: true }) + getConnectedDevices(object) { + return new Promise((resolve, reject) => { + // 获取当前设备蓝牙状态 + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON + if (!bluetoothState) { + reject([['bluetooth is not turned', BLHErrorCode.NOT_AVAILABLE]]) + return + } + if (!object || !object.services || !isArray(object.services) || object.services.length === 0) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + console.debug('[QAFAPI] services : ' + JSON.stringify(object.services)) + // 参数校验(uuid) + const isRightServices = object.services.every(item => { + return isUuid(item.toLowerCase()) + }) || false + if (!object || !isRightServices) { + console.debug('[QAFAPI] invalidParam services ') + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + // 获取连接的低功耗设备(接口有问题不能正确返回) + let deviceIds = [] + try { + deviceIds = BluetoothBase.getConnectedBLEDevices() + } catch (err) { + console.error('[QAFAPI] errCode:' + err.code + ',errMessage:' + err.message) + } + console.debug('[QAFAPI] BleDeviceIds = ' + JSON.stringify(deviceIds)) + + // 0x0001 表示A2DP;0x0004 表示HFP, 0x0006 表示HID, 0x0007 表示PAN + const profileId = [0x0001, 0x0004, 0x0006, 0x0007] + + // 获取getProfile实例 + try { + // getProfile接口api9会导致闪退 + profileId.forEach(item => { + const profiles = BluetoothBase.getProfile(item) + console.error('[QAFAPI] profiles' + JSON.stringify(profiles)) + if (profiles) { + deviceIds = [...deviceIds, ...profiles] + } + }) + } catch (err) { + console.error('[QAFAPI] getProfile fail' + err) + } + + // 获取信息去重 + deviceIds = deviceIds.reduce((pr, cu) => pr.includes(cu) ? pr : [...pr, cu], []) + + // 未连接任何低功耗设备 + if (!deviceIds || deviceIds.length === 0) { + reject([['no device', BLHErrorCode.NO_DEVICE]]) + return + } + + // 获取设备名 + const devices = [] + deviceIds.forEach(item => { + devices.push({ + // 成功获取名字依赖扫描获取到该设备 + name: BluetoothBase.getRemoteDeviceName(item), + deviceId: item + }) + }) + resolve([[{ devices }]]) + }) + } + + BLECharacteristicCallback = (valueChange) => { + console.debug('[AdvancedAPI] characteristicChange triger valueChange:' + JSON.stringify(valueChange)) + const { serviceUuid, characteristicUuid } = valueChange + const characteristicValue = new Uint8Array( + valueChange.characteristicValue + ) + const notification = { + deviceId: this.deviceIdBle, + serviceId: serviceUuid, + characteristicId: characteristicUuid, + value: characteristicValue, + } + // 遍历所有的监听者 + for (const listener of this.BLECharacteristicListeners) { + listener(notification) + } + } + + // 10.连接低功耗蓝牙设备 + @jsMethod({ alias: 'createBLEConnection', common: false, callback: true }) + createBLEConnection(object) { + const { deviceId, timeout } = object || {} + + return new Promise((resolve, reject) => { + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON // 获取当前设备蓝牙状态 + if (!bluetoothState) { + reject([['bluetooth is not turned', BLHErrorCode.NOT_AVAILABLE]]) + return + } + if (timeout && !isNumber(timeout)) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + if (!deviceId || !isString(deviceId)) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + } else { + this.gattClient = BluetoothBase.createGattClientDevice(deviceId) + // 开启监听该设备的连接状态 + this.gattClient.on('BLEConnectionStateChange', state => { + const temp = (state.state === 2) + if (this.stateBLE[state.deviceId] !== temp) { + this.stateBLE[state.deviceId] = temp + } + }) + try { + this.gattClient.on('BLECharacteristicChange', this.BLECharacteristicCallback) + console.debug('[AdvancedAPI] BLECharacteristicChange Registration succeeded.') + } catch (err) { + console.error(`AdvancedAPI BLECharacteristicChange Registration fail ${err.message}`) + } + + // 创建实例 + const successConnect = this.gattClient.connect() + + // 延时上报 + if (timeout) { + setTimeout(() => { + if (successConnect) { + resolve('ok') + this.deviceIdBle = deviceId + } else { + reject([['connection timed out', BLHErrorCode.CONNECTION_FAIL]]) + } + }, timeout) + } else { + if (!successConnect) { + reject([['fail connection', BLHErrorCode.CONNECTION_FAIL]]) + return + } + resolve('ok') + this.deviceIdBle = deviceId + } + } + }) + } + + // 11.断开与低功耗蓝牙设备的连接(接口问题无法完成关闭会走fail回调) + @jsMethod({ alias: 'closeBLEConnection', common: false, callback: true }) + closeBLEConnection(object) { + const { deviceId } = object || {} + return new Promise((resolve, reject) => { + if (!deviceId || !isString(deviceId)) { + reject([['Deviceid must be written', BLHErrorCode.SYSTEM_ERROR]]) + return + } + try { + this.gattClient.disconnect() + this.gattClient.close() + this.gattClient = null + this.stateBLE[deviceId] = false + resolve('ok') + } catch (err) { + reject([['Failed to disconnect the Bluetooth connection', BLHErrorCode.SYSTEM_ERROR]]) + return + } + }) + } + + // 12.获取蓝牙设备所有服务(service) + @jsMethod({ alias: 'getBLEDeviceServices', common: false, callback: true }) + getBLEDeviceServices(object) { + const { deviceId } = object || {} + return new Promise((resolve, reject) => { + // 未传入deviceId参数 + if (!deviceId || !isString(deviceId)) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + + // 传入deviceID格式错误 + if (!isMac(deviceId)) { + reject([['deviceId is not MAC', BLHErrorCode.SYSTEM_ERROR]]) + return + } + + // 获取当前设备蓝牙状态 + const bluetoothState = BluetoothBase.bluetoothState() === BLESTATE.STATE_ON + if (!bluetoothState) { + reject([['bluetooth is not turned', BLHErrorCode.NOT_AVAILABLE]]) + return + } + console.debug('[QAFAPI] getServices deviceId:' + deviceId + ' this.deviceIdBLE = ' + this.deviceIdBle) + // 获取实例 + let gattClient + if (this.gattClient && deviceId === this.deviceIdBle) { + console.debug('[QAFAPI] getServices deviceId:' + deviceId) + gattClient = this.gattClient + } else { + gattClient = BluetoothBase.createGattClientDevice(deviceId) + gattClient.connect() + this.gattClient = gattClient + this.deviceIdBle = deviceId + } + // 获取所有服务 + gattClient.getServices().then(res => { + const arr = [] + res.forEach(item => { + console.debug('[QAFAPI] getServices services = ' + JSON.stringify(item)) + const { serviceUuid, isPrimary } = item + const temp = { + uuid: serviceUuid, + isPrimary + } + arr.push(temp) + }) + this.services = res + resolve([[{ 'services': arr }]]) + }).catch((err) => { + console.error('[QAFAPI] getServices fail:' + JSON.stringify(err)) + resolve([[{ 'services': [] }]]) + }) + }) + } + + // 13.获取蓝牙设备某个服务中所有特征值(暂不支持) + @jsMethod({ alias: 'getBLEDeviceCharacteristics', common: false, callback: true }) + getBLEDeviceCharacteristics(object) { + return new Promise((resolve, reject) => { + // 参数校验 + if (!object) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + const { deviceId, serviceId } = object + console.info('[QAFAPI] getBLEDeviceCharacteristics deviceId:' + deviceId + ' serviceId = ' + serviceId) + if (!deviceId || !isString(deviceId) || !serviceId || !isString(serviceId)) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + + // 获取实例 + console.info('[QAFAPI] getBLEDeviceCharacteristics deviceId:' + deviceId + ' this.deviceIdBLE = ' + this.deviceIdBle) + let gattClient + if (this.gattClient && deviceId === this.deviceIdBle) { + console.info('[QAFAPI] getBLEDeviceCharacteristics deviceId:' + deviceId) + gattClient = this.gattClient + } else { + gattClient = BluetoothBase.createGattClientDevice(deviceId) + gattClient.connect() + this.gattClient = gattClient + this.deviceIdBle = deviceId + } + + // 获取所有服务 + gattClient.getServices().then(res => { + // 已获取的服务列表对象 + let Servicesfound + + // 遍历从所有服务中找到对应serviceId服务的特征值 + this.services.forEach((item) => { + console.info('[QAFAPI] serviceId = ' + JSON.stringify(item)) + if (item.serviceUuid === serviceId) { + Servicesfound = item + } + }) + + // 未获取到特征值 + if (!Servicesfound) { + reject([['Service not found', BLHErrorCode.NO_SERVICE]]) + return + } + + // 获取特征需要返回的字段对象 + const characteristics = [] + this.bleDescriptor = Servicesfound + Servicesfound.characteristics.forEach(item => { + console.info('[QAFAPI] Servicesfound item = ' + JSON.stringify(item)) + characteristics.push({ + uuid: item.characteristicUuid, + properties: item.properties + }) + }) + + // 找不到返回空数组 + resolve([[{ characteristics }]]) + }).catch(err => { + console.error(`[QAFAPI] OpenHarmony Error getServices value,error Message:${err}`) + reject([['property not support', BLHErrorCode.PROPERTY_NOT_SUPPORT]]) + }) + }) + } + + // 14.读取低功耗蓝牙设备的特征值的二进制数据值(暂不支持) + @jsMethod({ alias: 'readBLECharacteristicValue', common: false, callback: true }) + readBLECharacteristicValue(object) { + return new Promise((resolve, reject) => { + // 参数校验 + if (!object) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + const { deviceId, serviceId, characteristicId } = object + if (!isString(deviceId) || !isString(serviceId) || !isString(characteristicId)) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + if ( + !deviceId + || !serviceId + || !isUuid(serviceId.toLowerCase()) + || !characteristicId + || !isUuid(characteristicId.toLowerCase()) + ) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + if (!isMac(deviceId.toLowerCase())) { + reject([['deviceId is not MAC', BLHErrorCode.SYSTEM_ERROR]]) + return + } + this.queryBLECharacteristic(deviceId, serviceId).then(desc => { + const descriptors = [] + const descriptor = { + serviceUuid: serviceId.toLowerCase(), + characteristicUuid: characteristicId.toLowerCase(), + descriptorUuid: desc.descriptorUuid, + descriptorValue: desc.descriptorValue, + } + descriptors.push(descriptor) + + const characteristicIn = { + serviceUuid: serviceId.toLowerCase(), + characteristicUuid: characteristicId.toLowerCase(), + characteristicValue: this.characteristicValue, + descriptors: descriptors, + } + console.debug('[QAFAPI] characteristicIn = ' + JSON.stringify(characteristicIn)) + // 向服务端发送设置通知此特征值请求notify + let GattClient = null + let result + if (this.gattClient && this.deviceIdBle === deviceId) { + try { + result = this.gattClient.readCharacteristicValue(characteristicIn) + } catch (err) { + reject([[err.message, ErrorCode.PARAMETER_ERROR]]) + console.error('[QAFAPI]readBLECharacteristicValue errCode:' + err.code + ',errMessage:' + err.message) + } + } else { + try { + GattClient = BluetoothBase.createGattClientDevice(deviceId) + result = GattClient.readCharacteristicValue(characteristicIn) + } catch (err) { + reject([[err.message, ErrorCode.PARAMETER_ERROR]]) + console.error('[QAFAPI]readBLECharacteristicValue errCode:' + err.code + ',errMessage:' + err.message) + } + } + // 缺少低功耗设备未连接状态的失败回调(暂不支持直接获取) + if (result) { + result.then((BLECharacteristic) => { + resolve([BLECharacteristic]) + }).catch((err) => { + console.error('[AdvancedAPI] Failed to read characteristic value' + err.message) + reject([['property not support', BLHErrorCode.PROPERTY_NOT_SUPPORT]]) + }) + } else { + reject([['property not support', BLHErrorCode.PROPERTY_NOT_SUPPORT]]) + } + }).catch(_ => { + reject([['Bluetooth not available', BLHErrorCode.SYSTEM_ERROR]]) + }) + }) + } + + // 15.向低功耗蓝牙设备特征值中写入二进制数据(暂不支持) + @jsMethod({ alias: 'writeBLECharacteristicValue', common: false, callback: true }) + writeBLECharacteristicValue(object) { + return new Promise((resolve, reject) => { + // 参数校验 + if (!object) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + + const { deviceId, serviceId, characteristicId, value } = object + if (!isString(deviceId) || !isString(serviceId) || !isString(characteristicId) || !isArrayBuffer(value) || !isMac(deviceId)) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + if ( + !deviceId + || !serviceId + || !isUuid(serviceId.toLowerCase()) + || !characteristicId + || !isUuid(characteristicId.toLowerCase()) + || !isLower(characteristicId.toLowerCase()) + || !value + ) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + + this.queryBLECharacteristic(deviceId, serviceId).then(desc => { + const descriptors = [] + const descriptor = { + serviceUuid: serviceId.toLowerCase(), + characteristicUuid: characteristicId.toLowerCase(), + descriptorUuid: desc.descriptorUuid, + descriptorValue: desc.descriptorValue, + } + descriptors.push(descriptor) + + const characteristicIn = { + serviceUuid: serviceId.toLowerCase(), + characteristicUuid: characteristicId.toLowerCase(), + characteristicValue: value, + descriptors: descriptors, + } + console.debug('[QAFAPI] characteristicIn = ' + JSON.stringify(characteristicIn)) + let GattClient = null + let isWrite + if (this.gattClient && this.deviceIdBle === deviceId) { + try { + isWrite = this.gattClient.writeCharacteristicValue(characteristicIn) + } catch (err) { + reject([[err.message, ErrorCode.PARAMETER_ERROR]]) + console.error('[QAFAPI]writeCharacteristicValue errCode:' + err.code + ',errMessage:' + err.message) + } + } else { + try { + GattClient = BluetoothBase.createGattClientDevice(deviceId) + isWrite = GattClient.writeCharacteristicValue(characteristicIn) + } catch (err) { + reject([[err.message, ErrorCode.PARAMETER_ERROR]]) + console.error('[QAFAPI]readBLECharacteristicValue errCode:' + err.code + ',errMessage:' + err.message) + } + } + // 缺少低功耗设备未连接状态的失败回调(暂不支持直接获取) + if (isWrite) { + resolve('ok') // 写入成功 + } else { + reject([['property not support', BLHErrorCode.PROPERTY_NOT_SUPPORT]]) // 写入失败 + } + }).catch(_ => { + reject([['Bluetooth not available', BLHErrorCode.SYSTEM_ERROR]]) + }) + }) + } + + queryBLECharacteristic(deviceId, serviceId) { + return new Promise((resolve, reject) => { + if (this.descriptors && deviceId.toLowerCase() === this.deviceIdBle.toLowerCase()) { + resolve(this.descriptors) + return + } + let gattClient + if (this.gattClient && deviceId.toLowerCase() === this.deviceIdBle.toLowerCase()) { + console.info('[QAFAPI] queryBLECharacteristic deviceId:' + deviceId) + gattClient = this.gattClient + } else { + gattClient = BluetoothBase.createGattClientDevice(deviceId) + gattClient.connect() + this.gattClient = gattClient + this.deviceIdBle = deviceId + } + + // 获取所有服务 + gattClient.getServices().then((res) => { + // 已获取的服务列表对象 + let Servicesfound + + // 遍历从所有服务中找到对应serviceId服务的特征值 + res.forEach((item) => { + if (item.serviceUuid.toLowerCase() === serviceId.toLowerCase()) { + Servicesfound = item + } + }) + + // 未获取到特征值 + if (!Servicesfound) { + reject([['Service not found', BLHErrorCode.NO_SERVICE]]) + return + } + + // 获取特征需要返回的字段对象 + const characteristics = Servicesfound.characteristics + characteristics.forEach((item) => { + if (item.serviceUuid.toLowerCase() === serviceId.toLowerCase()) { + this.characteristicValue = item.characteristicValue + item.descriptors.forEach((descriptor) => { + if (descriptor.serviceUuid.toLowerCase() === serviceId.toLowerCase()) { + this.descriptors = descriptor + console.info('[QAFAPI] Servicesfound descriptor = ' + JSON.stringify(descriptor)) + resolve(this.descriptors) + } else { + reject([['characteristics not found', BLHErrorCode.NO_SERVICE]]) + } + }) + } else { + console.error(`[AdvancedAPI] characteristics not found`) + reject([['characteristics not found', BLHErrorCode.NO_SERVICE]]) + } + }) + }).catch(err => { + console.error(`[AdvancedAPI] getServices fail:${err.message}`) + reject([['Service not found', BLHErrorCode.NO_SERVICE]]) + }) + }) + } + + // 16.启用低功耗蓝牙设备特征值变化时的notify功能(暂不支持) + @jsMethod({ alias: 'notifyBLECharacteristicValueChange', common: false, callback: true }) + notifyBLECharacteristicValueChange(object) { + return new Promise((resolve, reject) => { + // 参数校验 + if (!object) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + const { deviceId, serviceId, characteristicId, state } = object + if ( + !deviceId || !isString(deviceId) + || !serviceId || !isString(serviceId) + || !isUuid(serviceId.toLowerCase()) + || !characteristicId || !isString(characteristicId) + || !isUuid(characteristicId.toLowerCase()) + || !state || !isBoolean(state) + ) { + reject([['invalidParam', BLHErrorCode.SYSTEM_ERROR]]) + return + } + if (!isMac(deviceId.toLowerCase())) { + reject([['deviceId is not MAC', BLHErrorCode.SYSTEM_ERROR]]) + return + } + this.queryBLECharacteristic(deviceId, serviceId).then(desc => { + console.debug( + '[QAFAPI] desc = ' + + JSON.stringify(desc) + ) + const descriptors = [] + const descriptor = { + serviceUuid: serviceId.toLowerCase(), + characteristicUuid: characteristicId.toLowerCase(), + descriptorUuid: desc.descriptorUuid, + descriptorValue: desc.descriptorValue, + } + descriptors.push(descriptor) + + const characteristicIn = { + serviceUuid: serviceId.toLowerCase(), + characteristicUuid: characteristicId.toLowerCase(), + characteristicValue: this.characteristicValue, + descriptors: descriptors, + } + console.debug( + '[QAFAPI] BLECharacteristic = ' + + JSON.stringify(characteristicIn) + ) + // 向服务端发送设置通知此特征值请求notify + let GattClient = null + let isNotify + if (this.gattClient && this.deviceIdBle === deviceId) { + try { + isNotify = this.gattClient.setNotifyCharacteristicChanged( + characteristicIn, + state + ) + } catch (err) { + reject([[err.message, ErrorCode.PARAMETER_ERROR]]) + console.error( + '[QAFAPI]setNotifyCharacteristicChanged errCode:' + + err.code + + ',errMessage:' + + err.message + ) + return + } + } else { + try { + GattClient = BluetoothBase.createGattClientDevice(deviceId) + isNotify = GattClient.setNotifyCharacteristicChanged( + characteristicIn, + state + ) + } catch (err) { + reject([[err.message, ErrorCode.PARAMETER_ERROR]]) + console.error( + '[QAFAPI]setNotifyCharacteristicChanged errCode:' + + err.code + + ',errMessage:' + + err.message + ) + return + } + } + // 缺少低功耗设备未连接状态的失败回调(暂不支持直接获取) + if (isNotify) { + console.debug('[QAFAPI] notify success') + resolve('ok') + } else { + reject([['property not support', BLHErrorCode.PROPERTY_NOT_SUPPORT]]) + } + }) + }) + } + + getBLEDeviceRSSI(deviceId) { + return new Promise((resolve, reject) => { + if (this.gattClient && this.deviceIdBle === deviceId) { + this.gattClient.getRssiValue().then((res) => { + resolve(res) + }).catch(err => { + reject(err.message) + }) + } else { + try { + const gattClient = BluetoothBase.createGattClientDevice(deviceId) + gattClient.connect() + this.gattClient = gattClient + this.deviceIdBle = deviceId + gattClient.getRssiValue().then(res => { + resolve(res) + }).catch(err => { + reject(err.message) + }) + } catch (err) { + reject(err.message) + } + } + }) + } + + // device输出模板 + getTemp() { + return { + 'RSSI': '', // 当前蓝牙设备的信号强度 + 'localName': '', // 当前蓝牙设备的广播数据段中的 LocalName 数据段 + 'advertisData': '', // 当前蓝牙设备的广播数据段中的 ManufacturerData 数据段 + 'advertisServiceUUIDs': '', // 当前蓝牙设备的广播数据段中的 ServiceUUIDs 数据段 + 'name': '', // 蓝牙设备名称,某些设备可能没有。 + 'serviceData': '', // 当前蓝牙设备的广播数据段中的 ServiceData数据段,返回结构为{"service uuid string": ArrayBuffer} + 'deviceId': '' // 用于区分设备的id + } + } + + // 判断对象是否重复 + // [{"deviceId":'',xxx}] + isRepeat(arr, deviceId) { + return arr.some(obj => { + return obj.deviceId === deviceId + }) + } + + // 弹框模板 + promptTemp(message) { + return PromptBase.ohosShowDialog({ // promise + message, + buttons: [ + { + text: DEFAULT.REFUSE_BUTTON, + color: '#1358e7' + }, + { + text: DEFAULT.ALLOW_BUTTON, + color: '#1358e7' + } + ] + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/module/Brightness/BrightnessBaseModule.js b/ohos/AdvancedAPI_OHOS/src/base/module/Brightness/BrightnessBaseModule.js new file mode 100644 index 0000000000..b2dea4d969 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/module/Brightness/BrightnessBaseModule.js @@ -0,0 +1,103 @@ +import { jsMethod } from '../../decorators' +import { context } from '../../bridge/abilityBase' +import { BrightnessBase } from '../../bridge/brightnessBase' +import { ErrorCode } from '../../util/ErrorCode' +import { isNumber } from '../../util/checkDataType' +import window from '@ohos.window' + +export class BrightnessBaseModule { + @jsMethod({ alias: 'getValue', common: false, callback: true }) + getValue() { + return new Promise((resolve, reject) => { + try { + window.getLastWindow(context).then(windowClass => { + const properties = windowClass.getWindowProperties() + let value = properties.brightness + if (!value || value < 0) { + value = Number(BrightnessBase.ohoGetValue()) / 255 + } + const brightness = { + value: Math.round(value * 255) + } + console.debug('[QAFAPI] getValue success, brightness = ' + JSON.stringify(brightness)) + resolve([brightness]) + }) + } catch (exception) { + reject([['Failed to get brightness']]) + console.error('Failed to obtain the window properties. Cause: ' + JSON.stringify(exception)) + } + }) + } + + @jsMethod({ alias: 'setValue', common: false, callback: true }) + setValue(object) { + return new Promise((resolve, reject) => { + const { value } = object + let params + if (value || value === 0) { + params = value + } else { + reject([['inalid param', ErrorCode.PARAMETER_ERROR]]) + return + } + if (!isNumber(params)) { + reject([['inalid param', ErrorCode.PARAMETER_ERROR]]) + return + } + let Num = Math.floor(params) + if (Num < 0) { + Num = 1 + } else if (Num > 255) { + Num = 255 + } + const brightness = Num / 255 + try { + window.getLastWindow(context).then((windowClass) => { + windowClass.setWindowBrightness(brightness, (err) => { + if (err.code) { + reject([['setWindowBrightness fail']]) + console.error('[QAFAPI] Failed to set the brightness. Cause: ' + JSON.stringify(err)) + return + } + resolve('successed to set') + console.info('[QAFAPI] Succeeded in setting the brightness.') + }) + }) + } catch (error) { + console.error('[QAFAPI] Failed to set setting of brightness. Cause:' + JSON.stringify(error)) + reject([['setWindowBrightness fail']]) + } + }) + } + + @jsMethod({ alias: 'setKeepScreenOn', common: false, callback: true }) + setKeepScreenOn(object) { + return new Promise((resolve, reject) => { + if (object && object.keepScreenOn !== '' && object.keepScreenOn !== null) { + const { keepScreenOn } = object + if (typeof (keepScreenOn) === 'boolean') { + try { + window.getLastWindow(context).then(windowClass => { + windowClass.setWindowKeepScreenOn(keepScreenOn, (err) => { + if (err.code) { + console.error('[QAFAPI] Failed to set the screen to be always on. Cause: ' + JSON.stringify(err)) + reject([['handling failed']]) + return + } + resolve(['handling success']) + console.info('[QAFAPI] Succeeded in setting the screen to be always on.') + }) + }) + } catch (exception) { + console.error('[QAFAPI] Failed to set the screen to be always on. exception: ' + JSON.stringify(exception)) + reject([['handling failed']]) + } + } else { + reject([['inalid param', ErrorCode.PARAMETER_ERROR]]) + } + } else { + reject([['inalid param', ErrorCode.PARAMETER_ERROR]]) + } + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/module/Network/NetworkBaseModule.js b/ohos/AdvancedAPI_OHOS/src/base/module/Network/NetworkBaseModule.js new file mode 100644 index 0000000000..92da6ddcef --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/module/Network/NetworkBaseModule.js @@ -0,0 +1,72 @@ +import { RadioBase, netWorkConnState } from '../../bridge/radioBase' +import { WifiBase } from '../../bridge/wifiBase' +import { jsMethod } from '../../decorators/index' + +export default class NetworkBaseModule { + signalType (resultObj) { + switch (resultObj) { + case netWorkConnState.GSM: + case netWorkConnState.CDMA: + resultObj = { + metered: true, + type: '2G' + } + break + case netWorkConnState.WCDMA: + case netWorkConnState.TDSCDMA: + resultObj = { + metered: true, + type: '3G' + } + break + case netWorkConnState.LTE: + resultObj = { + metered: true, + type: '4G' + } + break + case netWorkConnState.NR: + resultObj = { + metered: true, + type: '5G' + } + break + case netWorkConnState.UNKNOWN: + resultObj = { + metered: true, + type: 'none' + } + break + } + return resultObj + } + + // 获取网络类型 + @jsMethod({ alias: 'getType', common: false, callback: true }) + async getType() { + const linkedInfo = await WifiBase.ohoGetLinkedInfo() + let resultObj = { + metered: false, + type: 'wifi' + } + // 板子不支持获取默认数据卡槽,打桩为0 + const defaultSlotId = 0 + return new Promise((resolve, reject) => { + if (linkedInfo.connState === 4) { + resolve([resultObj]) + return + } + RadioBase.ohoGetSignalInformation(defaultSlotId).then(data => { + if (data && data.signalType) { + resultObj = this.signalType(data.signalType) + resolve([resultObj]) + } else { + resultObj.type = 'none' + resolve([resultObj]) + } + }).catch(err => { + reject([[' Failed to get type:' + err.data, err.code]]) + }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/module/Wifi/WifiBaseModule.js b/ohos/AdvancedAPI_OHOS/src/base/module/Wifi/WifiBaseModule.js new file mode 100644 index 0000000000..8ec1f59c86 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/module/Wifi/WifiBaseModule.js @@ -0,0 +1,93 @@ +import { jsMethod } from '../../decorators' +import { WifiBase } from '../../bridge/wifiBase' +import { ErrorCode, WifiErrorCode } from '../../util/ErrorCode' + +export class WifiBaseModule { + constructor() { + this.SecureType = { + WPA: 'wpa', + WEP: 'wep', + } + } + isSecure(capabilities = '') { + let result = false + capabilities = capabilities.toLowerCase() + if ( + capabilities.includes(this.SecureType.WPA) || + capabilities.includes(this.SecureType.WEP) + ) { + result = true + } + return result + } + + getSignalStrength(value) { + return value + 100 + } + + @jsMethod({ alias: 'scan', common: false }) + scan() { + return new Promise((resolve, reject) => { + if (!WifiBase.isWifiActive()) { + reject([['wifi not turned on', WifiErrorCode.WIFI_NOT_TURNED_ON]]) + return + } + const isScan = WifiBase.scan() + if (isScan) { + resolve([['scan success']]) + } else { + reject([['scan fail', WifiErrorCode.WIFI_NOT_TURNED_ON]]) + } + }) + } + + @jsMethod({ alias: 'getConnectedWifi', common: false }) + getConnectedWifi(partialInfo) { + return new Promise((resolve, reject) => { + if (!WifiBase.isWifiActive()) { + reject([['wifi not turned on', WifiErrorCode.WIFI_NOT_TURNED_ON]]) + return + } + + WifiBase.ohoGetLinkedInfo().then(async (wifiInfo) => { + if (wifiInfo.connState === WifiBase.ConnState.DISCONNECTED) { + reject([['wifi is not connected', ErrorCode.COMMON_ERROR]]) + return + } + + if (partialInfo) { + const result = { + SSID: wifiInfo.ssid, + } + resolve([[result]]) + return + } + + const result = { + BSSID: wifiInfo.bssid, + SSID: wifiInfo.ssid, + frequency: wifiInfo.frequency, + signalStrength: this.getSignalStrength(wifiInfo.rssi), + secure: false, + } + + let capabilities + const scanLists = await WifiBase.getScanInfos() + const length = scanLists.length + for (let i = 0; i < length; i++) { + if ( + scanLists[i].bssid === result.BSSID && + scanLists[i].ssid === result.SSID + ) { + capabilities = scanLists[i].capabilities + break + } + } + if (capabilities) { + result.secure = this.isSecure(capabilities) + } + resolve([[result]]) + }) + }) + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/util/ErrorCode.js b/ohos/AdvancedAPI_OHOS/src/base/util/ErrorCode.js new file mode 100644 index 0000000000..c6bdd0c866 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/util/ErrorCode.js @@ -0,0 +1,162 @@ +// 通用错误码 +export const ErrorCode = { + SHARE_INSTALLED_ERROR: -1001, // 第三方分享,分享的应用未安装 + SUCCESS: 0, // 成功 + COMMON_ERROR: 200, // 失败,其他通用错误 + USER_REJECT: 201, // 用户拒绝授权 + PARAMETER_ERROR: 202, // 参数为空或者参数错误 + SERVICE_UNAVIALABLE: 203, // 服务不可用 + SERVICE_TIMEOUT: 204, // 请求超时 + NOT_SUPPORT_SERVICE_COUNTRY: 205, // 不支持该服务地/设备 + NOT_IN_WHITE_LIST: 206, // 不在白名单 + SYSTEM_PERMISSION_DENIAL: 207, // 系统权限拒绝 + IO_ERROR: 300, // IO错误 + FILE_NOT_FOUND: 301, // 文件路径不存在 + FILE_EXIST: 302, // 文件已存在 + FILE_EXTENSION_NOT_EXIST: 303, // 文件后缀名不存在 + FILE_PATH_NOT_LEGAL: 304, // 文件路径不合法 + WEB_PAGE_NOT_FOUND: 404, // web组件404错误 + QUICKAPP_IN_BACKGROUND: 500, // 应用在后台无法进行操作 + LOCATION_SWITCH_CLOSED: 1000, // 系统位置开关关闭 + PAY_CHECKKEY_FAIL: 1001, // 支付公钥验签失败 + SIM_NOT_FOUND: 1001, // 未插入SIM卡 + SIGNIN_AUTH_FAIL: 1002, // 应用鉴权失败 + OPERATORS_GET_FAIL: 1002, // 获取运营商信息失败 + ALARM_SYSTEM_ERROR: 1003, // 系统不支持闹钟设置 + AGD_COMMON_ERROR: 2001, // AGD SDK接口返回错误 + WIDGET_NOT_SUPPORT: 2001, // 设备不支持在桌面添加快应用中心widget小组件 + CARD_CALL_QUICK_APP_CENTER_FAIL: 2003, // 快卡与快应用中心通信失败 + BI_REPORT_ERROR: 4001, // BI Report接口返回错误 + PAY_CANCEL_CODE: 30000, // 用户取消支付 + PAY_CERTIFICATION_CODE: 30102, // 实名认证失败 +} + +// 蓝牙错误码 +export const BLHErrorCode = { + OK: 0, // 正常 + OTHER_ERRORS: 200, // 其他错误 + NOT_INIT: 10000, // 未启动连接 + NOT_AVAILABLE: 10001, // 当前蓝牙适配器不可用 + NO_DEVICE: 10002, // 没有找到指定设备 + CONNECTION_FAIL: 10003, // 连接失败 + NO_SERVICE: 10004, // 没有找到指定服务 + NO_CHARACTERISTIC: 10005, // 没有找到指定特征值 + NO_CONNECTION: 10006, // 当前连接已断开 + PROPERTY_NOT_SUPPORT: 10007, // 当前特征值不支持此操作 + SYSTEM_ERROR: 10008, // 其余所有系统上报的异常 + SYSTEM_NOT_SUPPORT: 10009, // 系统版本低于 5.0 不支持 BLE + LOCATION_NOT_TURN_ON: 10010, // 系统位置开关关闭 + NO_SUCH_INTERFACE: 10100, // 获取连接状态失败 + DEVICE_DOES_NOT_EXIST: 10101, // 设备不存在 + NOT_AVAILABLE_TIRAMISU: 10102, // 在安卓13及以上版本不可用 +} + +// WIFI错误码 +export const WifiErrorCode = { + PASSWORD_ERROR: 1000, // Wi-Fi密码错误 + CONNECTION_TIMEOUT: 1001, // 连接超时 + DUPLICATE_REQUEST: 1002, // 重复连接 Wi-Fi + WIFI_NOT_TURNED_ON: 1003, // 未打开Wi-Fi开关 + GPS_NOT_TURNED_ON: 1004, // 未打开GPS定位开关 + INVALID_SSID: 1005, // 无效SSID +} + +// 广告错误码 +export const ADErrorCode = { + STANDARD_SERVER: 1000, // 后端错误 + STANDARD_PARAM: 1001, // 参数错误 + STANDARD_INVALID_UNIT: 1002, // 广告单元无效 + STANDARD_INNER_ERROR: 1003, // 内部错误 + STANDARD_NO_RESOURCE: 1004, // 无合适的广告 + STANDARD_TOO_OFTEN: 1100, // 过于频繁调用相关API + STANDARD_INVALID_METHOD: 1102, // 调用了不支持的方法 + STANDARD_NET: 1104, // 网络错误 + STANDARD_UNKNOWN: 2000, // 未知错误 +} + +// 视频错误码 +export const VideoErrorCode = { + CANCEL_TASK: 100, // 取消任务 + COMMON_ERROR: 200, // 接口功能异常 + PARAMETER_ERROR: 202, // 参数错误 + EMPTY_ENTRY: 203, // 找不到实例 + REPEATED_CAL: 205, // 压缩任务已创建,无需再调用第二次 + IO_ERROR: 300, // IO错误 + INVALID_VIDEO: 1001, // 原视频无效 +} + +// 文本转音频错误码 +export const TtaErrorCode = { + FAILED: 1000, // 合成失败 + SYSTEM_SDK_VERSION_DOES_NOT_SUPPORT: 1001, // 系统SDK版本不支持 + INITIALIZATION_FAILED: 1002, // 初始化失败 + TEXT_LENGTH_EXCEEDS_LIMIT: 1003, // 输入文本的长度超过限值 + LANGUAGE_NOT_SUPPORTED: 1004, // 语言不支持 + IO_EXCEPTION: 1005, // IO异常 +} + +// 活体检测错误码 +export const BiometriverifyErrorCode = { + NO_DYNAMIC_CAMERA_PERMISSION: 201, // 用户拒绝,获取相机权限失败 + FREQUENT_OPERATIONS: 205, // 操作频繁,上次操作还未完成 + NO_SYSTEM_CAMERA_PERMISSION: 207, // 系统权限拒绝,获取相机权限失败 + NOT_SUPPORT_SERVICE_COUNTRY: 220, // 当前服务国家/地区不支持此功能 + NO_PERMISSION: 1001, // 没有权限使用该接口 + VERIFY_LIVING_PERSON_CANCEL: 1002, // 活体检测取消 + OPEN_CAMERA_FAIL: 1003, // 活体检测打开相机失败 + VERIFY_INIT_FAIL: 1004, // 活体检测初始化失败 + VERIFY_LIVING_PERSON_FAIL: 1005, // 活体检测失败 + VERIFY_LIVING_PERSON_TIMEOUT: 1006, // 活体检测超时 +} + +// 应用上下文错误码 +export const UserUpdateErrorCode = { + APPLY_RESULT_SUCCESS: 200, // 执行更新成功。 + APPLY_RESULT_NOT_READY: 201, // 当前更新版本未就绪 + APPLY_RESULT_REPEAT_REQUEST: 202, // 重复调用 + UPDATE_ERROR_CODE_CONFLICT: 1001, // 更新的版本与当前版本证书冲突。 + UPDATE_ERROR_SIZE_EXCEEDED: 1002, // rpk大小超出限制 + UPDATE_ERROR_SIZE_NETWORK: 1003, // 网络问题,下载更新失败 + UPDATE_ERROR_IO: 1004, // 网络问题,下载更新失败 +} + +// websocket错误码 +export const WebscoketErrorCode = { + NORMAL_CLOSURE: 1000, // Normal Closure + GOING_AWAY: 1001, // Going Away + PROTOCOL_ERROR: 1002, // Protocol Error + UNSUPPORTED_DATA: 1003, // Unsupported Data + NO_STATUS_RECVD: 1005, // No Status Recvd + ABNORMAL_CLOSURE: 1006, // Abnormal Closure + INVALID_FRAME_PAYLOAD_DATA: 1007, // Invalid frame payload data + POLICY_VIOLATION: 1008, // Policy Violation + MESSAGE_TOO_BIG: 1009, // Message too big + MISSING_EXTENSION: 1010, // Missing Extension + INTERNAL_ERROR: 1011, // Internal Error + SERVICE_RESTART: 1012, // Service Restart + TRY_AGAIN_LATER: 1013, // Try Again Later + BAD_GATEWAY: 1014, // Bad Gateway + BAD_GATEWAY2: 1015, // Bad Gateway +} + +// 应用管理错误码 +export const AppManagerErrorCode = { + CANNOT_FOUND_APP: 1000 +} + +// tts错误码 +export const TtsErrorCode = { + ERROR: 200, // 通用错误。 + INVALIDPARAM: 202, // 参数错误。 + ERROR_NETWORK: 1001, // 网络连接错误。 + ERROR_NETWORK_TIMEOUT: 1002, // 网络连接超时。 + ERROR_NOT_INSTALLED_YET: 1003, // 下载语音数据未完成。 + ERROR_OUTPUT: 1004, // 输出到音频设备失败。 + ERROR_SERVICE: 1005, // TTS服务失败。 + ERROR_SYNTHESIS: 1006, // TTS引擎合成语音失败。 +} + +export const AccountErrorCode = { + SESSION_INVALID: 102 // session无效。 +} + diff --git a/ohos/AdvancedAPI_OHOS/src/base/util/Result.js b/ohos/AdvancedAPI_OHOS/src/base/util/Result.js new file mode 100644 index 0000000000..157c2ac108 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/util/Result.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: 模块返回参数封装 + * Author: weisufang + * Create: 03/22/2022 + * Notes: N/A + */ + +import { dataToArray } from './typeTransForm' + +export default class Result { + static success (data, ignoreComplete = false, ifKeepAlive = false) { + return { method: 'success', arguments: dataToArray(data), ignoreComplete, ifKeepAlive } + } + static fail (data, ignoreComplete = false, ifKeepAlive = false) { + return { method: 'fail', arguments: dataToArray(data), ignoreComplete, ifKeepAlive } + } + static cancel (data, ignoreComplete = false, ifKeepAlive = false) { + return { method: 'cancel', arguments: dataToArray(data), ignoreComplete, ifKeepAlive } + } + static callback (data, ignoreComplete = false, ifKeepAlive = false) { + return { method: 'callback', arguments: dataToArray(data), ignoreComplete, ifKeepAlive } + } + static destroy (data, ignoreComplete = false, ifKeepAlive = false) { + return { method: 'destroy', arguments: dataToArray(data), ignoreComplete, ifKeepAlive } + } +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/util/checkDataType.js b/ohos/AdvancedAPI_OHOS/src/base/util/checkDataType.js new file mode 100644 index 0000000000..d41c76a300 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/util/checkDataType.js @@ -0,0 +1,230 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: 检查数据类型工具函数 + * Author: xuxiaofei + * Create: 03/17/2022 + * Notes: N/A + */ + +// 判断MIC地址格式是否正确(deviceid) +function isMac (str) { + return /^[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}:[A-Fa-f\d]{2}$/.test(str) +} + +// 判断UUID是否格式正确 +function isUuid (str) { + return /^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$/.test(str) +} + +// 判断字符串是否为全小写 +function isLower (str) { + return str === str.toLowerCase() +} + +// 判断字符串是否包含中文 +function isIncludeChinese (str) { + const regChinese = new RegExp('[\u4e00-\u9fa5]+', 'g') + return regChinese.test(str) +} + +// 数据类型是否为int +function isInt (data) { + if (isNumber(data)) { + return (/(^[1-9]\d*$)/.test(data)) + } +} + +// 数据类型是否为number +function isNumber (data) { + return typeof data === 'number' && !Number.isNaN(data) && Number.isFinite(data) +} + +// 数据类型是否为string +function isString (data) { + return typeof data === 'string' +} + +// 数据类型是否为boolean +function isBoolean (data) { + return typeof data === 'boolean' +} + +// 数据类型是否为function +function isFunction (data) { + return typeof data === 'function' +} + +// 数据类型是否为arraybuffer +function isArrayBuffer (data) { + return Object.prototype.toString.call(data) === '[object ArrayBuffer]' +} + +// 数据类型是否为Uint8Array +function isUint8Array (data) { + return Object.prototype.toString.call(data) === '[object Uint8Array]' +} + +// 判断url是否有效 +function isValidURL (url) { + const urlReg = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/.*)?(\?.*)?(#.*)?$/ + if (!isString(url)) { + return false + } + return urlReg.test(url) +} + +// 判断websocket的url是否有效 +function isValidURLofWS (url) { + const urlReg = /^wss?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/.*)?(\?.*)?(#.*)?$/ + if (!isString(url)) { + return false + } + return urlReg.test(url) +} + +// 判断uri是否有效 +function isValidURI (uri) { + const uriReg = /^(internal:\/\/|\/)?([^\s"':|*?<>\\]+\/)*([^\s"':|*?<>\\]+)?$/ + if (!isString(uri)) { + return false + } + // uri不允许出现.. + if (uri.indexOf('..') > -1) { + return false + } + return uriReg.test(uri) +} + +// 数据类型是否为null +function isNull (data) { + return data === null +} + +// 数据类型是否为undefined +function isUndefined (data) { + return (typeof data) === 'undefined' +} + +// 数据类型是否为数组 +function isArray (data) { + return Array.isArray(data) +} + +// 数据类型是否为16进制颜色码 +function isHexcolor (data) { + const regExp6 = /^#[0-9a-fA-F]{6}$/i + const regExp3 = /^#[0-9a-fA-F]{3}$/i + return regExp6.test(data) || regExp3.test(data) +} + +/** + * 通用校验接口checkDataType + * @param {*} data 待校验数据 + * @param {Boolean} isRequired 是否为必填项 + * @param {String | String[]} dataType 字符串或数组,预期的数据类型, + * 字符串支持:"string","number","boolean","function","arraybuffer","array","hexcolor"。 + * 支持上述字符串类型组成的数组,数组情况下满足其中一种类型即校验通过 + * @param {Function} customCheck 定制化校验方法,入参为data,需返回布尔 + * @returns {Boolean} 返回是否校验通过 + */ +function checkDataType (data, isRequired, dataType, customCheck) { + let result = false + try { + if (isRequired && (isNull(data) || isUndefined(data))) { + throw new Error('The param data is required') + } + if (!isString(dataType) && !isArray(dataType)) { + throw new Error('The param dataType should be a String or an Array') + } + if (!isNull(customCheck) && !isUndefined(customCheck) && !isFunction(customCheck)) { + throw new Error('If customCheck exist,it should be a Function') + } + + // 非必填时,如果没有该参数,直接返回true + if (!isRequired && (isNull(data) || isUndefined(data))) { + return true + } + if (isString(dataType)) { + result = checkSingleDataType(data, dataType) + } else if (isArray(dataType)) { + result = dataType.some(value => { + return checkSingleDataType(data, value) + }) + } + if (result && isFunction(customCheck)) { + result = customCheck(data) + } + } catch (error) { + console.log(error) + return false + } + return result +} +function checkSingleDataType (data, dataType) { + let result = false + switch (dataType) { + case 'string': + result = isString(data) + break + case 'number': + result = isNumber(data) + break + case 'boolean': + result = isBoolean(data) + break + case 'function': + result = isFunction(data) + break + case 'arraybuffer': + result = isArrayBuffer(data) + break + case 'array': + result = isArray(data) + break + case 'hexcolor': + result = isHexcolor(data) + break + case 'null': + result = isNull(data) + break + case 'undefined': + result = isUndefined(data) + break + default: + throw new Error('The param dataType is unsupport') + } + return result +} +function isJsonString (str) { + try { + if (typeof JSON.parse(str) === 'object') { + return true + } + } catch (e) { } + return false +} +// 判断号码是否有效 +function isValidDestNumber (data) { + const regExp = /^\+?([0-9]\d*|\s)+$/ + return regExp.test(data) +} +export { + isNumber, + isString, + isBoolean, + isFunction, + isArrayBuffer, + isUint8Array, + isValidURL, + isValidURLofWS, + isValidURI, + checkDataType, + isInt, + isArray, + isLower, + isJsonString, + isMac, + isUuid, + isValidDestNumber, + isIncludeChinese +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/util/colors.js b/ohos/AdvancedAPI_OHOS/src/base/util/colors.js new file mode 100644 index 0000000000..c84eed8ee6 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/util/colors.js @@ -0,0 +1,150 @@ +export const colors = { + aliceblue: [240, 248, 255], + antiquewhite: [250, 235, 215], + aqua: [0, 255, 255], + aquamarine: [127, 255, 212], + azure: [240, 255, 255], + beige: [245, 245, 220], + bisque: [255, 228, 196], + black: [0, 0, 0], + blanchedalmond: [255, 235, 205], + blue: [0, 0, 255], + blueviolet: [138, 43, 226], + brown: [165, 42, 42], + burlywood: [222, 184, 135], + cadetblue: [95, 158, 160], + chartreuse: [127, 255, 0], + chocolate: [210, 105, 30], + coral: [255, 127, 80], + cornflowerblue: [100, 149, 237], + cornsilk: [255, 248, 220], + crimson: [220, 20, 60], + cyan: [0, 255, 255], + darkblue: [0, 0, 139], + darkcyan: [0, 139, 139], + darkgoldenrod: [184, 134, 11], + darkgray: [169, 169, 169], + darkgreen: [0, 100, 0], + darkgrey: [169, 169, 169], + darkkhaki: [189, 183, 107], + darkmagenta: [139, 0, 139], + darkolivegreen: [85, 107, 47], + darkorange: [255, 140, 0], + darkorchid: [153, 50, 204], + darkred: [139, 0, 0], + darksalmon: [233, 150, 122], + darkseagreen: [143, 188, 143], + darkslateblue: [72, 61, 139], + darkslategray: [47, 79, 79], + darkslategrey: [47, 79, 79], + darkturquoise: [0, 206, 209], + darkviolet: [148, 0, 211], + deeppink: [255, 20, 147], + deepskyblue: [0, 191, 255], + dimgray: [105, 105, 105], + dimgrey: [105, 105, 105], + dodgerblue: [30, 144, 255], + firebrick: [178, 34, 34], + floralwhite: [255, 250, 240], + forestgreen: [34, 139, 34], + fuchsia: [255, 0, 255], + gainsboro: [220, 220, 220], + ghostwhite: [248, 248, 255], + gold: [255, 215, 0], + goldenrod: [218, 165, 32], + gray: [128, 128, 128], + green: [0, 128, 0], + greenyellow: [173, 255, 47], + grey: [128, 128, 128], + honeydew: [240, 255, 240], + hotpink: [255, 105, 180], + indianred: [205, 92, 92], + indigo: [75, 0, 130], + ivory: [255, 255, 240], + khaki: [240, 230, 140], + lavender: [230, 230, 250], + lavenderblush: [255, 240, 245], + lawngreen: [124, 252, 0], + lemonchiffon: [255, 250, 205], + lightblue: [173, 216, 230], + lightcoral: [240, 128, 128], + lightcyan: [224, 255, 255], + lightgoldenrodyellow: [250, 250, 210], + lightgray: [211, 211, 211], + lightgreen: [144, 238, 144], + lightgrey: [211, 211, 211], + lightpink: [255, 182, 193], + lightsalmon: [255, 160, 122], + lightseagreen: [32, 178, 170], + lightskyblue: [135, 206, 250], + lightslategray: [119, 136, 153], + lightslategrey: [119, 136, 153], + lightsteelblue: [176, 196, 222], + lightyellow: [255, 255, 224], + lime: [0, 255, 0], + limegreen: [50, 205, 50], + linen: [250, 240, 230], + magenta: [255, 0, 255], + maroon: [128, 0, 0], + mediumaquamarine: [102, 205, 170], + mediumblue: [0, 0, 205], + mediumorchid: [186, 85, 211], + mediumpurple: [147, 112, 219], + mediumseagreen: [60, 179, 113], + mediumslateblue: [123, 104, 238], + mediumspringgreen: [0, 250, 154], + mediumturquoise: [72, 209, 204], + mediumvioletred: [199, 21, 133], + midnightblue: [25, 25, 112], + mintcream: [245, 255, 250], + mistyrose: [255, 228, 225], + moccasin: [255, 228, 181], + navajowhite: [255, 222, 173], + navy: [0, 0, 128], + oldlace: [253, 245, 230], + olive: [128, 128, 0], + olivedrab: [107, 142, 35], + orange: [255, 165, 0], + orangered: [255, 69, 0], + orchid: [218, 112, 214], + palegoldenrod: [238, 232, 170], + palegreen: [152, 251, 152], + paleturquoise: [175, 238, 238], + palevioletred: [219, 112, 147], + papayawhip: [255, 239, 213], + peachpuff: [255, 218, 185], + peru: [205, 133, 63], + pink: [255, 192, 203], + plum: [221, 160, 221], + powderblue: [176, 224, 230], + purple: [128, 0, 128], + rebeccapurple: [102, 51, 153], + red: [255, 0, 0], + rosybrown: [188, 143, 143], + royalblue: [65, 105, 225], + saddlebrown: [139, 69, 19], + salmon: [250, 128, 114], + sandybrown: [244, 164, 96], + seagreen: [46, 139, 87], + seashell: [255, 245, 238], + sienna: [160, 82, 45], + silver: [192, 192, 192], + skyblue: [135, 206, 235], + slateblue: [106, 90, 205], + slategray: [112, 128, 144], + slategrey: [112, 128, 144], + snow: [255, 250, 250], + springgreen: [0, 255, 127], + steelblue: [70, 130, 180], + tan: [210, 180, 140], + teal: [0, 128, 128], + thistle: [216, 191, 216], + tomato: [255, 99, 71], + turquoise: [64, 224, 208], + violet: [238, 130, 238], + wheat: [245, 222, 179], + white: [255, 255, 255], + whitesmoke: [245, 245, 245], + yellow: [255, 255, 0], + yellowgreen: [154, 205, 50] +} diff --git a/ohos/AdvancedAPI_OHOS/src/base/util/typeTransForm.js b/ohos/AdvancedAPI_OHOS/src/base/util/typeTransForm.js new file mode 100644 index 0000000000..7872fdcb19 --- /dev/null +++ b/ohos/AdvancedAPI_OHOS/src/base/util/typeTransForm.js @@ -0,0 +1,59 @@ +/** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: 数据类型转换工具函数 + * Author: pengweihang + * Create: 03/21/2022 + * Notes: N/A + */ + +function stringToArrayBuffer(str) { + const buffers = [] + let c + const len = str.length + for (let i = 0; i < len; i++) { + c = str.charCodeAt(i) + if (c >= 0x010000 && c <= 0x10FFFF) { + buffers.push(((c >> 18) & 0x07) | 0xF0) + buffers.push(((c >> 12) & 0x3F) | 0x80) + buffers.push(((c >> 6) & 0x3F) | 0x80) + buffers.push((c & 0x3F) | 0x80) + } else if (c >= 0x000800 && c <= 0x00FFFF) { + buffers.push(((c >> 12) & 0x0F) | 0xE0) + buffers.push(((c >> 6) & 0x3F) | 0x80) + buffers.push((c & 0x3F) | 0x80) + } else if (c >= 0x000080 && c <= 0x0007FF) { + buffers.push(((c >> 6) & 0x1F) | 0xC0) + buffers.push((c & 0x3F) | 0x80) + } else { + buffers.push(c & 0xFF) + } + } + const array = new Int8Array(buffers.length) + for (let i = 0; i <= buffers.length; i++) { + array[i] = buffers[i] + } + return array.buffer +} + +function dataToArray (obj) { + if (Array.isArray(obj)) { + return obj + } + return [obj] +} + +// 获取url上的参数 +function getUriParams (uri) { + const search = uri.split('?')[1] + const result = {} + if (search) { + const params = search.split('&') + params.forEach(item => { + const [key, value] = item.split('=') + result[key] = value + }) + } + return result +} + +export { stringToArrayBuffer, dataToArray, getUriParams } diff --git a/ohos/README.md b/ohos/README.md new file mode 100644 index 0000000000..76bf762da6 --- /dev/null +++ b/ohos/README.md @@ -0,0 +1,18 @@ +# 规格说明 + +高阶API扩展包:AdvancedAPI_OHOS + +鸿蒙化指导文档:docs + +样例工程:example +* DevEco Studio工程:ohos-example +* weex鸿蒙化工程:weex-example + +测试用例:Test +* weex测试用例工程:commonTest + +web高阶API扩展包:web_api_ohos + +鸿蒙化集成模块:web_scenekit_hsp + +鸿蒙化拓展插件包:weex-openharmony \ No newline at end of file diff --git a/ohos/docs/assets/175bef82-f6f8-4bb8-a49c-d6434ffab488.png b/ohos/docs/assets/175bef82-f6f8-4bb8-a49c-d6434ffab488.png new file mode 100644 index 0000000000000000000000000000000000000000..a650a9f13ef6a0653b5a4aaa20a0967980b985b1 GIT binary patch literal 105006 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
  • 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�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%0Do^7k?b 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 RN!lIs4=SrFQ!NDx{vR#n1R($b literal 0 HcmV?d00001 diff --git a/ohos/docs/assets/25d694fe-9a25-4a89-89a4-64b5d38bed58.png b/ohos/docs/assets/25d694fe-9a25-4a89-89a4-64b5d38bed58.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a73cd72f471ddf07bd631dadb630d3ee0f783d GIT binary patch literal 34587 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 literal 0 HcmV?d00001 diff --git a/ohos/docs/assets/2ef98fc1-56bc-4596-8a09-8bc20a99c87e.png b/ohos/docs/assets/2ef98fc1-56bc-4596-8a09-8bc20a99c87e.png new file mode 100644 index 0000000000000000000000000000000000000000..64cfc9429ff3f9c12e051d762ab2c081ba9e784c GIT binary patch literal 76122 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 literal 0 HcmV?d00001 diff --git a/ohos/docs/assets/31c7404f-b379-4f9e-ae50-be9fd87cc3d3.png b/ohos/docs/assets/31c7404f-b379-4f9e-ae50-be9fd87cc3d3.png new file mode 100644 index 0000000000000000000000000000000000000000..35255583c363fe3777153b70018f29c812b8ef8b GIT binary patch literal 42330 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 z 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Ç}T)^T#hA8a+4K4QWC0 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 GzyAjh$iof* literal 0 HcmV?d00001 diff --git a/ohos/docs/assets/3bb62087-559d-4b6a-866f-6c18cc5c2bad.png b/ohos/docs/assets/3bb62087-559d-4b6a-866f-6c18cc5c2bad.png new file mode 100644 index 0000000000000000000000000000000000000000..98d31d59f8f5a4400da9ec5120e9ca02657b48cc GIT binary patch literal 95202 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 Pz{A+UOutkY8vTC&QL0O{ literal 0 HcmV?d00001 diff --git a/ohos/docs/assets/45a6a96e-2d2e-4ab3-baba-23285224d6dd.png b/ohos/docs/assets/45a6a96e-2d2e-4ab3-baba-23285224d6dd.png new file mode 100644 index 0000000000000000000000000000000000000000..ada86e9cf28f4c89babdb718b49b04e7468e29be GIT binary patch literal 121495 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%0AZ8ca6CGa6 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

    2lB^ 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