diff --git a/README.md b/README.md index df99bfc2b144328c698b1056c1b77c06e91d3052..28532d0d78c685d90f53ee52b30bdcbd17e8324a 100644 --- a/README.md +++ b/README.md @@ -226,6 +226,19 @@ ``` { "description": "Configuration for myMusic Tests", + { + "description": "Configuration for myshopping Tests", + "level": ["0","1","2"], + "type": "function", + "component": "player_framework", + "syscap": [ + "SystemCapability.Multimedia.Media.AudioPlayer", + "SystemCapability.Multimedia.Media.VideoPlayer", + "SystemCapability.Multimedia.Media.AudioRecorder", + "SystemCapability.Multimedia.Media.VideoRecorder", + "SystemCapability.Multimedia.Media.AVPlayer", + "SystemCapability.Multimedia.Media.AVRecorder" + ], "driver": { "type": "OHJSUnitTest", "test-timeout": "180000", diff --git a/docs/FeatureMapRule.md b/docs/FeatureMapRule.md index 510a3f4f205c75b3d9050f7088b5ee3c2e55afe5..6d769ec23f106ca6330f1e67e8d4411fbbb34c3b 100644 --- a/docs/FeatureMapRule.md +++ b/docs/FeatureMapRule.md @@ -52,6 +52,9 @@ lv0_function_playerFramework_mediaAudioPlayer_001 编写执行配置文件:testcases/xxx.json 填写用例级别、分类、模块。 + +syscap非必填。 + ``` { "description": "Configuration for myshopping Tests", diff --git a/scenario/MusicPlayerOnline/.gitignore b/scenario/MusicPlayerOnline/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..fbabf771011fe78f9919db0b1195ab6cadffc2b0 --- /dev/null +++ b/scenario/MusicPlayerOnline/.gitignore @@ -0,0 +1,11 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/AppScope/app.json5 b/scenario/MusicPlayerOnline/AppScope/app.json5 new file mode 100644 index 0000000000000000000000000000000000000000..9f09d6f242a9379b4f296ab12716228240d489a0 --- /dev/null +++ b/scenario/MusicPlayerOnline/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "com.example.musicPlayerOnline", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/scenario/MusicPlayerOnline/AppScope/resources/base/element/string.json b/scenario/MusicPlayerOnline/AppScope/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..75328bdd3953609188a42586b9f13faba2ec1e0a --- /dev/null +++ b/scenario/MusicPlayerOnline/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "musicPlayerOnline" + } + ] +} diff --git a/scenario/MusicPlayerOnline/AppScope/resources/base/media/app_icon.png b/scenario/MusicPlayerOnline/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd45accb1dfd2fd0da16c732c72faa6e46b26521 Binary files /dev/null and b/scenario/MusicPlayerOnline/AppScope/resources/base/media/app_icon.png differ diff --git a/scenario/MusicPlayerOnline/README_zh.md b/scenario/MusicPlayerOnline/README_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..bb82fa2d8bb829063825ba98ba848978184dfdeb --- /dev/null +++ b/scenario/MusicPlayerOnline/README_zh.md @@ -0,0 +1,153 @@ +# 我的音乐 + +### 介绍 + +本示例主要实现网络音乐展示和播放,以此测试OpenHarmony是否支持网络信息获取,网络流媒体播放,以及是否存在问题。 + +测试设计及实现方法: + + 1.参考网络音乐应用内容,设计应用的功能、数据、测试用例 + + 2.开发应用功能,展示功能和数据内容 + + 3.开发测试用例,检查应用功能及数据内容 + + 4.测试方式: + 1)运行应用手工测试,检查应用是否正确运行及内容是否正确 + 2)通过DevEco 测试框架自动化执行测试套并查看结果和测试log + +### 效果预览 + +| 主页 | 播客 | 我的 | +|---------------------------------|-----------------------------------|-------------------------------------| +| ![image](screenshots/home.jpeg) | ![image](screenshots/detail.jpeg) | ![image](screenshots/playlist.jpeg) | + + +### 工程目录 + +``` +├─main +│ │ module.json5 +│ │ +│ ├─ets +│ │ ├─entryability +│ │ │ EntryAbility.ets +│ │ │ +│ │ ├─manager +│ │ │ PlayerManager.ets +│ │ │ ServerConstants.ets +│ │ │ +│ │ ├─model +│ │ │ AudioItem.ets +│ │ │ LrcLine.ets +│ │ │ PlayListData.ets +│ │ │ +│ │ ├─pages +│ │ │ Index.ets +│ │ │ +│ │ ├─utils +│ │ │ CommonUtils.ets +│ │ │ Logger.ts +│ │ │ +│ │ └─view +│ │ PlayerBar.ets +│ │ PlayerDetail.ets +│ │ PlayList.ets +│ │ PlayListItem.ets +│ │ SongCell.ets +│ │ +│ └─resources +│ ├─base +│ │ ├─element +│ │ │ color.json +│ │ │ string.json +│ │ │ +│ │ ├─media +│ │ │ icon.png +│ │ │ ic_public_arrow_down_0.png +│ │ │ ic_public_arrow_right.png +│ │ │ ic_public_arrow_right_grey.png +│ │ │ ic_public_comments.png +│ │ │ ic_public_favor.png +│ │ │ ic_public_list_cycle.png +│ │ │ ic_public_pause.png +│ │ │ ic_public_play.png +│ │ │ ic_public_play_last.png +│ │ │ ic_public_play_next.png +│ │ │ ic_public_play_white.png +│ │ │ ic_public_share.png +│ │ │ ic_public_view_list.png +│ │ │ ic_screenshot_line.png +│ │ │ ic_screenshot_line_select.png +│ │ │ startIcon.png +│ │ │ +│ │ └─profile +│ │ main_pages.json +│ │ +│ ├─en_US +│ │ └─element +│ │ string.json +│ │ +│ ├─rawfile +│ └─zh_CN +│ └─element +│ string.json +│ +├─mock +│ mock-config.json5 +│ +├─ohosTest +│ │ module.json5 +│ │ +│ ├─ets +│ │ ├─test +│ │ │ Ability.test.ets +│ │ │ List.test.ets +│ │ │ +│ │ ├─testability +│ │ │ │ TestAbility.ets +│ │ │ │ +│ │ │ └─pages +│ │ │ Index.ets +│ │ │ +│ │ └─testrunner +│ │ OpenHarmonyTestRunner.ets +│ │ +│ └─resources +│ └─base +│ ├─element +│ │ color.json +│ │ string.json +│ │ +│ ├─media +│ │ icon.png +│ │ +│ └─profile +│ test_pages.json +│ +└─test + List.test.ets + LocalUnit.test.ets + +``` + +### 相关权限 +无 + +### 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:RK3568; +2. 本示例仅支持API11版本SDK,版本号:4.1.7.5; +3. 本示例需要使用DevEco Studio 4.1 Release (Build Version: 4.0.0.400); + +### 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo scenario/MusicPlayerOnline/ > .git/info/sparse-checkout +git remote add origin https://gitee.com/openharmony-sig/ostest_integration_test.git +git pull origin master +``` \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/build-profile.json5 b/scenario/MusicPlayerOnline/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..2767ef9265fa5683d93a529e90da410debcd08bd --- /dev/null +++ b/scenario/MusicPlayerOnline/build-profile.json5 @@ -0,0 +1,49 @@ +{ + "app": { + "signingConfigs": [ + { + "name": "default", + "material": { + "certpath": "C:/Users/Administrator/.ohos/config/openharmony/default_MusicPlayerOnline_FXYBOAf69SUjZDCrDt8Xwf1b9BjvpsV8G8MXGjUFiRw=.cer", + "storePassword": "0000001BDDA9B8D36C2A9429D4688C460B0ED52F4CFB3E952032497A3BDE2E6651EA0688193DE9CCB4B4CD", + "keyAlias": "debugKey", + "keyPassword": "0000001B1EACADFF14787367B5F4314733915F814C676FE175A16E37C9CD5D77A08128141265D73FEDAD48", + "profile": "C:/Users/Administrator/.ohos/config/openharmony/default_MusicPlayerOnline_FXYBOAf69SUjZDCrDt8Xwf1b9BjvpsV8G8MXGjUFiRw=.p7b", + "signAlg": "SHA256withECDSA", + "storeFile": "C:/Users/Administrator/.ohos/config/openharmony/default_MusicPlayerOnline_FXYBOAf69SUjZDCrDt8Xwf1b9BjvpsV8G8MXGjUFiRw=.p12" + } + } + ], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": 11, + "compatibleSdkVersion": 11, + "runtimeOS": "OpenHarmony" + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/.gitignore b/scenario/MusicPlayerOnline/entry/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e2713a2779c5a3e0eb879efe6115455592caeea5 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/build-profile.json5 b/scenario/MusicPlayerOnline/entry/build-profile.json5 new file mode 100644 index 0000000000000000000000000000000000000000..197e83c1b9504b12a3837e0189185479662cad4b --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/build-profile.json5 @@ -0,0 +1,31 @@ +{ + "apiType": "stageMode", + "buildOption": { + "arkOptions": { + // "apPath": "./modules.ap" /* Profile used for profile-guided optimization (PGO), a compiler optimization technique to improve app runtime performance. */ + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": true, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/hvigorfile.ts b/scenario/MusicPlayerOnline/entry/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6edcd90486dd5a853cf7d34c8647f08414ca7a3 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/scenario/MusicPlayerOnline/entry/obfuscation-rules.txt b/scenario/MusicPlayerOnline/entry/obfuscation-rules.txt new file mode 100644 index 0000000000000000000000000000000000000000..985b2aeb7658286b17bd26eab8f217c3fe75ea8b --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/obfuscation-rules.txt @@ -0,0 +1,18 @@ +# 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://gitee.com/openharmony/arkcompiler_ets_frontend/blob/master/arkguard/README.md + +# 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 \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/oh-package.json5 b/scenario/MusicPlayerOnline/entry/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..248c3b7541a589682a250f86a6d3ecf7414d2d6a --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": {} +} + diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/entryability/EntryAbility.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000000000000000000000000000000000000..9656d540e85b25d9949c4bf54628a1e467809691 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AbilityConstant from '@ohos.app.ability.AbilityConstant'; +import hilog from '@ohos.hilog'; +import UIAbility from '@ohos.app.ability.UIAbility'; +import Want from '@ohos.app.ability.Want'; +import window from '@ohos.window'; +import PlayerManager from '../manager/PlayerManager'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + AppStorage.setOrCreate('APPContext',this.context); + AppStorage.setOrCreate('PlayerManager', new PlayerManager()); + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets new file mode 100644 index 0000000000000000000000000000000000000000..112f99ae7093d9e7f534b6664836fb9a498ffcbe --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import media from '@ohos.multimedia.media'; +import { BusinessError } from '@ohos.base'; +import AudioItem from '../model/AudioItem'; +import Logger from '../utils/Logger'; +import emitter from '@ohos.events.emitter'; +import ServerConstants from '../manager/ServerConstants'; +import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager'; +import wantAgent, { WantAgent } from '@ohos.app.ability.wantAgent'; +import common from '@ohos.app.ability.common'; + +export default class PlayerManager { + private tag: string = 'PlayerManager'; + private isSeek: boolean = false; + private avPlayer: media.AVPlayer | undefined = undefined; + private list: AudioItem[] = []; + private currentTime: number = 0; + private currentDuration: number = 0; + private item: AudioItem = new AudioItem('', '', ''); + private listPosition: number = 0; + private state: string = ServerConstants.PLAYER_STATE_UNKNOWN; + private listTitle: string = ''; + private emitterOptions: emitter.Options = { + priority: emitter.EventPriority.HIGH + }; + + // 注册avplayer回调函数 + setAVPlayerCallback(avPlayer: media.AVPlayer) { + // seek操作结果回调函数 + avPlayer.on('seekDone', (seekDoneTime: number) => { + console.info(`PlayerManager seek succeeded, seek time is ${seekDoneTime}`); + }) + // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程 + avPlayer.on('error', (err: BusinessError) => { + console.error(`Invoke PlayerManager failed, code is ${err.code}, message is ${err.message}`); + avPlayer.reset(); // 调用reset重置资源,触发idle状态 + }) + // 状态机变化回调函数 + avPlayer.on('timeUpdate', (time: number) => { + //console.info('AVPlayer state timeUpdate:'+time); + this.currentTime = time; + let eventData: emitter.EventData = { + data: { + "currentTime": this.currentTime, + "currentDuration": this.currentDuration + } + }; + emitter.emit(ServerConstants.UPDATE_TIME_EVENT_ID, this.emitterOptions, eventData); + }) + avPlayer.on('durationUpdate', (time: number) => { + console.info('PlayerManager state durationUpdate:' + time); + this.currentDuration = time; + }) + avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => { + this.state = state; + let eventData: emitter.EventData = { + data: { + "state": state, + } + }; + emitter.emit(ServerConstants.UPDATE_STATE_EVENT_ID, this.emitterOptions, eventData); + switch (state) { + case ServerConstants.PLAYER_STATE_IDLE: // 成功调用reset接口后触发该状态机上报 + console.info('PlayerManager state idle called.'); + avPlayer.release(); // 调用release接口销毁实例对象 + break; + case ServerConstants.PLAYER_STATE_INITIALIZED: // avplayer 设置播放源后触发该状态上报 + console.info('PlayerManager state initialized called.'); + avPlayer.prepare(); + break; + case ServerConstants.PLAYER_STATE_PREPARED: // prepare调用成功后上报该状态机 + console.info('PlayerManager state prepared called.'); + avPlayer.play(); // 调用播放接口开始播放 + break; + case ServerConstants.PLAYER_STATE_PLAYING: // play成功调用后触发该状态机上报 + console.info('PlayerManager state playing called.'); + this.list[this.listPosition].isPlaying = true; + this.startContinuousTask(); + break; + case ServerConstants.PLAYER_STATE_PAUSED: // pause成功调用后触发该状态机上报 + console.info('PlayerManager state paused called.'); + break; + case ServerConstants.PLAYER_STATE_COMPLETED: // 播放结束后触发该状态机上报 + console.info('PlayerManager state completed called.'); + avPlayer.stop(); //调用播放结束接口 + this.next(); + break; + case ServerConstants.PLAYER_STATE_STOPPED: // stop接口成功调用后触发该状态机上报 + console.info('PlayerManager state stopped called.'); + this.stopContinuousTask(); + this.currentTime = 0; + Logger.info(this.tag, 'Stop:' + this.item.title); + avPlayer.reset(); // 调用reset接口初始化avplayer状态 + break; + case ServerConstants.PLAYER_STATE_RELEASED: + console.info('PlayerManager state released called.'); + break; + default: + console.info('PlayerManager state unknown called.'); + break; + } + }) + } + + /** + * 初始化 + */ + playList(listTitle: string, list: AudioItem[], item: AudioItem): void { + this.stop(); + if (list.length <= 0) { + Logger.error(this.tag, 'PlayList:' + 'list length <= 0'); + return; + } + this.list = list; + this.listTitle = listTitle; + this.play(item); + } + + getCurrentPlayList(): AudioItem[] { + return this.list; + } + + /** + * 播放 + */ + resume(): void { + if (this.state === ServerConstants.PLAYER_STATE_PAUSED) { + if (this.avPlayer !== undefined) { + this.avPlayer.play(); + } + } + } + + /** + * 播放 + */ + play(item: AudioItem): void { + this.stop(); + Logger.info(this.tag, 'Play finish:' + this.listPosition.toString()); + let index = -1 + if (item !== undefined) { + index = this.list.indexOf(item) + } + if (-1 === index) { + this.listPosition = 0; + } else { + this.listPosition = index; + } + Logger.info(this.tag, 'Play :' + this.listPosition.toString()); + this.item = this.list[this.listPosition] + this.avPlayerLive(ServerConstants.PLAY_SONG_URL + this.item.id); + } + + /** + * 暂停 + */ + pause(): void { + if (this.avPlayer !== undefined) { + this.avPlayer.pause(); + } + } + + /** + * 停止 + */ + stop(): void { + if (this.avPlayer !== undefined) { + this.avPlayer.stop(); + if (this.list.length > this.listPosition) { + this.list[this.listPosition].isPlaying = false; + } + } + } + + /** + * seek + */ + seek(duration: number): void { + if (this.avPlayer !== undefined && this.isSeek) { + this.avPlayer.seek(duration); + } + } + + /** + * 下一首 + */ + next(): void { + let newPosition = 0; + if (this.listPosition + 1 === this.list.length) { + newPosition = 0; + } else { + newPosition = this.listPosition + 1; + } + Logger.info(this.tag, 'Play next:' + newPosition.toString()); + this.play(this.list[newPosition]); + } + + /** + * 上一首 + */ + previous() { + let newPosition = 0; + if (this.listPosition === 0) { + newPosition = 0; + } else { + newPosition = this.listPosition - 1; + } + Logger.info(this.tag, 'Play previous:' + newPosition.toString()); + this.play(this.list[newPosition]); + } + + //播放顺序 + setPlayMode() { + + } + + getItem(): AudioItem { + return this.item; + } + + getListTitle(): string { + return this.listTitle; + } + + getState(): string { + return this.state; + } + + async avPlayerLive(url: string) { + // 创建avPlayer实例对象 + if (this.avPlayer === undefined) { + this.avPlayer = await media.createAVPlayer(); + this.setAVPlayerCallback(this.avPlayer); + } else { + this.avPlayer.release(); + this.avPlayer = await media.createAVPlayer(); + this.setAVPlayerCallback(this.avPlayer); + } + console.info('PlayerManager state url:' + url); + this.avPlayer.url = url; + } + + startContinuousTask() { + let wantAgentInfo: wantAgent.WantAgentInfo = { + wants: [ + { + bundleName: "com.example.avplayer", + abilityName: "EntryAbility" + } + ], + operationType: wantAgent.OperationType.START_ABILITY, + requestCode: 0, + wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] + }; + + try { + wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => { + try { + backgroundTaskManager.startBackgroundRunning(AppStorage.get('APPContext') as common.UIAbilityContext, + backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK, wantAgentObj).then(() => { + console.info("PlayerManager Operation startBackgroundRunning succeeded"); + }).catch((error: BusinessError) => { + console.error(`PlayerManager Operation startBackgroundRunning failed. code is ${error.code} message is ${error.message}`); + }); + } catch (error) { + console.error(`PlayerManager Operation startBackgroundRunning failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`); + } + }); + } catch (error) { + console.error(`PlayerManager Operation getWantAgent failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`); + } + } + + // cancel continuous task + stopContinuousTask(): void { + try { + backgroundTaskManager.stopBackgroundRunning(AppStorage.get('APPContext') as common.UIAbilityContext).then(() => { + console.info("PlayerManager Operation stopBackgroundRunning succeeded"); + }).catch((error: BusinessError) => { + console.error(`PlayerManager Operation stopBackgroundRunning failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`); + }); + } catch (error) { + console.error(`PlayerManager Operation stopBackgroundRunning failed. code is ${(error as BusinessError).code} message is ${(error as BusinessError).message}`); + } + } +} + diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets new file mode 100644 index 0000000000000000000000000000000000000000..2b26c1a614a297ee207aad9aeb55167afa45a304 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/ServerConstants.ets @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Common constants for all features. + */ +export default class ServerConstants { + /** + * server host ,replace with your owen server address + */ + static readonly SERVER_HOST = 'http://192.168.62.240:8000/'; + /** + * All songs URL + */ + static readonly ALL_SONGS_URL = this.SERVER_HOST + 'all_songs1'; + /** + * English songs URL + */ + static readonly ENGLISH_SONGS_URL = this.SERVER_HOST + 'english_songs'; + /** + * Song Image URL + */ + static readonly SONG_IMAGE_URL = this.SERVER_HOST + 'get_song_img/'; + /** + * Play songs URL + */ + static readonly PLAY_SONG_URL = this.SERVER_HOST + 'play_song1/'; + + static readonly PLAYER_STATE_IDLE = 'idle'; + static readonly PLAYER_STATE_INITIALIZED = 'initialized' + static readonly PLAYER_STATE_PREPARED = 'prepared' + static readonly PLAYER_STATE_PLAYING = 'playing' + static readonly PLAYER_STATE_PAUSED = 'paused' + static readonly PLAYER_STATE_COMPLETED = 'completed' + static readonly PLAYER_STATE_STOPPED = 'stopped' + static readonly PLAYER_STATE_RELEASED = 'released' + static readonly PLAYER_STATE_UNKNOWN = 'unknown' + + static readonly UPDATE_TIME_EVENT_ID = '1' + static readonly UPDATE_STATE_EVENT_ID = '2' +} + diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/model/AudioItem.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/model/AudioItem.ets new file mode 100644 index 0000000000000000000000000000000000000000..cf2a9fe8a513e4dc332720c94774dda9bda58d37 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/model/AudioItem.ets @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * AudioItem data entity. + */ + +export default class AudioItem { + title: string = ''; + artist: string = ''; + id: string = '0' + isPlaying: boolean = false; + + constructor(title: string, artist: string, id:string) { + this.title = title; + this.artist = artist; + this.id = id; + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/model/LrcLine.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/model/LrcLine.ets new file mode 100644 index 0000000000000000000000000000000000000000..af6f3a6365088f4116b6e01424954d34e02376bf --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/model/LrcLine.ets @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * List item data entity. + */ +export default class LrcLine { + time: string; + title: string; + + + constructor(time: string, title: string) { + this.title = title; + this.time = time; + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/model/PlayListData.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/model/PlayListData.ets new file mode 100644 index 0000000000000000000000000000000000000000..a5ba54331228e2d7f9a79d2bc27c5931251fdd4d --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/model/PlayListData.ets @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AudioItem from './AudioItem'; + +/** + * List item data entity. + */ +export default class PlayList { + /** + * Text of list item. + */ + title: string; + /** + * Image of list item. + */ + img: Resource; + /** + * Other resource of list item. + */ + others?: string; + subTitle: string + list: AudioItem[] = [] + + constructor(title: string, img: Resource, subTitle: string, list: AudioItem[], others?: string) { + this.title = title; + this.img = img; + this.others = others; + this.subTitle = subTitle; + this.list = list; + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..2ec486823ce302a74fa7c4c060484b935db930d5 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import PlayerBar from '../view/PlayerBar'; +import PlayList from '../view/PlayList'; +import curves from '@ohos.curves'; +import PlayListItem from '../view/PlayListItem'; +import http from '@ohos.net.http' +import ServerConstants from '../manager/ServerConstants'; +import AudioItem from '../model/AudioItem'; +import PlayListData from '../model/PlayListData'; +import PlayerDetail from '../view/PlayerDetail'; +import emitter from '@ohos.events.emitter'; + +@Entry +@Component +struct Index { + @State playLists: PlayListData[] = []; + @State isShowPlayerDetail: boolean = false; + @State isShowPlayList: boolean = false; + @State isRefreshing: boolean = false + @State mOffset: number = 0 + @State mFriction: number = 48 + @State maskOpacity: number = 0.5; + + @Builder + refreshBuilder() { + Column() { + Text('刷新中......') + .fontSize(16) + } + .alignItems(HorizontalAlign.Center) + .justifyContent(FlexAlign.Center) + .padding(24) + .borderRadius(12) + } + + aboutToAppear(): void { + this.getListFromServer(); + } + + aboutToDisappear(): void { + emitter.off(ServerConstants.UPDATE_TIME_EVENT_ID); + emitter.off(ServerConstants.UPDATE_STATE_EVENT_ID); + } + + build() { + Column() { + Stack({ alignContent: Alignment.Bottom }) { + Refresh({ + refreshing: $$this.isRefreshing, + offset: this.mOffset, + friction: this.mFriction, + builder: this.refreshBuilder + }) { + Scroll() { + Column() { + Row() { + Text('推荐歌单') + .fontSize('20fp') + .fontWeight(FontWeight.Medium) + Image($r('app.media.ic_public_arrow_right')) + .objectFit(ImageFit.Contain) + .width(24) + .height(24) + } + .height(36) + .justifyContent(FlexAlign.SpaceBetween) + .width('90%') + .margin(12) + + Grid() { + ForEach(this.playLists, (item: PlayListData) => { + GridItem() { + PlayListItem({ item }) + } + }) + } + .margin(12) + .columnsTemplate('1fr 1fr 1fr') + .columnsGap(8) + .rowsGap(12) + .width('90%') + }.align(Alignment.TopStart) + }.scrollBarWidth(0) + .height('100%') + .margin({ bottom: 112 }) + }.onRefreshing(() => { + setTimeout(() => { + this.getListFromServer(); + this.isRefreshing = false + }, 500) + }) + + PlayerBar({ isShowPlayList: $isShowPlayList, isShowPlayerDetail: $isShowPlayerDetail }) + .backgroundColor(Color.White) + .width('100%') + if (this.isShowPlayerDetail) { + PlayerDetail({ isShowPlayList: $isShowPlayList, isShowPlayerDetail: $isShowPlayerDetail }) + .width('100%') + .height('100%') + .transition(TransitionEffect.OPACITY + .animation({ curve: curves.springMotion() }) + .combine(TransitionEffect.move(TransitionEdge.BOTTOM))) + } + if (this.isShowPlayList) { + Rect() + .width('100%') + .height('100%') + .fill('#e0e0e0') + .fillOpacity(this.maskOpacity) + .onClick(() => { + animateTo({ duration: 350 }, () => { + this.isShowPlayList = false; + }) + }) + .transition(TransitionEffect.OPACITY) + } + if (this.isShowPlayList) { + PlayList() + .width('100%') + .height('80%') + .transition(TransitionEffect.OPACITY + .animation({ curve: curves.springMotion() }) + .combine(TransitionEffect.move(TransitionEdge.BOTTOM))) + } + } + .width('100%') + .height('100%') + } + .width('100%') + } + + onBackPress() { + if (this.isShowPlayList) { + animateTo({ duration: 350 }, () => { + this.isShowPlayList = false; + }) + return true; + } else if (this.isShowPlayerDetail) { + animateTo({ duration: 350 }, () => { + this.isShowPlayerDetail = false; + }) + return true; + } else { + return false; + } + } + + getListFromServer() { + this.playLists = []; + try { + let httpRequest = http.createHttp() + httpRequest.request(ServerConstants.ALL_SONGS_URL, (err: Error, data: http.HttpResponse) => { + if (!err) { + console.info('HttpResponse Result:' + data.result); + let aPlayingList: AudioItem[] = Array(); + // 解析 JSON 字符串为对象 + const jsonObject: object = JSON.parse(data.result as string); + Object.keys(jsonObject).forEach((key) => { + aPlayingList.push(new AudioItem(jsonObject[key].name, jsonObject[key].singer, jsonObject[key].id)); + }); + this.playLists.push(new PlayListData('全部歌曲', $r('app.media.icon'), aPlayingList.length + '首', + aPlayingList, '')); + console.info('HttpResponse code:' + data.responseCode); + console.info('HttpResponse type:' + JSON.stringify(data.resultType)); + console.info('HttpResponse header:' + JSON.stringify(data.header)); + console.info('HttpResponse cookies:' + data.cookies); // 自API version 8开始支持cookie + + } else { + console.info('HttpResponse error:' + JSON.stringify(err)); + } + }); + } catch (err) { + console.info('HttpRequest error:' + JSON.stringify(err)); + } + try { + let httpRequest = http.createHttp() + httpRequest.request(ServerConstants.ENGLISH_SONGS_URL, (err: Error, data: http.HttpResponse) => { + if (!err) { + console.info('HttpResponse Result:' + data.result); + let aPlayingList: AudioItem[] = Array(); + // 解析 JSON 字符串为对象 + const jsonObject: object = JSON.parse(data.result as string); + Object.keys(jsonObject).forEach((key) => { + aPlayingList.push(new AudioItem(jsonObject[key].name, jsonObject[key].singer, jsonObject[key].id)); + }); + this.playLists.push(new PlayListData('英文歌曲', $r('app.media.icon'), aPlayingList.length + '首', + aPlayingList, '')); + console.info('HttpResponse code:' + data.responseCode); + console.info('HttpResponse type:' + JSON.stringify(data.resultType)); + console.info('HttpResponse header:' + JSON.stringify(data.header)); + console.info('HttpResponse cookies:' + data.cookies); // 自API version 8开始支持cookie + } else { + console.info('HttpResponse error:' + JSON.stringify(err)); + } + }); + } catch (err) { + console.info('HttpRequest error:' + JSON.stringify(err)); + } + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/utils/CommonUtils.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/utils/CommonUtils.ets new file mode 100644 index 0000000000000000000000000000000000000000..694bac6c82c54c3c147df7231429af23ae582a85 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/utils/CommonUtils.ets @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import HashMap from '@ohos.util.HashMap'; // 导入HashMap模块 +import LrcLine from '../model/LrcLine'; + +/** + * Binds data to components and provides interfaces. + */ +export class CommonUtils { + private lrcs: HashMap = new HashMap(); + private setLrcs() { + this.lrcs.set('十一种孤独', '[ti:十一种孤独]\n[ar:宿羽阳]\n[al:宿羽阳]\n[by:]\n[offset:0]\n[00:00.46]十一种孤独 - 宿羽阳\n[00:00.78]词:陶小陶\n[00:00.96]曲:宿羽阳\n[00:01.14]编曲:谭侃侃\n[00:01.89]\n[00:30.75]最孤独是读评论区未署名情书\n[00:34.85]\n[00:37.27]像不小心掀开了时光的典故\n[00:41.47]\n[00:44.37]第十是睁开眼就已黄昏迟暮\n[00:48.21]\n[00:51.10]寒星三两落在远远处\n[00:55.48]\n[00:57.95]第九是海蓝时见鲸 林深时见鹿\n[01:01.92]\n[01:04.66]却不见你 在梦醒之处\n[01:08.94]\n[01:11.47]第八是回家的路途绕了几次远路\n[01:16.10]\n[01:18.06]像电台的老情歌循环着音符\n[01:22.34]\n[01:24.84]愿你风尘仆仆 深情不被辜负\n[01:29.32]\n[01:31.41]虽回不到过去 也回不到当初\n[01:36.60]\n[01:38.46]愿你半生漂浮此生能有归宿\n[01:42.99]\n[01:45.20]愿你风雨落幕能有人免你孤苦\n[01:50.38]\n[02:05.91]第七是看一场一群人的演出\n[02:10.02]\n[02:12.61]荧光满眼却看不清楚\n[02:16.74]\n[02:19.44]第六是一个人吃饭 一个人写书\n[02:23.47]\n[02:26.19]一个人拼岁月拼图\n[02:30.43]\n[02:33.03]第五是骑单车过陌生的马路\n[02:37.04]\n[02:39.49]在拥挤的人海中踌躇\n[02:43.57]\n[02:46.52]第四是给空白的纸上画上五线谱\n[02:51.28]\n[02:53.24]每一行都好像是世界的遗嘱\n[02:57.49]\n[02:59.96]愿你风尘仆仆 深情不被辜负\n[03:04.62]\n[03:06.69]虽回不到过去 也回不到当初\n[03:11.60]\n[03:13.38]愿你半生漂浮此生能有归宿\n[03:18.10]\n[03:20.19]愿你风雨落幕能有人免你孤苦\n[03:25.11]\n[03:27.10]愿你风尘仆仆 深情不被辜负\n[03:32.01]\n[03:33.82]虽回不到过去 也回不到当初\n[03:38.70]\n[03:40.52]愿你半生漂浮此生能有归宿\n[03:45.84]\n[03:47.32]愿你风雨落幕能有人免你孤独\n[03:51.97]\n[03:54.58]第三是假装很成熟 假装很忙碌\n[03:58.60]\n[04:01.25]假装擅长一个人独处\n[04:05.28]\n[04:07.94]第二是穿过万家灯火无数\n[04:12.10]\n[04:14.85]却无一人等我在归途\n[04:18.96]\n[04:21.74]第一是收到远方一纸家书\n[04:25.65]\n[04:28.18]说照顾自己 累了别忍着不哭') + } + + getLrc(name: string): LrcLine[] { + let lrcData: LrcLine[] = []; + let lrc = this.lrcs.get(name); + if (lrc !== null && lrc !== undefined) { + let lines = lrc.split('\n'); + // Create an array to store the LRC data + for (let line of lines) { + // Check if the line is a valid LRC line + if (line.includes('[')) { + // Split the line into the time and text components + let content = line.split(']'); + // Add the time and text to the LRC data array + if (content.length > 1 && content[1].trim() !== '') { + lrcData.push(new LrcLine(content[0], content[1])); + } + } + } + } + // Return the LRC data array + return lrcData; + } + formatTime(time: number): string { + let min = Math.floor(time / 60).toString(); + let sec = Math.floor((time % 60)).toString() + if (sec.length === 1) { + sec = '0' + sec; + } + if (min.length === 1) { + min = '0' + min; + } + return min + ':' + sec; + } +} +export default new CommonUtils(); \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/utils/Logger.ts b/scenario/MusicPlayerOnline/entry/src/main/ets/utils/Logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..89b6f97a03c2499e7d37b839119437177f3c6c8b --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/utils/Logger.ts @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024 Hunan OpenValley Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import hilog from '@ohos.hilog'; + +class Logger { + private domain: number; + private prefix: string; + private format: string = '%{public}s, %{public}s'; + + constructor(prefix: string) { + this.prefix = prefix; + this.domain = 0xFF00; + } + + debug(...args: string[]): void { + hilog.debug(this.domain, this.prefix, this.format, args); + } + + info(...args: string[]): void { + hilog.info(this.domain, this.prefix, this.format, args); + } + + warn(...args: string[]): void { + hilog.warn(this.domain, this.prefix, this.format, args); + } + + error(...args: string[]): void { + hilog.error(this.domain, this.prefix, this.format, args); + } +} + +export default new Logger('[Samples_MusicPlayer]'); \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets new file mode 100644 index 0000000000000000000000000000000000000000..54aa274cacccb49a37a6875256f7da0c9681ba66 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayList.ets @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AudioItem from '../model/AudioItem'; +import PlayerManager from '../manager/PlayerManager' +import SongCell from './SongCell'; +import emitter from '@ohos.events.emitter'; +import ServerConstants from '../manager/ServerConstants'; + +@Component +export default struct PlayList { + @State playingList: AudioItem[] = Array(); + @State listTitle: string = '没有播放' + private playerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; + + aboutToAppear() { + this.playingList = this.playerManager.getCurrentPlayList(); + this.listTitle = this.playerManager.getListTitle(); + emitter.on(ServerConstants.UPDATE_STATE_EVENT_ID, (eventData: emitter.EventData) => { + if (eventData !== undefined && eventData.data !== undefined) { + this.playingList = this.playerManager.getCurrentPlayList(); + } + }); + } + + aboutToDisappear(): void { + } + + build() { + Column() { + Text(this.listTitle) + .fontSize(24) + .margin(8) + .fontWeight(FontWeight.Bold) + Scroll() { + Column({ space: 10 }) { + List() { + ForEach(this.playingList, (item: AudioItem) => { + ListItem() { + SongCell({ item }) + } + .width('100%') + .backgroundColor(item.isPlaying ? '#f6f6f6' : Color.White) + .onClick(() => { + this.playerManager.playList(this.listTitle, this.playingList, item) + }) + .height('84vp') + }) + } + .width('100%') + .backgroundColor(Color.White) + } + .width('100%') + } + .margin({ bottom: 36 }) + .width('100%') + } + .backgroundColor(Color.White) + .borderRadius({ topLeft: '18vp', topRight: '18vp' }) + } +} diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayListItem.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayListItem.ets new file mode 100644 index 0000000000000000000000000000000000000000..8a7e46629b3a48987d4c1dcf5acb3c311b571bb9 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayListItem.ets @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import ItemData from '../model/PlayListData'; +import hilog from '@ohos.hilog'; +import prompt from '@ohos.promptAction'; +import PlayerManager from '../manager/PlayerManager'; +import ServerConstants from '../manager/ServerConstants'; + +/** + * List item information component. + */ +@Component +export default struct PlayListItem { + private item: ItemData = new ItemData('', $r('app.media.icon'), '', [], ''); + private PlayerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; + + aboutToAppear() { + } + + build() { + Column() { + Column() { + Row() { + Text(this.item.subTitle) + .fontSize(16) + .margin(8) + .fontColor(Color.White) + Blank() + Image($r('app.media.ic_public_play_white')) + .width(20) + .height(20) + .margin(8) + } + .width('100%') + } + .borderRadius(12) + .backgroundImage(this.item.list.length > 0 ? ServerConstants.SONG_IMAGE_URL + this.item.list[0].id : this.item.img) + .backgroundImageSize(ImageSize.Cover) + .width(120) + .height(120) + .justifyContent(FlexAlign.SpaceBetween) + + Text(this.item.title) + .fontSize('20fp') + .maxLines(2) + .margin({ top: 4 }) + } + .alignItems(HorizontalAlign.Center) + .onClick(() => { + this.enterList(); + }) + } + + enterList() { + prompt.showToast({ + message: '播放歌单:' + this.item.title + }) + if (this.item.list.length > 0) { + this.PlayerManager.playList(this.item.title, this.item.list, this.item.list[0]) + } + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerBar.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerBar.ets new file mode 100644 index 0000000000000000000000000000000000000000..cc9fab9917f65ad669684333f7921ddea3c58fcf --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerBar.ets @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * List item information component. + */ +import emitter from '@ohos.events.emitter'; +import Logger from '../utils/Logger'; +import AudioItem from '../model/AudioItem'; +import ServerConstants from '../manager/ServerConstants'; +import PlayerManager from '../manager/PlayerManager'; + +@Component +export default struct PlayerBar { + private tag: string = 'PlayerBar'; + @State item: AudioItem = new AudioItem('', '', '') + @State rotateAngle: number = 0; + @State durationTime: number = 100; + @State currentTime: number = 0; + @State state: string = ServerConstants.PLAYER_STATE_UNKNOWN; + @Link isShowPlayList: boolean; + @Link isShowPlayerDetail: boolean; + private PlayerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; + + aboutToAppear() { + Logger.info(this.tag, 'aboutToAppear'); + emitter.on(ServerConstants.UPDATE_TIME_EVENT_ID, (eventData: emitter.EventData) => { + if (eventData !== undefined && eventData.data !== undefined) { + //Logger.info(this.tag, 'currentTime:' + eventData.data.currentTime); + this.currentTime = eventData.data.currentTime; + this.durationTime = eventData.data.currentDuration; + } + }); + emitter.on(ServerConstants.UPDATE_STATE_EVENT_ID, (eventData: emitter.EventData) => { + if (eventData !== undefined && eventData.data !== undefined) { + Logger.info(this.tag, 'state:' + eventData.data.state); + if (this.state !== ServerConstants.PLAYER_STATE_PLAYING && eventData.data.state === ServerConstants.PLAYER_STATE_PLAYING) { + this.item = this.PlayerManager.getItem(); + if (this.rotateAngle === 0) { + this.rotateAngle = 360; + Logger.info(this.tag, 'rotateAngle:360'); + } + } + if (eventData.data.state !== ServerConstants.PLAYER_STATE_PLAYING) { + this.rotateAngle = 0; + Logger.info(this.tag, 'rotateAngle:0'); + } + this.state = eventData.data.state; + } + }); + } + + aboutToDisappear() { + Logger.info(this.tag, 'aboutToDisappear'); + emitter.off(ServerConstants.UPDATE_TIME_EVENT_ID); + emitter.off(ServerConstants.UPDATE_STATE_EVENT_ID); + } + + build() { + Column() { + Row() { + Image(ServerConstants.SONG_IMAGE_URL + this.item.id) + .width(64) + .height(64) + .margin(4) + .borderRadius(48) + .rotate({ angle: this.rotateAngle }) + .animation({ + duration: 3600, + curve: Curve.Linear, + delay: 500, + iterations: -1, + playMode: PlayMode.Normal + }) + Text(this.item.title !== '' ? this.item.title + ' - ' + this.item.artist : '未播放') + .fontSize('24fp') + .fontWeight(FontWeight.Bold) + .maxLines(1) + .textOverflow({ overflow: TextOverflow.MARQUEE }) + .width('60%') + .textAlign(TextAlign.Center) + + Blank() + Stack() { + Row({ space: 40 }) { + Progress({ value: 0, total: this.durationTime, type: ProgressType.Ring }) + .color(Color.Black) + .value(this.currentTime) + .width('100%') + .height('100%') + .style({ strokeWidth: '2vp' }) + } + + if (this.state === ServerConstants.PLAYER_STATE_PLAYING) { + Image($r('app.media.ic_public_pause')) + .objectFit(ImageFit.Contain) + .width('90%') + .height('90%') + .padding('4vp') + .onClick(() => { + this.PlayerManager.pause(); + }) + } else { + Image($r('app.media.ic_public_play')) + .objectFit(ImageFit.Contain) + .width('90%') + .height('90%') + .padding('4vp') + .onClick(() => { + this.PlayerManager.resume(); + }) + } + }.alignContent(Alignment.Center) + .width(42) + .height(42) + .margin({ right: 8 }) + + Image($r('app.media.ic_public_view_list')) + .objectFit(ImageFit.Contain) + .width(42) + .height(42) + .margin({ right: 8, left: 8 }) + .onClick(() => { + animateTo({ duration: 350 }, () => { + this.isShowPlayList = true; + }) + }) + } + .width('100%') + .onClick(() => { + animateTo({ duration: 350 }, () => { + this.isShowPlayerDetail = true; + }) + }) + + Divider().strokeWidth(1).color('#E0E0E0') + } + .width('100%') + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerDetail.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerDetail.ets new file mode 100644 index 0000000000000000000000000000000000000000..bf69c03cacf05b4a10f1a66fb6c86a1df16a0205 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/PlayerDetail.ets @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import PlayerManager from '../manager/PlayerManager'; +import emitter from '@ohos.events.emitter'; +import Logger from '../utils/Logger'; +import LrcLine from '../model/LrcLine'; +import CommonUtils from '../utils/CommonUtils'; +import ServerConstants from '../manager/ServerConstants'; +import AudioItem from '../model/AudioItem'; + +/** + * Setting tab content + */ +@Component +export default struct PlayerDetail { + private tag: string = 'PlayerDetail'; + private PlayerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; + @State item:AudioItem = this.PlayerManager.getItem(); + @State listTitle: string = this.PlayerManager.getListTitle(); + @State durationTime: number= 0; + @State currentTime: number = 0; // 当前时间 + @State state: string = this.PlayerManager.getState(); // 播放状态 + @State rotateAngle: number = 0; + @State subCurrentIndex: number = 0; + @State lrcIndex: number = 0 + @State lrc: LrcLine[]= []; + @State contentSwitch: boolean = true; + @Link isShowPlayList: boolean; + @Link isShowPlayerDetail: boolean; + private scroller: Scroller = new Scroller() + private tabsController: TabsController = new TabsController(); + + @Builder + TabBuilder(title: string, index: number, selectedImg: Resource, normalImg: Resource) { + Column() { + Row() { + Text(title) + .fontSize('20fp') + .fontColor(this.subCurrentIndex === index ? '#E02020' : '#6B6B6B') + }.alignItems(VerticalAlign.Top) + + Image(this.subCurrentIndex === index ? selectedImg : normalImg) + .width(25) + } + .height(60) + .margin({ + top: 12, + left: 12, + right: 12 + }) + .onClick(() => { + this.subCurrentIndex = index; + this.tabsController.changeIndex(this.subCurrentIndex); + }) + } + + aboutToAppear() { + emitter.on(ServerConstants.UPDATE_TIME_EVENT_ID, (eventData: emitter.EventData) => { + if (eventData !== undefined && eventData.data !== undefined) { + //Logger.info(this.tag, 'currentTime:' + eventData.data.currentTime); + this.currentTime = eventData.data.currentTime; + this.durationTime = eventData.data.currentDuration; + let newLrcIndex = Math.floor(this.currentTime * this.lrc.length / this.durationTime); + if (newLrcIndex !== this.lrcIndex){ + this.lrcIndex = newLrcIndex; + this.scroller.scrollToIndex(this.lrcIndex-5, true) + } + } + }); + emitter.on(ServerConstants.UPDATE_STATE_EVENT_ID, (eventData: emitter.EventData) => { + if (eventData !== undefined && eventData.data !== undefined) { + Logger.info(this.tag, 'state:' + eventData.data.state); + if (this.state !== ServerConstants.PLAYER_STATE_PLAYING && eventData.data.state === ServerConstants.PLAYER_STATE_PLAYING) { + this.item = this.PlayerManager.getItem(); + this.lrc = CommonUtils.getLrc(this.item.title); + this.listTitle = this.PlayerManager.getListTitle(); + this.scroller.scrollToIndex(0, true) + if (this.rotateAngle === 0) { + this.rotateAngle = 360; + Logger.info(this.tag, 'rotateAngle:360'); + } + } + if (eventData.data.state !== ServerConstants.PLAYER_STATE_PLAYING) { + this.rotateAngle = 0; + Logger.info(this.tag, 'rotateAngle:0'); + } + this.state = eventData.data.state; + } + }); + if (this.state === ServerConstants.PLAYER_STATE_PLAYING) { + setTimeout(() => { + if (this.rotateAngle === 0) { + this.rotateAngle = 360; + Logger.info(this.tag, 'rotateAngle:360'); + } + }, 100); + } + } + + aboutToDisappear() { + } + + build() { + Column() { + Row() { + Image($r('app.media.ic_public_arrow_down_0')) + .height('48vp') + .width('48vp') + .padding('8vp') + .onClick(() => { + animateTo({ duration: 350 }, () => { + this.isShowPlayerDetail = false; + }) + }) + Column() { + if (this.contentSwitch) { + Text(this.listTitle).fontSize('18fp') + .maxLines(2) + } else { + Text(this.item.title).fontSize('18fp') + .maxLines(1) + Row() { + Text(this.item.artist).fontSize('14fp') + .fontColor('#a0a0a0') + Text('关注') + .fontSize('14fp') + .borderRadius('8vp') + .backgroundColor('#22a0a0a0') + .margin('4vp') + .padding({ right: '4vp', left: '4vp' }) + Image($r('app.media.ic_public_arrow_right_grey')) + .width('8vp') + .height('16vp') + } + } + } + .justifyContent(FlexAlign.Center) + .height('60vp') + .width('70%') + + Image($r('app.media.ic_public_share')) + .height('32vp') + .width('32vp') + } + .width('100%') + .justifyContent(FlexAlign.SpaceEvenly) + + Column() { + if (this.contentSwitch) { + Column() { + Image(ServerConstants.SONG_IMAGE_URL + this.item.id) + .width('300vp') + .height('300vp') + .borderRadius('200vp') + .margin('50vp') + .rotate({ angle: this.rotateAngle }) + .animation({ + duration: 3600, + curve: Curve.Linear, + delay: 500, + iterations: -1, // 设置-1表示动画无限循环 + playMode: PlayMode.Normal + }) + Row() { + Column() { + Text(this.item.title).fontSize('18fp') + Row() { + Text(this.item.artist).fontSize('16fp') + .fontColor('#303030') + Text('关注') + .fontSize('14fp') + .fontColor('#303030') + .backgroundColor('#f0f0f0') + .borderRadius('6vp') + .padding({ left: '4vp', right: '4vp' }) + } + }.alignItems(HorizontalAlign.Start) + + Blank() + Stack() { + Image($r('app.media.ic_public_favor')) + .width('36vp') + .height('36vp') + Text('100w+').fontSize('10fp') + .backgroundColor('#ffffff') + .margin({ left: '24vp' }) + }.alignContent(Alignment.Top) + .margin({ right: '8vp' }) + + Stack() { + Image($r('app.media.ic_public_comments')) + .width('36vp') + .height('36vp') + Text('10w+').fontSize('10fp') + .backgroundColor('#ffffff') + .margin({ left: '24vp' }) + }.alignContent(Alignment.Top) + } + .width('80%') + .justifyContent(FlexAlign.SpaceBetween) + }.width('100%') + .height('100%') + .justifyContent(FlexAlign.SpaceAround) + .onClick(() => { + this.contentSwitch = false; + }) + } else { + Column() { + Tabs({ + barPosition: BarPosition.End, + index: 0, + controller: this.tabsController + }) { + TabContent() { + Column() { + List({ space: 10, scroller: this.scroller }) { + ForEach(this.lrc, (item: LrcLine, index: number) => { + ListItem() { + if (index === this.lrcIndex) { + Text(item.title) + .width('100%') + .textAlign(TextAlign.Center) + .fontSize('24fp') + .fontColor(Color.Black) + } else { + Text(item.title) + .width('100%') + .textAlign(TextAlign.Center) + .fontSize('18fp') + .fontColor(Color.Gray) + } + } + }) + } + .width('100%') + }.height('100%') + } + .tabBar(this.TabBuilder('歌词', 0, + $r('app.media.ic_screenshot_line_select'), $r('app.media.ic_screenshot_line'))) + + TabContent() { + Column() { + Scroll() { + Column({ space: 12 }) { + } + } + .width('100%') + }.height('100%') + } + .tabBar(this.TabBuilder('百科', 1, + $r('app.media.ic_screenshot_line_select'), $r('app.media.ic_screenshot_line'))) + } + .width('100%') + .barHeight(60) + .barWidth('70%') + .barMode(BarMode.Scrollable) + .barPosition(BarPosition.Start) + .onChange((index: number) => { + this.subCurrentIndex = index; + }) + } + .width('100%') + .height('100%') + .onClick(() => { + this.contentSwitch = true; + if (this.state === ServerConstants.PLAYER_STATE_PLAYING) { + this.rotateAngle = 0; + animateTo({ duration: 3600 }, () => { + this.rotateAngle = 360; + }) + } + }) + } + }.width('100%') + .height('70%') + + Row() { + Progress({ value: this.currentTime, total: this.durationTime, type: ProgressType.Linear }) + .width('80%') + .height(30) + }.width('100%') + .justifyContent(FlexAlign.Center) + + Row() { + Text(CommonUtils.formatTime(this.currentTime/1000)).fontSize('12fp') + Text('无损').fontSize('12fp') + Text(CommonUtils.formatTime(this.durationTime/1000)).fontSize('12fp') + }.width('80%') + .justifyContent(FlexAlign.SpaceBetween) + + Row() { + Image($r('app.media.ic_public_list_cycle')) + .objectFit(ImageFit.Contain) + .width(42) + .height(42) + .margin({ right: 12, left: 8 }) + Image($r('app.media.ic_public_play_last')) + .objectFit(ImageFit.Contain) + .width(42) + .height(42) + .margin({ right: 12, left: 8 }) + .onClick(() => { + this.PlayerManager.previous(); + }) + if (this.state === ServerConstants.PLAYER_STATE_PLAYING) { + Image($r('app.media.ic_public_pause')) + .objectFit(ImageFit.Contain) + .width(48) + .height(48) + .margin({ right: 12, left: 8 }) + .onClick(() => { + this.PlayerManager.pause(); + }) + } else { + Image($r('app.media.ic_public_play')) + .objectFit(ImageFit.Contain) + .width(48) + .height(48) + .margin({ right: 12, left: '8vp' }) + .onClick(() => { + this.PlayerManager.resume(); + }) + } + Image($r('app.media.ic_public_play_next')) + .objectFit(ImageFit.Contain) + .width(42) + .height(42) + .margin({ right: 12, left: 8 }) + .onClick(() => { + this.PlayerManager.next(); + }) + Image($r('app.media.ic_public_view_list')) + .objectFit(ImageFit.Contain) + .width(42) + .height(42) + .margin({ right: 12, left: 8 }) + .onClick(() => { + animateTo({ duration: 350 }, () => { + this.isShowPlayList = true; + }) + }) + }.width('100%') + .height(64) + .justifyContent(FlexAlign.SpaceEvenly) + } + .justifyContent(FlexAlign.SpaceEvenly) + .width('100%') + .height('100%') + .backgroundColor(Color.White) + .borderRadius({ topLeft: 18, topRight: 18 }) + } +} diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/SongCell.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/SongCell.ets new file mode 100644 index 0000000000000000000000000000000000000000..05fb0ca13484114d38f1aa6db37d299e676ac246 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/SongCell.ets @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AudioItem from '../model/AudioItem'; +import ServerConstants from '../manager/ServerConstants'; + +@Component +export default struct SongCell { + @State item: AudioItem = new AudioItem('', '', ''); + + build() { + Row() { + Image(ServerConstants.SONG_IMAGE_URL + this.item.id) + .width(64) + .height(64) + Blank() + Text(this.item.title) + .fontSize('20fp') + Text('·') + .fontSize('20fp') + .fontColor('#e0e0e0') + Text(this.item.artist) + .maxLines(1) + .fontSize('14fp') + .fontColor('#e0e0e0') + } + .justifyContent(FlexAlign.SpaceBetween) + .width('90%') + .alignSelf(ItemAlign.Center) + } +} diff --git a/scenario/MusicPlayerOnline/entry/src/main/module.json5 b/scenario/MusicPlayerOnline/entry/src/main/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..465a2964803520e78f743ce2bc9f6439c7f593ff --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/module.json5 @@ -0,0 +1,63 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "backgroundModes": [ + "audioPlayback", + "dataTransfer" + ], + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "requestPermissions":[ + { + "name" : "ohos.permission.INTERNET", + "reason": "$string:EntryAbility_desc", + "usedScene": { + "abilities": [ + "EntryAbility" + ], + "when":"inuse" + } + }, + { + "name": "ohos.permission.KEEP_BACKGROUND_RUNNING", + "reason": "$string:keep_running", + "usedScene": { + "abilities": [ + "EntryAbility" + ], + "when": "always" + } + } + ] + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/element/color.json b/scenario/MusicPlayerOnline/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/element/string.json b/scenario/MusicPlayerOnline/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..e1d216d9bccdfe040f1721ba90f2be69aa48958e --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/resources/base/element/string.json @@ -0,0 +1,20 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "MusicPlayerOnline" + }, + { + "name": "keep_running", + "value": "长时任务权限" + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_down_0.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_down_0.png new file mode 100644 index 0000000000000000000000000000000000000000..284284f35b9b6514d3c7a3341b1fc16fd2c481f7 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_down_0.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_right.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..c87d52b4639a5f66c2e359cccfc5429e1501789d Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_right.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_right_grey.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_right_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..c067e4b839d8fdc066932468875ebc07632b3c72 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_arrow_right_grey.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_comments.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..1201b7a1ae939d2b43abd3761779162eca2d2eb1 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_comments.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_favor.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_favor.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3ad475043c0bb65da8a2d3b6d06c44e08062ce Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_favor.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_list_cycle.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_list_cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e95ae27ca18bd9150205bc1de27afc8e812255 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_list_cycle.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_pause.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..833902ec7a4362c6a9d1c1fed2975dbd60d31203 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_pause.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play.png new file mode 100644 index 0000000000000000000000000000000000000000..79bf953161259bc5b5718d210c091dea3bbe4c99 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_last.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_last.png new file mode 100644 index 0000000000000000000000000000000000000000..47f41004c71eecc097c22b8e8bc1b9f81aaf7698 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_last.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_next.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_next.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbe2479a0f84cb0014cc146dcca708fed1d0b96 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_next.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_white.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_white.png new file mode 100644 index 0000000000000000000000000000000000000000..016a114c2f17eb0fc7030da72f8d7bfc5b161e25 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_play_white.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_share.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_share.png new file mode 100644 index 0000000000000000000000000000000000000000..66bd6cca909550f4d0714e6bb1e113ef56d1e479 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_share.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_view_list.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_view_list.png new file mode 100644 index 0000000000000000000000000000000000000000..60db080dc914e706377bcf7466f06449667805c3 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_public_view_list.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_screenshot_line.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_screenshot_line.png new file mode 100644 index 0000000000000000000000000000000000000000..2e373c8d21f6f78e21951aa5ccf7cc1733375217 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_screenshot_line.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_screenshot_line_select.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_screenshot_line_select.png new file mode 100644 index 0000000000000000000000000000000000000000..71c367e35c73fa08fbe796ba3f2591ab1af5eb6e Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/ic_screenshot_line_select.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/icon.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd45accb1dfd2fd0da16c732c72faa6e46b26521 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/icon.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/startIcon.png b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/startIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..366f76459ffd4494ec40d0ddd5c59385b9c5da11 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/main/resources/base/media/startIcon.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/base/profile/main_pages.json b/scenario/MusicPlayerOnline/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..1898d94f58d6128ab712be2c68acc7c98e9ab9ce --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/en_US/element/string.json b/scenario/MusicPlayerOnline/entry/src/main/resources/en_US/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..9c7c1b7a87d2405028ffbaabbcfcda9b82282be7 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "MusicPlayerOnline" + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/main/resources/zh_CN/element/string.json b/scenario/MusicPlayerOnline/entry/src/main/resources/zh_CN/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..47b0f5d592ca927acb48b75cc8eec5a644fb4a12 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "网络音乐" + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/mock/mock-config.json5 b/scenario/MusicPlayerOnline/entry/src/mock/mock-config.json5 new file mode 100644 index 0000000000000000000000000000000000000000..7a73a41bfdf76d6f793007240d80983a52f15f97 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/mock/mock-config.json5 @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/test/Ability.test.ets b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..e5a54aeb298b73e9a92d0a95d6195d2bb03a148c --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import hilog from '@ohos.hilog'; +import { 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/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/test/List.test.ets b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..cd611eb73459651a3eaf450b6377d10bceffe593 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testability/TestAbility.ets b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testability/TestAbility.ets new file mode 100644 index 0000000000000000000000000000000000000000..b4c21f7df51dc04f14508c7fb502362dcce8abd9 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testability/TestAbility.ets @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import UIAbility from '@ohos.app.ability.UIAbility'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; +import hilog from '@ohos.hilog'; +import { Hypium } from '@ohos/hypium'; +import testsuite from '../test/List.test'; +import window from '@ohos.window'; +import Want from '@ohos.app.ability.Want'; +import AbilityConstant from '@ohos.app.ability.AbilityConstant'; + +export default class TestAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate'); + hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? ''); + hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? ''); + let abilityDelegator: AbilityDelegatorRegistry.AbilityDelegator; + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); + let abilityDelegatorArguments: AbilityDelegatorRegistry.AbilityDelegatorArgs; + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments(); + hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!'); + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite); + } + + onDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage) { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate'); + windowStage.loadContent('testability/pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy'); + } + + onForeground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground'); + } + + onBackground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground'); + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testability/pages/Index.ets b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testability/pages/Index.ets new file mode 100644 index 0000000000000000000000000000000000000000..423b4276eccd1d04d56471ae7a863c48015e8ae5 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testability/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/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets new file mode 100644 index 0000000000000000000000000000000000000000..d8cf0ef3e3628adacaee503a1726e68215d91e4d --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import hilog from '@ohos.hilog'; +import { BusinessError } from '@ohos.base'; +import UIAbility from '@ohos.app.ability.UIAbility'; +import TestRunner from '@ohos.application.testRunner'; +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; +import Want from '@ohos.app.ability.Want'; +import resourceManager from '@ohos.resourceManager'; +import util from '@ohos.util'; + +let abilityDelegator: AbilityDelegatorRegistry.AbilityDelegator; +let abilityDelegatorArguments: AbilityDelegatorRegistry.AbilityDelegatorArgs; +let jsonPath: string = 'mock/mock-config.json'; +let tag: string = 'testTag'; + +async function onAbilityCreateCallback(data: UIAbility) { + hilog.info(0x0000, 'testTag', 'onAbilityCreateCallback, data: ${}', JSON.stringify(data)); +} + +async function addAbilityMonitorCallback(err: BusinessError) { + hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? ''); +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare'); + } + + async onRun() { + let tag = 'testTag'; + hilog.info(0x0000, tag, '%{public}s', 'OpenHarmonyTestRunner onRun run'); + abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments() + abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator() + let moduleName = abilityDelegatorArguments.parameters['-m']; + let context = abilityDelegator.getAppContext().getApplicationContext().createModuleContext(moduleName); + let mResourceManager = context.resourceManager; + await checkMock(abilityDelegator, mResourceManager); + const bundleName = abilityDelegatorArguments.bundleName; + const testAbilityName: string = 'TestAbility'; + let lMonitor: AbilityDelegatorRegistry.AbilityMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + moduleName: moduleName + }; + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) + const want: Want = { + bundleName: bundleName, + abilityName: testAbilityName, + moduleName: moduleName + }; + abilityDelegator.startAbility(want, (err: BusinessError, data: void) => { + hilog.info(0x0000, tag, 'startAbility : err : %{public}s', JSON.stringify(err) ?? ''); + hilog.info(0x0000, tag, 'startAbility : data : %{public}s', JSON.stringify(data) ?? ''); + }) + hilog.info(0x0000, tag, '%{public}s', 'OpenHarmonyTestRunner onRun end'); + } +} + +async function checkMock(abilityDelegator: AbilityDelegatorRegistry.AbilityDelegator, resourceManager: resourceManager.ResourceManager) { + let rawFile: Uint8Array; + try { + rawFile = resourceManager.getRawFileContentSync(jsonPath); + hilog.info(0x0000, tag, 'MockList file exists'); + let mockStr: string = util.TextDecoder.create("utf-8", { ignoreBOM: true }).decodeWithStream(rawFile); + let mockMap: Record = getMockList(mockStr); + try { + abilityDelegator.setMockList(mockMap) + } catch (error) { + let code = (error as BusinessError).code; + let message = (error as BusinessError).message; + hilog.error(0x0000, tag, `abilityDelegator.setMockList failed, error code: ${code}, message: ${message}.`); + } + } catch (error) { + let code = (error as BusinessError).code; + let message = (error as BusinessError).message; + hilog.error(0x0000, tag, `ResourceManager:callback getRawFileContent failed, error code: ${code}, message: ${message}.`); + } +} + +function getMockList(jsonStr: string) { + let jsonObj: Record = JSON.parse(jsonStr); + let map: Map = new Map(Object.entries(jsonObj)); + let mockList: Record = {}; + map.forEach((value: object, key: string) => { + let realValue: string = value['source'].toString(); + mockList[key] = realValue; + }); + hilog.info(0x0000, tag, '%{public}s', 'mock-json value:' + JSON.stringify(mockList) ?? ''); + return mockList; +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/module.json5 b/scenario/MusicPlayerOnline/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000000000000000000000000000000000000..4fc9701701e879512edc8da21b356970a89e5166 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/module.json5 @@ -0,0 +1,37 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "description": "$string:module_test_desc", + "mainElement": "TestAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:test_pages", + "abilities": [ + { + "name": "TestAbility", + "srcEntry": "./ets/testability/TestAbility.ets", + "description": "$string:TestAbility_desc", + "icon": "$media:icon", + "label": "$string:TestAbility_label", + "exported": true, + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "skills": [ + { + "actions": [ + "action.system.home" + ], + "entities": [ + "entity.system.home" + ] + } + ] + } + ] + } +} diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/element/color.json b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/element/color.json new file mode 100644 index 0000000000000000000000000000000000000000..3c712962da3c2751c2b9ddb53559afcbd2b54a02 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/element/string.json b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..65d8fa5a7cf54aa3943dcd0214f58d1771bc1f6c --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_test_desc", + "value": "test ability description" + }, + { + "name": "TestAbility_desc", + "value": "the test ability" + }, + { + "name": "TestAbility_label", + "value": "test label" + } + ] +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/media/icon.png b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd45accb1dfd2fd0da16c732c72faa6e46b26521 Binary files /dev/null and b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/media/icon.png differ diff --git a/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/profile/test_pages.json b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/profile/test_pages.json new file mode 100644 index 0000000000000000000000000000000000000000..b7e7343cacb32ce982a45e76daad86e435e054fe --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/ohosTest/resources/base/profile/test_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "testability/pages/Index" + ] +} diff --git a/scenario/MusicPlayerOnline/entry/src/test/List.test.ets b/scenario/MusicPlayerOnline/entry/src/test/List.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..907ed5b1e10ac95a9d5d8d1e3e3835b1762a72f9 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/test/List.test.ets @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/entry/src/test/LocalUnit.test.ets b/scenario/MusicPlayerOnline/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000000000000000000000000000000000..5f657c698a14c9a90c501b4f3075ce4abddc9879 --- /dev/null +++ b/scenario/MusicPlayerOnline/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { 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/scenario/MusicPlayerOnline/hvigor/hvigor-config.json5 b/scenario/MusicPlayerOnline/hvigor/hvigor-config.json5 new file mode 100644 index 0000000000000000000000000000000000000000..721a37b2b31203e76affcb961161c5e9e581d4e8 --- /dev/null +++ b/scenario/MusicPlayerOnline/hvigor/hvigor-config.json5 @@ -0,0 +1,22 @@ +{ + "hvigorVersion": "3.2.4", + "dependencies": { + "@ohos/hvigor-ohos-plugin": "3.2.4" + }, + "execution": { + // "analyze": "default", /* Define the build analyze mode. Value: [ "default" | "verbose" | false ]. Default: "default" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 4096 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process */ + } +} diff --git a/scenario/MusicPlayerOnline/hvigor/hvigor-wrapper.js b/scenario/MusicPlayerOnline/hvigor/hvigor-wrapper.js new file mode 100644 index 0000000000000000000000000000000000000000..372eae8eb4a124095936f9cd78df5c6756746f3f --- /dev/null +++ b/scenario/MusicPlayerOnline/hvigor/hvigor-wrapper.js @@ -0,0 +1 @@ +"use strict";var u=require("path"),D=require("os"),e=require("fs"),t=require("crypto"),r=require("child_process"),n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i={},C={},F=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(C,"__esModule",{value:!0}),C.maxPathLength=C.isMac=C.isLinux=C.isWindows=void 0;const E=F(D),A="Windows_NT",o="Darwin";function a(){return E.default.type()===A}function c(){return E.default.type()===o}C.isWindows=a,C.isLinux=function(){return"Linux"===E.default.type()},C.isMac=c,C.maxPathLength=function(){return c()?1016:a()?259:4095},function(e){var t=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),r=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),i=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&t(D,u,e);return r(D,u),D};Object.defineProperty(e,"__esModule",{value:!0}),e.WORK_SPACE=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.PROJECT_CACHES=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const F=i(D),E=i(u),A=C;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,A.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,A.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=E.resolve(F.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=E.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.PROJECT_CACHES="project_caches",e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=E.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=E.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=E.resolve(e.HVIGOR_USER_HOME,e.PROJECT_CACHES),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_WRAPPER_HOME=E.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.WORK_SPACE="workspace"}(i);var s={},l={};Object.defineProperty(l,"__esModule",{value:!0}),l.logInfoPrintConsole=l.logErrorAndExit=void 0,l.logErrorAndExit=function(u){u instanceof Error?console.error(u.message):console.error(u),process.exit(-1)},l.logInfoPrintConsole=function(u){console.log(u)};var B=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),d=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),f=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&B(D,u,e);return d(D,u),D};Object.defineProperty(s,"__esModule",{value:!0});var _=s.executeBuild=void 0;const p=f(e),O=f(u),h=l;_=s.executeBuild=function(u){const D=O.resolve(u,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const u=p.realpathSync(D);require(u)}catch(e){(0,h.logErrorAndExit)(`Error: ENOENT: no such file ${D},delete ${u} and retry.`)}};var P={},v={};!function(u){var D=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(u,"__esModule",{value:!0}),u.hashFile=u.hash=u.createHash=void 0;const r=D(t),i=D(e);u.createHash=(u="MD5")=>r.default.createHash(u);u.hash=(D,e)=>(0,u.createHash)(e).update(D).digest("hex");u.hashFile=(D,e)=>{if(i.default.existsSync(D))return(0,u.hash)(i.default.readFileSync(D,"utf-8"),e)}}(v);var g={},m={},R={};Object.defineProperty(R,"__esModule",{value:!0}),R.Unicode=void 0;class y{}R.Unicode=y,y.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,y.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,y.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(m,"__esModule",{value:!0}),m.JudgeUtil=void 0;const I=R;m.JudgeUtil=class{static isIgnoreChar(u){return"string"==typeof u&&("\t"===u||"\v"===u||"\f"===u||" "===u||" "===u||"\ufeff"===u||"\n"===u||"\r"===u||"\u2028"===u||"\u2029"===u)}static isSpaceSeparator(u){return"string"==typeof u&&I.Unicode.SPACE_SEPARATOR.test(u)}static isIdStartChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||I.Unicode.ID_START.test(u))}static isIdContinueChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||I.Unicode.ID_CONTINUE.test(u))}static isDigitWithoutZero(u){return/[1-9]/.test(u)}static isDigit(u){return"string"==typeof u&&/[0-9]/.test(u)}static isHexDigit(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};var N=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(g,"__esModule",{value:!0}),g.parseJsonText=g.parseJsonFile=void 0;const b=N(e),S=N(D),w=N(u),H=m;var x;!function(u){u[u.Char=0]="Char",u[u.EOF=1]="EOF",u[u.Identifier=2]="Identifier"}(x||(x={}));let M,T,V,G,j,J,W="start",U=[],L=0,$=1,k=0,K=!1,z="default",q="'",Z=1;function X(u,D=!1){T=String(u),W="start",U=[],L=0,$=1,k=0,G=void 0,K=D;do{M=Q(),nu[W]()}while("eof"!==M.type);return G}function Q(){for(z="default",j="",q="'",Z=1;;){J=Y();const u=Du[z]();if(u)return u}}function Y(){if(T[L])return String.fromCodePoint(T.codePointAt(L))}function uu(){const u=Y();return"\n"===u?($++,k=0):u?k+=u.length:k++,u&&(L+=u.length),u}g.parseJsonFile=function(u,D=!1,e="utf-8"){const t=b.default.readFileSync(w.default.resolve(u),{encoding:e});try{return X(t,D)}catch(D){if(D instanceof SyntaxError){const e=D.message.split("at");if(2===e.length)throw new Error(`${e[0].trim()}${S.default.EOL}\t at ${u}:${e[1].trim()}`)}throw new Error(`${u} is not in valid JSON/JSON5 format.`)}},g.parseJsonText=X;const Du={default(){switch(J){case"/":return uu(),void(z="comment");case void 0:return uu(),eu("eof")}if(!H.JudgeUtil.isIgnoreChar(J)&&!H.JudgeUtil.isSpaceSeparator(J))return Du[W]();uu()},start(){z="value"},beforePropertyName(){switch(J){case"$":case"_":return j=uu(),void(z="identifierName");case"\\":return uu(),void(z="identifierNameStartEscape");case"}":return eu("punctuator",uu());case'"':case"'":return q=J,uu(),void(z="string")}if(H.JudgeUtil.isIdStartChar(J))return j+=uu(),void(z="identifierName");throw Eu(x.Char,uu())},afterPropertyName(){if(":"===J)return eu("punctuator",uu());throw Eu(x.Char,uu())},beforePropertyValue(){z="value"},afterPropertyValue(){switch(J){case",":case"}":return eu("punctuator",uu())}throw Eu(x.Char,uu())},beforeArrayValue(){if("]"===J)return eu("punctuator",uu());z="value"},afterArrayValue(){switch(J){case",":case"]":return eu("punctuator",uu())}throw Eu(x.Char,uu())},end(){throw Eu(x.Char,uu())},comment(){switch(J){case"*":return uu(),void(z="multiLineComment");case"/":return uu(),void(z="singleLineComment")}throw Eu(x.Char,uu())},multiLineComment(){switch(J){case"*":return uu(),void(z="multiLineCommentAsterisk");case void 0:throw Eu(x.Char,uu())}uu()},multiLineCommentAsterisk(){switch(J){case"*":return void uu();case"/":return uu(),void(z="default");case void 0:throw Eu(x.Char,uu())}uu(),z="multiLineComment"},singleLineComment(){switch(J){case"\n":case"\r":case"\u2028":case"\u2029":return uu(),void(z="default");case void 0:return uu(),eu("eof")}uu()},value(){switch(J){case"{":case"[":return eu("punctuator",uu());case"n":return uu(),tu("ull"),eu("null",null);case"t":return uu(),tu("rue"),eu("boolean",!0);case"f":return uu(),tu("alse"),eu("boolean",!1);case"-":case"+":return"-"===uu()&&(Z=-1),void(z="numerical");case".":case"0":case"I":case"N":return void(z="numerical");case'"':case"'":return q=J,uu(),j="",void(z="string")}if(void 0===J||!H.JudgeUtil.isDigitWithoutZero(J))throw Eu(x.Char,uu());z="numerical"},numerical(){switch(J){case".":return j=uu(),void(z="decimalPointLeading");case"0":return j=uu(),void(z="zero");case"I":return uu(),tu("nfinity"),eu("numeric",Z*(1/0));case"N":return uu(),tu("aN"),eu("numeric",NaN)}if(void 0!==J&&H.JudgeUtil.isDigitWithoutZero(J))return j=uu(),void(z="decimalInteger");throw Eu(x.Char,uu())},zero(){switch(J){case".":case"e":case"E":return void(z="decimal");case"x":case"X":return j+=uu(),void(z="hexadecimal")}return eu("numeric",0)},decimalInteger(){switch(J){case".":case"e":case"E":return void(z="decimal")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimal(){switch(J){case".":j+=uu(),z="decimalFraction";break;case"e":case"E":j+=uu(),z="decimalExponent"}},decimalPointLeading(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalFraction");throw Eu(x.Char,uu())},decimalFraction(){switch(J){case"e":case"E":return j+=uu(),void(z="decimalExponent")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimalExponent(){switch(J){case"+":case"-":return j+=uu(),void(z="decimalExponentSign")}if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentSign(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Eu(x.Char,uu())},decimalExponentInteger(){if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},hexadecimal(){if(H.JudgeUtil.isHexDigit(J))return j+=uu(),void(z="hexadecimalInteger");throw Eu(x.Char,uu())},hexadecimalInteger(){if(!H.JudgeUtil.isHexDigit(J))return eu("numeric",Z*Number(j));j+=uu()},identifierNameStartEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":break;default:if(!H.JudgeUtil.isIdStartChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},identifierName(){switch(J){case"$":case"_":case"‌":case"‍":return void(j+=uu());case"\\":return uu(),void(z="identifierNameEscape")}if(!H.JudgeUtil.isIdContinueChar(J))return eu("identifier",j);j+=uu()},identifierNameEscape(){if("u"!==J)throw Eu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!H.JudgeUtil.isIdContinueChar(u))throw Eu(x.Identifier)}j+=u,z="identifierName"},string(){switch(J){case"\\":return uu(),void(j+=function(){const u=Y(),D=function(){switch(Y()){case"b":return uu(),"\b";case"f":return uu(),"\f";case"n":return uu(),"\n";case"r":return uu(),"\r";case"t":return uu(),"\t";case"v":return uu(),"\v"}return}();if(D)return D;switch(u){case"0":if(uu(),H.JudgeUtil.isDigit(Y()))throw Eu(x.Char,uu());return"\0";case"x":return uu(),function(){let u="",D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());if(u+=uu(),D=Y(),!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());return u+=uu(),String.fromCodePoint(parseInt(u,16))}();case"u":return uu(),ru();case"\n":case"\u2028":case"\u2029":return uu(),"";case"\r":return uu(),"\n"===Y()&&uu(),""}if(void 0===u||H.JudgeUtil.isDigitWithoutZero(u))throw Eu(x.Char,uu());return uu()}());case'"':case"'":if(J===q){const u=eu("string",j);return uu(),u}return void(j+=uu());case"\n":case"\r":case void 0:throw Eu(x.Char,uu());case"\u2028":case"\u2029":!function(u){console.warn(`JSON5: '${Fu(u)}' in strings is not valid ECMAScript; consider escaping.`)}(J)}j+=uu()}};function eu(u,D){return{type:u,value:D,line:$,column:k}}function tu(u){for(const D of u){if(Y()!==D)throw Eu(x.Char,uu());uu()}}function ru(){let u="",D=4;for(;D-- >0;){const D=Y();if(!H.JudgeUtil.isHexDigit(D))throw Eu(x.Char,uu());u+=uu()}return String.fromCodePoint(parseInt(u,16))}const nu={start(){if("eof"===M.type)throw Eu(x.EOF);iu()},beforePropertyName(){switch(M.type){case"identifier":case"string":return V=M.value,void(W="afterPropertyName");case"punctuator":return void Cu();case"eof":throw Eu(x.EOF)}},afterPropertyName(){if("eof"===M.type)throw Eu(x.EOF);W="beforePropertyValue"},beforePropertyValue(){if("eof"===M.type)throw Eu(x.EOF);iu()},afterPropertyValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforePropertyName");case"}":Cu()}},beforeArrayValue(){if("eof"===M.type)throw Eu(x.EOF);"punctuator"!==M.type||"]"!==M.value?iu():Cu()},afterArrayValue(){if("eof"===M.type)throw Eu(x.EOF);switch(M.value){case",":return void(W="beforeArrayValue");case"]":Cu()}},end(){}};function iu(){const u=function(){let u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}return u}();if(K&&"object"==typeof u&&(u._line=$,u._column=k),void 0===G)G=u;else{const D=U[U.length-1];Array.isArray(D)?K&&"object"!=typeof u?D.push({value:u,_line:$,_column:k}):D.push(u):D[V]=K&&"object"!=typeof u?{value:u,_line:$,_column:k}:u}!function(u){if(u&&"object"==typeof u)U.push(u),W=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}}(u)}function Cu(){U.pop();const u=U[U.length-1];W=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}function Fu(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return`\\x${`00${D}`.substring(D.length)}`}return u}function Eu(u,D){let e="";switch(u){case x.Char:e=void 0===D?`JSON5: invalid end of input at ${$}:${k}`:`JSON5: invalid character '${Fu(D)}' at ${$}:${k}`;break;case x.EOF:e=`JSON5: invalid end of input at ${$}:${k}`;break;case x.Identifier:k-=5,e=`JSON5: invalid identifier character at ${$}:${k}`}const t=new Au(e);return t.lineNumber=$,t.columnNumber=k,t}class Au extends SyntaxError{}var ou={},au=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),cu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),su=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&au(D,u,e);return cu(D,u),D},lu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(ou,"__esModule",{value:!0}),ou.isFileExists=ou.offlinePluginConversion=ou.executeCommand=ou.getNpmPath=ou.hasNpmPackInPaths=void 0;const Bu=r,du=lu(e),fu=su(u),_u=i,pu=l;ou.hasNpmPackInPaths=function(u,D){try{return require.resolve(u,{paths:[...D]}),!0}catch(u){return!1}},ou.getNpmPath=function(){const u=process.execPath;return fu.join(fu.dirname(u),_u.NPM_TOOL)},ou.executeCommand=function(u,D,e){0!==(0,Bu.spawnSync)(u,D,e).status&&(0,pu.logErrorAndExit)(`Error: ${u} ${D} execute failed.See above for details.`)},ou.offlinePluginConversion=function(u,D){return D.startsWith("file:")||D.endsWith(".tgz")?fu.resolve(u,_u.HVIGOR,D.replace("file:","")):D},ou.isFileExists=function(u){return du.default.existsSync(u)&&du.default.statSync(u).isFile()};var Ou=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),hu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),Pu=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&Ou(D,u,e);return hu(D,u),D},vu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(P,"__esModule",{value:!0});var gu=P.initProjectWorkSpace=void 0;const mu=Pu(e),Ru=vu(D),yu=Pu(u),Iu=v,Nu=i,bu=g,Su=l,wu=ou;let Hu,xu,Mu;function Tu(u,D,e){return void 0!==e.dependencies&&(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,D.dependencies[u])===yu.normalize(e.dependencies[u])}function Vu(){const u=yu.join(Mu,Nu.WORK_SPACE);if((0,Su.logInfoPrintConsole)("Hvigor cleaning..."),!mu.existsSync(u))return;const D=mu.readdirSync(u);if(!D||0===D.length)return;const e=yu.resolve(Mu,"node_modules","@ohos","hvigor","bin","hvigor.js");mu.existsSync(e)&&(0,wu.executeCommand)(process.argv[0],[e,"--stop-daemon"],{});try{D.forEach((D=>{mu.rmSync(yu.resolve(u,D),{recursive:!0})}))}catch(D){(0,Su.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${u}.`)}}gu=P.initProjectWorkSpace=function(){if(Hu=function(){const u=yu.resolve(Nu.HVIGOR_PROJECT_WRAPPER_HOME,Nu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);mu.existsSync(u)||(0,Su.logErrorAndExit)(`Error: Hvigor config file ${u} does not exist.`);return(0,bu.parseJsonFile)(u)}(),Mu=function(u){let D;D=function(u){let D=u.hvigorVersion;if(D.startsWith("file:")||D.endsWith(".tgz"))return!1;const e=u.dependencies,t=Object.getOwnPropertyNames(e);for(const u of t){const D=e[u];if(D.startsWith("file:")||D.endsWith(".tgz"))return!1}if(1===t.length&&"@ohos/hvigor-ohos-plugin"===t[0])return D>"2.5.0";return!1}(u)?function(u){let D=`${Nu.HVIGOR_ENGINE_PACKAGE_NAME}@${u.hvigorVersion}`;const e=u.dependencies;if(e){Object.getOwnPropertyNames(e).sort().forEach((u=>{D+=`,${u}@${e[u]}`}))}return(0,Iu.hash)(D)}(u):(0,Iu.hash)(process.cwd());return yu.resolve(Ru.default.homedir(),".hvigor","project_caches",D)}(Hu),xu=function(){const u=yu.resolve(Mu,Nu.WORK_SPACE,Nu.DEFAULT_PACKAGE_JSON);return mu.existsSync(u)?(0,bu.parseJsonFile)(u):{dependencies:{}}}(),!(0,wu.hasNpmPackInPaths)(Nu.HVIGOR_ENGINE_PACKAGE_NAME,[yu.join(Mu,Nu.WORK_SPACE)])||(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion)!==xu.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function u(u){const D=null==u?void 0:u.dependencies;return void 0===D?0:Object.getOwnPropertyNames(D).length}const D=u(Hu),e=u(xu);if(D+1!==e)return!1;for(const u in null==Hu?void 0:Hu.dependencies)if(!(0,wu.hasNpmPackInPaths)(u,[yu.join(Mu,Nu.WORK_SPACE)])||!Tu(u,Hu,xu))return!1;return!0}()){Vu();try{!function(){(0,Su.logInfoPrintConsole)("Hvigor installing...");for(const u in Hu.dependencies)Hu.dependencies[u]&&(Hu.dependencies[u]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.dependencies[u]));const u={dependencies:{...Hu.dependencies}};u.dependencies[Nu.HVIGOR_ENGINE_PACKAGE_NAME]=(0,wu.offlinePluginConversion)(Nu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion);const D=yu.join(Mu,Nu.WORK_SPACE);try{mu.mkdirSync(D,{recursive:!0});const e=yu.resolve(D,Nu.DEFAULT_PACKAGE_JSON);mu.writeFileSync(e,JSON.stringify(u))}catch(u){(0,Su.logErrorAndExit)(u)}(function(){const u=["config","set","store-dir",Nu.HVIGOR_PNPM_STORE_PATH],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)})(),function(){const u=["install"],D={cwd:yu.join(Mu,Nu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(Nu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)}(),(0,Su.logInfoPrintConsole)("Hvigor install success.")}()}catch(u){Vu()}}return Mu};var Gu={};!function(t){var C=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),F=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),E=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&C(D,u,e);return F(D,u),D},A=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(t,"__esModule",{value:!0}),t.executeInstallPnpm=t.isPnpmInstalled=t.environmentHandler=t.checkNpmConifg=t.PNPM_VERSION=void 0;const o=r,a=E(e),c=A(D),s=E(u),B=i,d=l,f=ou;t.PNPM_VERSION="7.30.0",t.checkNpmConifg=function(){const u=s.resolve(B.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),D=s.resolve(c.default.homedir(),".npmrc");if((0,f.isFileExists)(u)||(0,f.isFileExists)(D))return;const e=(0,f.getNpmPath)(),t=(0,o.spawnSync)(e,["config","get","prefix"],{cwd:B.HVIGOR_PROJECT_ROOT_DIR});if(0!==t.status||!t.stdout)return void(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const r=s.resolve(`${t.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,f.isFileExists)(r)||(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},t.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},t.isPnpmInstalled=function(){return!!a.existsSync(B.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,f.hasNpmPackInPaths)("pnpm",[B.HVIGOR_WRAPPER_TOOLS_HOME])},t.executeInstallPnpm=function(){(0,d.logInfoPrintConsole)(`Installing pnpm@${t.PNPM_VERSION}...`);const u=(0,f.getNpmPath)();!function(){const u=s.resolve(B.HVIGOR_WRAPPER_TOOLS_HOME,B.DEFAULT_PACKAGE_JSON);try{a.existsSync(B.HVIGOR_WRAPPER_TOOLS_HOME)||a.mkdirSync(B.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const D={dependencies:{}};D.dependencies[B.PNPM]=t.PNPM_VERSION,a.writeFileSync(u,JSON.stringify(D))}catch(D){(0,d.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${u} failed.`)}}(),(0,f.executeCommand)(u,["install","pnpm"],{cwd:B.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,d.logInfoPrintConsole)("Pnpm install success.")}}(Gu),function(){Gu.checkNpmConifg(),Gu.environmentHandler(),Gu.isPnpmInstalled()||Gu.executeInstallPnpm();const D=gu();_(u.join(D,i.WORK_SPACE))}(); \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/hvigorfile.ts b/scenario/MusicPlayerOnline/hvigorfile.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3cb9f1a87a81687554a76283af8df27d8bda775 --- /dev/null +++ b/scenario/MusicPlayerOnline/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/scenario/MusicPlayerOnline/hvigorw b/scenario/MusicPlayerOnline/hvigorw new file mode 100644 index 0000000000000000000000000000000000000000..4f0aa945c9d740efab56879f3bcd8b1be1550f35 --- /dev/null +++ b/scenario/MusicPlayerOnline/hvigorw @@ -0,0 +1,54 @@ +#!/bin/bash + +# ---------------------------------------------------------------------------- +# Hvigor startup script, version 1.0.0 +# +# Required ENV vars: +# ------------------ +# NODE_HOME - location of a Node home dir +# or +# Add /usr/local/nodejs/bin to the PATH environment variable +# ---------------------------------------------------------------------------- + +HVIGOR_APP_HOME="`pwd -P`" +HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js +#NODE_OPTS="--max-old-space-size=4096" + +fail() { + echo "$*" + exit 1 +} + +set_executable_node() { + EXECUTABLE_NODE="${NODE_HOME}/bin/node" + if [ -x "$EXECUTABLE_NODE" ]; then + return + fi + + EXECUTABLE_NODE="${NODE_HOME}/node" + if [ -x "$EXECUTABLE_NODE" ]; then + return + fi + fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed" +} + +# Determine node to start hvigor wrapper script +if [ -n "${NODE_HOME}" ]; then + set_executable_node +else + EXECUTABLE_NODE="node" + command -v ${EXECUTABLE_NODE} &> /dev/null || fail "ERROR: NODE_HOME not set and 'node' command not found" +fi + +# Check hvigor wrapper script +if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ]; then + fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}" +fi + +if [ -z "${NODE_OPTS}" ]; then + NODE_OPTS="--" +fi + +# start hvigor-wrapper script +exec "${EXECUTABLE_NODE}" "${NODE_OPTS}" \ + "${HVIGOR_WRAPPER_SCRIPT}" "$@" diff --git a/scenario/MusicPlayerOnline/hvigorw.bat b/scenario/MusicPlayerOnline/hvigorw.bat new file mode 100644 index 0000000000000000000000000000000000000000..b5eecf5a159f733825a80568476b6e1f5ef17cf2 --- /dev/null +++ b/scenario/MusicPlayerOnline/hvigorw.bat @@ -0,0 +1,54 @@ +@rem +@rem ---------------------------------------------------------------------------- +@rem Hvigor startup script for Windows, version 1.0.0 +@rem +@rem Required ENV vars: +@rem ------------------ +@rem NODE_HOME - location of a Node home dir +@rem or +@rem Add %NODE_HOME%/bin to the PATH environment variable +@rem ---------------------------------------------------------------------------- +@rem +@echo off + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js +set NODE_EXE=node.exe +@rem set NODE_OPTS="--max-old-space-size=4096" + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +if not defined NODE_OPTS set NODE_OPTS="--" + +@rem Find node.exe +if defined NODE_HOME ( + set NODE_HOME=%NODE_HOME:"=% + set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE% +) + +%NODE_EXE% --version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" ( + "%NODE_EXE%" "%NODE_OPTS%" "%WRAPPER_MODULE_PATH%" %* +) else if exist "%NODE_EXE_PATH%" ( + "%NODE_EXE%" "%NODE_OPTS%" "%WRAPPER_MODULE_PATH%" %* +) else ( + echo. + echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. + echo. + echo Please set the NODE_HOME variable in your environment to match the + echo location of your NodeJs installation. +) + +if "%ERRORLEVEL%" == "0" ( + if "%OS%" == "Windows_NT" endlocal +) else ( + exit /b %ERRORLEVEL% +) \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/oh-package-lock.json5 b/scenario/MusicPlayerOnline/oh-package-lock.json5 new file mode 100644 index 0000000000000000000000000000000000000000..f2c0b4bc40ac476c24d8f55d8ed79a4205d42c66 --- /dev/null +++ b/scenario/MusicPlayerOnline/oh-package-lock.json5 @@ -0,0 +1,21 @@ +{ + "lockfileVersion": 2, + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + "specifiers": { + "@ohos/hamock@1.0.0": "@ohos/hamock@1.0.0", + "@ohos/hypium@1.0.13": "@ohos/hypium@1.0.13" + }, + "packages": { + "@ohos/hypium@1.0.13": { + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hypium/-/hypium-1.0.13.tgz", + "integrity": "sha512-d0+XvDeAYk5Vgl6JQ8Q1G+NPmTyJI8qgZ1PwPfcUbx/dfyKVAAv9lz1XtVNhYypyWEKqAzu8zMAC9GuHo2Y53Q==", + "registryType": "ohpm", + "shasum": "88d8dda420097efb98d770bf59616faef4682f06" + }, + "@ohos/hamock@1.0.0": { + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hamock/-/hamock-1.0.0.har", + "integrity": "sha512-K6lDPYc6VkKe6ZBNQa9aoG+ZZMiwqfcR/7yAVFSUGIuOAhPvCJAo9+t1fZnpe0dBRBPxj2bxPPbKh69VuyAtDg==", + "registryType": "ohpm" + } + } +} \ No newline at end of file diff --git a/scenario/MusicPlayerOnline/oh-package.json5 b/scenario/MusicPlayerOnline/oh-package.json5 new file mode 100644 index 0000000000000000000000000000000000000000..4a9e1a1e6bd685064940e9b1f152e0114cf2024c --- /dev/null +++ b/scenario/MusicPlayerOnline/oh-package.json5 @@ -0,0 +1,14 @@ +{ + "name": "musicPlayerOnline", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.13", + "@ohos/hamock": "1.0.0" + } +} diff --git a/scenario/MusicPlayerOnline/screenshots/detail.jpeg b/scenario/MusicPlayerOnline/screenshots/detail.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..dd4a2af8b293b768dc279eb35fdbbd7c7ee23c95 Binary files /dev/null and b/scenario/MusicPlayerOnline/screenshots/detail.jpeg differ diff --git a/scenario/MusicPlayerOnline/screenshots/home.jpeg b/scenario/MusicPlayerOnline/screenshots/home.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..67ad931527990d639a8a889e513729330b9348cd Binary files /dev/null and b/scenario/MusicPlayerOnline/screenshots/home.jpeg differ diff --git a/scenario/MusicPlayerOnline/screenshots/playlist.jpeg b/scenario/MusicPlayerOnline/screenshots/playlist.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..127035917a032117f4280a428b97e825c7150b17 Binary files /dev/null and b/scenario/MusicPlayerOnline/screenshots/playlist.jpeg differ diff --git a/scenario/MyMusic/build-profile.json5 b/scenario/MyMusic/build-profile.json5 index a4107014a22f932cea15f8516f2f3c04e09011fb..1d76258eb9aa3c8e37ea020d9e98514f391d6314 100644 --- a/scenario/MyMusic/build-profile.json5 +++ b/scenario/MyMusic/build-profile.json5 @@ -4,13 +4,13 @@ { "name": "default", "material": { - "certpath": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_MyMusic_com.example.myMusic.cer", - "storePassword": "0000001B089A7CB3265872A728E5F75B53883DE111A1CF89240C41BE5D6D363A4A03E0C91084D6F197AB4D", + "certpath": "C:/Users/Administrator/.ohos/config/openharmony/default_MyMusic_lkCEl5hB6byCgDNwkkzI0Yqu7GQgF9mylAcmfpHqqu0=.cer", + "storePassword": "0000001BC50E6AA7A047A3C1FC572B2EFF4332B1C55C5AD224EC264CE0DF65ECCB6F1D9FF06CF0102B2CDC", "keyAlias": "debugKey", - "keyPassword": "0000001B3FBC7F761895EDA1F71D82305EE49F3CB8544831DA0043E85787C852514AF21C6F95DA0E6C1F6C", - "profile": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_MyMusic_com.example.myMusic.p7b", + "keyPassword": "0000001B3CCD1B99F4356696F09FA8A524C9FDDF1976231F98F425B8528E5BFE5DDE22A0ACE2F394CD5F09", + "profile": "C:/Users/Administrator/.ohos/config/openharmony/default_MyMusic_lkCEl5hB6byCgDNwkkzI0Yqu7GQgF9mylAcmfpHqqu0=.p7b", "signAlg": "SHA256withECDSA", - "storeFile": "C:\\Users\\Administrator\\.ohos\\config\\openharmony\\auto_ohos_default_MyMusic_com.example.myMusic.p12" + "storeFile": "C:/Users/Administrator/.ohos/config/openharmony/default_MyMusic_lkCEl5hB6byCgDNwkkzI0Yqu7GQgF9mylAcmfpHqqu0=.p12" } } ], diff --git a/scenario/MyMusic/hvigor/hvigor-config.json5 b/scenario/MyMusic/hvigor/hvigor-config.json5 index 1a474900a688269946dbf37db2a9038a27824fc5..df8d324a3083c7b25630a9f83b8abb52fe77e1c3 100644 --- a/scenario/MyMusic/hvigor/hvigor-config.json5 +++ b/scenario/MyMusic/hvigor/hvigor-config.json5 @@ -1,7 +1,7 @@ { - "hvigorVersion": "3.0.9", + "hvigorVersion": "3.2.4", "dependencies": { - "@ohos/hvigor-ohos-plugin": "3.0.9" + "@ohos/hvigor-ohos-plugin": "3.2.4" }, "execution": { // "daemon": true, /* Enable daemon compilation. Default: true */ @@ -15,4 +15,4 @@ "debugging": { // "stacktrace": false /* Disable stacktrace compilation. Default: false */ } -} +} \ No newline at end of file diff --git a/scenario/MyMusic/oh-package-lock.json5 b/scenario/MyMusic/oh-package-lock.json5 index ddc8a54dc3a0148e1eab04cfb0c1d72e5077c01f..b73134ed2b00a3ec15a3fb994b43ceadaa69b813 100644 --- a/scenario/MyMusic/oh-package-lock.json5 +++ b/scenario/MyMusic/oh-package-lock.json5 @@ -1,5 +1,5 @@ { - "lockfileVersion": 1, + "lockfileVersion": 2, "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", "specifiers": { "@ohos/hypium@1.0.11": "@ohos/hypium@1.0.11" @@ -7,7 +7,9 @@ "packages": { "@ohos/hypium@1.0.11": { "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hypium/-/hypium-1.0.11.tgz", - "integrity": "sha512-KawcLnv43C3QIYv1UbDnKCFX3MohtDxGuFvzlUxT/qf2DBilR56Ws6zrj90LdH6PjloJQwOPESuBQIHBACAK7w==" + "integrity": "sha512-KawcLnv43C3QIYv1UbDnKCFX3MohtDxGuFvzlUxT/qf2DBilR56Ws6zrj90LdH6PjloJQwOPESuBQIHBACAK7w==", + "registryType": "ohpm", + "shasum": "fa799d273fa7d921701578c5e7084849354a4af0" } } } \ No newline at end of file