From e16ac37e30f922f8e9c7df5d22e41c52eaa0bdf2 Mon Sep 17 00:00:00 2001 From: tianfenxia Date: Mon, 16 Aug 2021 17:10:58 +0800 Subject: [PATCH] tianfenxia1@huawei.com Signed-off-by: tianfenxia --- multimedia/BUILD.gn | 2 +- multimedia/audio/audioPlayer/BUILD.gn | 18 + multimedia/audio/audioPlayer/Test.json | 18 + .../hap/entry-debug-rich-signed.hap | Bin 0 -> 152146 bytes .../project/entry/src/main/config.json | 59 ++ .../project/entry/src/main/js/default/app.js | 25 + .../entry/src/main/js/default/i18n/en-US.json | 6 + .../entry/src/main/js/default/i18n/zh-CN.json | 6 + .../src/main/js/default/pages/index/index.css | 9 + .../src/main/js/default/pages/index/index.hml | 5 + .../src/main/js/default/pages/index/index.js | 45 + .../entry/src/main/js/test/List.test.js | 16 + .../js/test/PlayerLocalTestAudioFUNC.test.js | 887 ++++++++++++++++++ .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes 15 files changed, 1107 insertions(+), 1 deletion(-) create mode 100644 multimedia/audio/audioPlayer/BUILD.gn create mode 100644 multimedia/audio/audioPlayer/Test.json create mode 100644 multimedia/audio/audioPlayer/hap/entry-debug-rich-signed.hap create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/config.json create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/default/app.js create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/en-US.json create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/zh-CN.json create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.css create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.hml create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.js create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/test/List.test.js create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/js/test/PlayerLocalTestAudioFUNC.test.js create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/resources/base/element/string.json create mode 100644 multimedia/audio/audioPlayer/project/entry/src/main/resources/base/media/icon.png diff --git a/multimedia/BUILD.gn b/multimedia/BUILD.gn index a9292308f..348402f1a 100755 --- a/multimedia/BUILD.gn +++ b/multimedia/BUILD.gn @@ -16,7 +16,7 @@ import("//test/xts/tools/build/suite.gni") group("multimedia") { testonly = true if (is_standard_system) { - deps = [ "audio/audio_js_standard:audio_manager_js_test" ] + deps = [ "audio/audioPlayer:audio_player_js_hap" ] } else { deps = [ #"audio/audio_hap_test:MediaAudio_test_hap", diff --git a/multimedia/audio/audioPlayer/BUILD.gn b/multimedia/audio/audioPlayer/BUILD.gn new file mode 100644 index 000000000..d11bfe3d1 --- /dev/null +++ b/multimedia/audio/audioPlayer/BUILD.gn @@ -0,0 +1,18 @@ +# Copyright (C) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import("//test/xts/tools/build/suite.gni") + +ohos_js_hap_suite("audio_player_js_hap") { + test_hap_name = "AudioPlayerJsTest" + hap_source_path = "hap/entry-debug-rich-signed.hap" +} diff --git a/multimedia/audio/audioPlayer/Test.json b/multimedia/audio/audioPlayer/Test.json new file mode 100644 index 000000000..02125190a --- /dev/null +++ b/multimedia/audio/audioPlayer/Test.json @@ -0,0 +1,18 @@ +{ + "description": "Configuration for audio manager Tests", + "driver": { + "type": "JSUnitTest", + "test-timeout": "21600000", + "package": "ohos.acts.multimedia.audio.function", + "shell-timeout": "21600000" + }, + "kits": [ + { + "test-file-name": [ + "AudioPlayerJsTest.hap" + ], + "type": "AppInstallKit", + "cleanup-apps": true + } + ] +} \ No newline at end of file diff --git a/multimedia/audio/audioPlayer/hap/entry-debug-rich-signed.hap b/multimedia/audio/audioPlayer/hap/entry-debug-rich-signed.hap new file mode 100644 index 0000000000000000000000000000000000000000..9f875f974f29fc7ad6da92d74e451a1dd7c33eb3 GIT binary patch literal 152146 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 B0B!&P literal 0 HcmV?d00001 diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/config.json b/multimedia/audio/audioPlayer/project/entry/src/main/config.json new file mode 100644 index 000000000..a8e2d584e --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/config.json @@ -0,0 +1,59 @@ +{ + "app": { + "bundleName": "ohos.acts.multimedia.audio.function", + "vendor": "acts", + "version": { + "code": 1000000, + "name": "1.0.0" + }, + "apiVersion": { + "compatible": 4, + "target": 4 + } + }, + "deviceConfig": {}, + "module": { + "package": "ohos.acts.multimedia.audio.function", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "name": "ohos.acts.multimedia.audio.function.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "$string:app_name", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/default/app.js b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/app.js new file mode 100644 index 000000000..e0b2e05a4 --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/app.js @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import device from '@system.device'; + +export default { + onCreate() { + console.info('AceApplication onCreate'); + }, + onDestroy() { + console.info('AceApplication onDestroy'); + } +}; diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/en-US.json b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/en-US.json new file mode 100644 index 000000000..e63c70d97 --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/en-US.json @@ -0,0 +1,6 @@ +{ + "strings": { + "hello": "Hello", + "world": "World" + } +} \ No newline at end of file diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/zh-CN.json b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/zh-CN.json new file mode 100644 index 000000000..de6ee5748 --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/i18n/zh-CN.json @@ -0,0 +1,6 @@ +{ + "strings": { + "hello": "您好", + "world": "世界" + } +} \ No newline at end of file diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.css b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.css new file mode 100644 index 000000000..6fda79275 --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.css @@ -0,0 +1,9 @@ +.container { + flex-direction: column; + justify-content: center; + align-items: center; +} + +.title { + font-size: 100px; +} diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.hml b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.hml new file mode 100644 index 000000000..f64b040a5 --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.hml @@ -0,0 +1,5 @@ +
+ + {{ $t('strings.hello') }} {{ title }} + +
diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.js b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.js new file mode 100644 index 000000000..0ee24b27c --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/default/pages/index/index.js @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import file from '@system.file' +import app from '@system.app' +import {Core, ExpectExtend, ReportExtend} from 'deccjsunit/index' + +export default { + data: { + title: "" + }, + onInit() { + this.title = this.$t('strings.world'); + }, + onShow() { + console.info('onShow finish') + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + const reportExtend = new ReportExtend(file) + core.addService('expect', expectExtend) + core.addService('report', reportExtend) + core.init() + const configService = core.getDefaultService('config') + configService.setConfig(this) + + require('../../../test/List.test') + core.execute() + }, + onReady() { + }, +} \ No newline at end of file diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/test/List.test.js b/multimedia/audio/audioPlayer/project/entry/src/main/js/test/List.test.js new file mode 100644 index 000000000..36ac6f11b --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/test/List.test.js @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require('./PlayerLocalTestAudioFUNC.test.js') \ No newline at end of file diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/js/test/PlayerLocalTestAudioFUNC.test.js b/multimedia/audio/audioPlayer/project/entry/src/main/js/test/PlayerLocalTestAudioFUNC.test.js new file mode 100644 index 000000000..e9249f0fc --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/js/test/PlayerLocalTestAudioFUNC.test.js @@ -0,0 +1,887 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES 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 {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe('PlayerLocalTestAudioFUNC', function () { + var audioPlayer = media.createAudioPlayer(); + var audioSource = "data/media/audio/Homey.mp3"; + var PLAY_TIME = 3000; + var DURATION_TIME = 89239; + var SEEK_TIME = 5000; + var DELTA_TIME = 1000; + var ENDSTATE = 0; + var SRCSTATE = 1; + var PLAYSTATE = 2; + var PAUSESTATE = 3; + var STOPSTATE = 4; + var RESETSTATE = 5; + var SEEKSTATE = 6; + var VOLUMESTATE = 7; + var RELEASESTATE = 8; + var ERRORSTATE = 9; + var FINISHSTATE = 10; + var LOOPSTATE = 11; + var NOERROR = 0; + var STEPERRCODE = 38; + var SEEKERROR = 'seekError'; + var PAUSEERROR = 'pauseError'; + var errCode = NOERROR; + beforeAll(function () { + console.log("beforeAll case"); + }) + + beforeEach(function () { + console.log("beforeEach case"); + }) + + afterEach(function () { + console.log("afterEach case"); + }) + + afterAll(function () { + console.log("afterAll case"); + }) + + var sleep = function(time) { + for(var t = Date.now(); Date.now() - t <= time;); + }; + + var initAudioPlayer = function() { + audioPlayer = media.createAudioPlayer(); + } + + var nextStep = function(mySteps, done) { + if (mySteps[0] == ENDSTATE) { + done(); + return; + } + switch (mySteps[0]) { + case SRCSTATE: + console.log(`case to prepare`); + audioPlayer.src = audioSource; + break; + case PLAYSTATE: + console.log(`case to play`); + audioPlayer.play(); + break; + case PAUSESTATE: + console.log(`case to pause`); + audioPlayer.pause(); + break; + case STOPSTATE: + console.log(`case to stop`); + audioPlayer.stop(); + break; + case RESETSTATE: + console.log(`case to reset`); + audioPlayer.reset(); + break; + case SEEKSTATE: + console.log(`case seek to time is ${mySteps[1]}`); + audioPlayer.seek(mySteps[1]); + break; + case VOLUMESTATE: + console.log(`case to setVolume`); + audioPlayer.setVolume(mySteps[1]); + break; + case RELEASESTATE: + console.log(`case to release`); + mySteps.shift(); + audioPlayer.release(); + break; + case LOOPSTATE: + audioPlayer.loop = mySteps[1]; + mySteps.shift(); + mySteps.shift(); + nextStep(mySteps, done); + break; + default: + break; + } + } + var setCallback = function(mySteps, done) { + console.log(`case setCallback`); + audioPlayer.on('dataLoad', () => { + mySteps.shift(); + console.log(`case dataLoad called`); + expect(audioPlayer.currentTime).assertEqual(0); + expect(audioPlayer.duration).assertEqual(DURATION_TIME); + expect(audioPlayer.state).assertEqual('paused'); + nextStep(mySteps, done); + }); + + audioPlayer.on('play', () => { + mySteps.shift(); + console.log(`case play called`); + console.log(`case play currentTime is ${audioPlayer.currentTime}`); + expect(audioPlayer.duration).assertEqual(DURATION_TIME); + if (mySteps[0] == FINISHSTATE) { + console.log(`case wait for finish`); + return; + } + expect(audioPlayer.state).assertEqual('playing'); + sleep(PLAY_TIME); + nextStep(mySteps, done); + }); + + audioPlayer.on('pause', () => { + mySteps.shift(); + console.log(`case pause called`); + console.log(`case pause currentTime is ${audioPlayer.currentTime}`); + expect(audioPlayer.duration).assertEqual(DURATION_TIME); + expect(audioPlayer.state).assertEqual('paused'); + nextStep(mySteps, done); + }); + + audioPlayer.on('reset', () => { + mySteps.shift(); + console.log(`case reset called`); + expect(audioPlayer.state).assertEqual('idle'); + nextStep(mySteps, done); + }); + + audioPlayer.on('stop', () => { + mySteps.shift(); + console.log(`case stop called`); + expect(audioPlayer.currentTime).assertEqual(0); + expect(audioPlayer.duration).assertEqual(DURATION_TIME); + expect(audioPlayer.state).assertEqual('stopped'); + nextStep(mySteps, done); + }); + + audioPlayer.on('timeUpdate', (seekDoneTime) => { + if (typeof (seekDoneTime) == "undefined") { + console.log(`case seek filed,errcode is ${seekDoneTime}`); + return; + } + mySteps.shift(); + mySteps.shift(); + console.log(`case seekDoneTime is ${seekDoneTime}`); + console.log(`case seek called`); + expect(audioPlayer.currentTime + DELTA_TIME).assertClose(seekDoneTime + DELTA_TIME, DELTA_TIME); + console.log(`case loop is ${audioPlayer.loop}`); + if ((audioPlayer.loop == true) && (seekDoneTime == DURATION_TIME)) { + console.log('case loop is true'); + sleep(PLAYSTATE); + } + if (seekDoneTime < audioPlayer.duration || audioPlayer.state == "paused") { + nextStep(mySteps, done); + } + }); + + audioPlayer.on('volumeChange', () => { + console.log(`case setvolume called`); + mySteps.shift(); + mySteps.shift(); + if (audioPlayer.state == "playing") { + sleep(PLAY_TIME); + } + nextStep(mySteps, done); + }); + + audioPlayer.on('finish', () => { + mySteps.shift(); + expect(audioPlayer.state).assertEqual('stopped'); + expect(audioPlayer.currentTime).assertClose(audioPlayer.duration, DELTA_TIME); + console.log(`case finish called`); + nextStep(mySteps, done); + }); + + audioPlayer.on('error', (err) => { + console.log(`case error called,errName is ${err.name}`); + console.log(`case error called,errCode is ${err.code}`); + console.log(`case error called,errMessage is ${err.message}`); + expect(err.code).assertEqual(errCode); + if ((mySteps[0] == SEEKSTATE) || (mySteps[0] == VOLUMESTATE)) { + expect(mySteps[2]).assertEqual(ERRORSTATE); + expect(err.message).assertEqual(mySteps[3]); + mySteps.shift(); + mySteps.shift(); + mySteps.shift(); + mySteps.shift(); + } else { + expect(mySteps[1]).assertEqual(ERRORSTATE); + expect(err.message).assertEqual(mySteps[2]); + mySteps.shift(); + mySteps.shift(); + mySteps.shift(); + } + nextStep(mySteps, done); + }); + }; + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0100 + * @tc.name : 001.本地音频初始状态:进行播放 + * @tc.desc : 1.播放成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0100', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0200 + * @tc.name : 002.本地音频播放状态:进行暂停 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0200', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0300 + * @tc.name : 003.本地音频暂停状态:进行恢复播放 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Play成功 + 4.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0300', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, PLAYSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0500 + * @tc.name : 005.本地音频播放状态:进行结束播放 + * @tc.desc : 1.播放成功 + 2.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0500', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0600 + * @tc.name : 006.本地音频播放状态:暂停后恢复播放,再次暂停 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Play成功 + 4.Pause成功 + 5.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0600', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, PLAYSTATE, PAUSESTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0700 + * @tc.name : 007.本地音频暂停状态:暂停后结束播放 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Stop成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0700', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, STOPSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0800 + * @tc.name : 008.本地音频播放状态:暂停后恢复播放,再结束播放 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.播放成功 + 4.Stop成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0800', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, PLAYSTATE, STOPSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0900 + * @tc.name : 009.本地音频播放状态:停止播放后重新开始播放,暂停后恢复播放,再结束播放 + * @tc.desc : 1.播放成功 + 2.Stop成功 +                3.播放成功 +                4.Pause成功 +                5.Play成功 +                6.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 2 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_0900', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, STOPSTATE, RESETSTATE, SRCSTATE, PLAYSTATE, + PAUSESTATE, PLAYSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1000 + * @tc.name : 010.本地音频暂停状态:停止播放后重新开始播放,暂停后结束播放 + * @tc.desc : 1.播放成功 +                2.Pause成功 +                3.Stop成功 +                4.播放成功 +                5.Pause成功 +                6.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 2 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1000', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, STOPSTATE, RESETSTATE, SRCSTATE, PLAYSTATE, + PAUSESTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1100 + * @tc.name : 011.本地音频播放状态:停止播放后重新开始播放,再次结束播放 + * @tc.desc : 1.播放成功 +               2.Stop成功 +               3.播放成功 +               4.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 2 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1100', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, STOPSTATE, RESETSTATE, SRCSTATE, PLAYSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1200 + * @tc.name : 012.本地音频暂停状态:暂停后再次play + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.播放成功 + 4.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 2 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1200', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, PLAYSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1300 + * @tc.name : 013.本地音频停止状态:停止播放后暂停 + * @tc.desc : 1.播放成功 + 2.Stop成功 + 3.Pause失败 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1300', 0, async function (done) { + errCode = STEPERRCODE; + var mySteps = new Array(SRCSTATE, PLAYSTATE, STOPSTATE, PAUSESTATE, ERRORSTATE, PAUSEERROR, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1400 + * @tc.name : 014.本地音频初始状态:开始播放,进行Seek,再暂停 + * @tc.desc : 1.播放成功 + 2.Seek成功 + 3.Pause成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1400', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, 0, PAUSESTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1500 + * @tc.name : 015.本地音频初始状态:开始播放,暂停后进行Seek,再恢复播放 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Seek成功 + 4.Play成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1500', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, SEEKSTATE, 0, SEEKSTATE, DURATION_TIME / 2, + SEEKSTATE, audioPlayer.duration, PLAYSTATE, FINISHSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1600 + * @tc.name : 016.本地音频初始状态:开始播放,暂停后恢复播放,进行Seek,再暂停 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Play成功 + 4.Seek成功 + 5.pause成功 + 6.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1600', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, PLAYSTATE, SEEKSTATE, 0, PAUSESTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1700 + * @tc.name : 017.本地音频初始状态:开始播放,进行Seek + * @tc.desc : 1.播放成功 + 2.Seek成功 + 3.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1700', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, DURATION_TIME / 2, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1800 + * @tc.name : 018.本地音频初始状态:开始播放,进行Seek,停止播放 + * @tc.desc : 1.播放成功 + 2.Seek成功 + 3.Stop成功 + 4.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1800', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, DURATION_TIME / 2, + STOPSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1900 + * @tc.name : 019.本地音频初始状态:开始播放,停止播放,进行Seek + * @tc.desc : 1.播放成功 + 2.Stop成功 + 3.Seek失败 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_1900', 0, async function (done) { + errCode = STEPERRCODE; + var mySteps = new Array(SRCSTATE, PLAYSTATE, STOPSTATE, SEEKSTATE, 0, ERRORSTATE, SEEKERROR, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2000 + * @tc.name : 020.本地音频初始状态:开始播放,暂停后进行Seek + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Seek成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2000', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, SEEKSTATE, 0, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2100 + * @tc.name : 021.本地音频初始状态:开始播放,暂停后进行Seek,停止播放 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Seek成功 + 4.Stop成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2100', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, SEEKSTATE, DURATION_TIME / 2, + STOPSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2200 + * @tc.name : 022.本地音频初始状态:开始播放,暂停后恢复播放,进行Seek + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Play成功 + 4.Seek成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2200', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, PLAYSTATE, SEEKSTATE, 0, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2300 + * @tc.name : 023.本地音频初始状态:开始播放,暂停后恢复播放,进行Seek,停止播放 + * @tc.desc : 1.播放成功 + 2.Pause成功 + 3.Play成功 + 4.Stop成功 + 5.Seek成功 + 6.Stop成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2300', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, PLAYSTATE, SEEKSTATE, 0, STOPSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2400 + * @tc.name : 024.本地音频初始状态:开始播放,停止播放,进行Seek,重新播放 + * @tc.desc : 1.播放成功 + 2.Stop成功 + 3.Seek失败 + 4.重新播放成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2400', 0, async function (done) { + errCode = STEPERRCODE; + var mySteps = new Array(SRCSTATE, PLAYSTATE, STOPSTATE, SEEKSTATE, 0, ERRORSTATE, SEEKERROR, + RESETSTATE, SRCSTATE, PLAYSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2500 + * @tc.name : 025.本地音频播放状态:进行Seek,Seek到文件开始的位置 + * @tc.desc : 1.播放成功 + 2.Seek成功 + 3.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2500', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, 0, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2600 + * @tc.name : 026.本地音频初始状态:开始播放,停止播放,进行Seek,再暂停 + * @tc.desc : 1.播放成功 + 2.Stop成功 + 3.Seek失败 + 4.Pause失败 + 5.Reset成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 3 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2600', 0, async function (done) { + errCode = STEPERRCODE; + var mySteps = new Array(SRCSTATE, PLAYSTATE, STOPSTATE, SEEKSTATE, SEEK_TIME, ERRORSTATE, + SEEKERROR, PAUSESTATE, ERRORSTATE, PAUSEERROR, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2700 + * @tc.name : 027.本地音频初始状态:开始播放,停止播放,进行Seek,再进行恢复播放操作 + * @tc.desc : 1.播放成功; + 2.Stop成功; + 3.Seek失败 + 4.恢复播放成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 3 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2700', 0, async function (done) { + errCode = STEPERRCODE; + var mySteps = new Array(SRCSTATE, PLAYSTATE, STOPSTATE, SEEKSTATE, SEEK_TIME, ERRORSTATE, + SEEKERROR, RESETSTATE, SRCSTATE, PLAYSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2800 + * @tc.name : 028.本地音频播放状态:进行Seek,Seek到文件结尾的位置 + * @tc.desc : 1.播放成功 + 2.Seek成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2800', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, DURATION_TIME, FINISHSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2900 + * @tc.name : 029.本地音频播放状态:进行Seek,Seek到超过文件结尾的位置 + * @tc.desc : 1.播放成功 + 2.Seek到结尾 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 3 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_2900', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, DURATION_TIME + DELTA_TIME, + FINISHSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3000 + * @tc.name : 030.本地音频播放状态:进行Seek,Seek到文件随机的位置 + * @tc.desc : 1.Seek成功,查看currenTime与seek到的位置一致 + 2.当前位置为seek设置的随机位置 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3000', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, DURATION_TIME / 5, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3200 + * @tc.name : 032.本地音频播放状态:暂停时Seek到文件开始,恢复播放 + * @tc.desc : 1.播放成功 + 2.暂停成功 + 3.Seek成功 + 4.Play成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3200', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, SEEKSTATE, 0, PLAYSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3300 + * @tc.name : 033.本地音频播放状态:暂停时Seek到文件结尾,恢复播放 + * @tc.desc : 1.播放成功 + 2.暂停成功 + 3.Seek成功 + 4.Play成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3300', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, SEEKSTATE, DURATION_TIME, PLAYSTATE, + FINISHSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3400 + * @tc.name : 034.本地音频播放状态:暂停时Seek到超过文件结尾的位置,恢复播放 + * @tc.desc : 1.播放成功 + 2.暂停成功 + 3.Seek成功 + 4.Play成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 3 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3400', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, PAUSESTATE, SEEKSTATE, DURATION_TIME + DELTA_TIME, PLAYSTATE, + FINISHSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3500 + * @tc.name : 035.本地音频播放状态:播放时Seek到超过文件结尾的位置,再重新开始播放 + * @tc.desc : 1.播放成功 + 2.Seek成功 + 3.finish回调函数触发,并重新开始播放 + 3.Play成功 + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 3 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3500', 0, async function (done) { + var mySteps = new Array(SRCSTATE, PLAYSTATE, SEEKSTATE, DURATION_TIME + DELTA_TIME, + FINISHSTATE, PLAYSTATE, RESETSTATE, ENDSTATE); + initAudioPlayer(); + setCallback(mySteps, done); + audioPlayer.src = audioSource; + }) + + /* * + * @tc.number : SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3600 + * @tc.name : 036.支持设置循环播放 + * @tc.desc : + * @tc.size : MEDIUM + * @tc.type : Function test + * @tc.level : Level 0 + */ + it('SUB_MEDIA_PLAYER_LOCAL_AUDIO_Function_04_3600', 0, async function (done) { + var playCount = 0; + var seekCount = 0; + var testAudioPlayer = media.createAudioPlayer(); + testAudioPlayer.on('dataLoad', () => { + console.log(`case dataLoad called`); + expect(testAudioPlayer.currentTime).assertEqual(0); + expect(testAudioPlayer.duration).assertEqual(DURATION_TIME); + expect(testAudioPlayer.state).assertEqual('paused'); + testAudioPlayer.loop = true; + testAudioPlayer.play(); + }); + testAudioPlayer.on('play', () => { + console.log(`case play called`); + console.log(`case play currentTime is ${testAudioPlayer.currentTime}`); + expect(testAudioPlayer.duration).assertEqual(DURATION_TIME); + expect(testAudioPlayer.state).assertEqual('playing'); + sleep(PLAY_TIME); + if (playCount == 1) { + return; + } + playCount++ + testAudioPlayer.seek(DURATION_TIME); + }); + testAudioPlayer.on('timeUpdate', (seekDoneTime) => { + if (typeof (seekDoneTime) == "undefined") { + console.log(`case seek filed,errcode is ${seekDoneTime}`); + return; + } + if (seekCount == 1) { + testAudioPlayer.reset(); + return; + } + seekCount++ + console.log(`case seekDoneTime is ${seekDoneTime}`); + console.log(`case seek called`); + expect(testAudioPlayer.currentTime + 1).assertClose(seekDoneTime + 1, DELTA_TIME); + }); + testAudioPlayer.on('finish', () => { + expect(testAudioPlayer.state).assertEqual('playing'); + console.log(`case finish called`); + }); + testAudioPlayer.on('reset', () => { + expect(testAudioPlayer.state).assertEqual('idle'); + console.log(`case reset called`); + testAudioPlayer.release(); + done(); + }); + testAudioPlayer.src = audioSource; + }) + +}) \ No newline at end of file diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/resources/base/element/string.json b/multimedia/audio/audioPlayer/project/entry/src/main/resources/base/element/string.json new file mode 100644 index 000000000..2f9470d82 --- /dev/null +++ b/multimedia/audio/audioPlayer/project/entry/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "app_name", + "value": "MyApplication" + }, + { + "name": "mainability_description", + "value": "JS_Phone_Empty Feature Ability" + } + ] +} \ No newline at end of file diff --git a/multimedia/audio/audioPlayer/project/entry/src/main/resources/base/media/icon.png b/multimedia/audio/audioPlayer/project/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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