diff --git a/media/JsAudioPlayer/README_zh.md b/media/JsAudioPlayer/README_zh.md new file mode 100644 index 0000000000000000000000000000000000000000..38d407b445496466aaa7a60d61044f8b100886ba --- /dev/null +++ b/media/JsAudioPlayer/README_zh.md @@ -0,0 +1,16 @@ +# Js音频播放和管理 + +### 简介 + +本示例展示了JS音频播放的使用方法,以及音频的音量大小设置。 + +### 使用说明 + +1.分别点击界面"播放"、"上一个"、"下一个"、"暂停"按钮,实现相应的功能。 + +2.点击"音量键",弹出音频管理界面,滑动音量条,设置音量大小;点击“close”,关闭音频管理界面。 + +### 约束与限制 + +本示例仅支持在标准系统上运行。 + diff --git a/media/JsAudioPlayer/build.gradle b/media/JsAudioPlayer/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..ecbb99c45d4bdfa94b95e0b3f021f66b1984e55c --- /dev/null +++ b/media/JsAudioPlayer/build.gradle @@ -0,0 +1,33 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +apply plugin: 'com.huawei.ohos.app' + +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 7 + supportSystem "standard" +} + +buildscript { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } + dependencies { + classpath 'com.huawei.ohos:hap:3.0.3.4' + } +} + +allprojects { + repositories { + maven { + url 'https://repo.huaweicloud.com/repository/maven/' + } + maven { + url 'https://developer.huawei.com/repo/' + } + } +} diff --git a/media/JsAudioPlayer/entry/build.gradle b/media/JsAudioPlayer/entry/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..cb1b043b0ac22c936d09041dc7bfecd617931472 --- /dev/null +++ b/media/JsAudioPlayer/entry/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'com.huawei.ohos.hap' +//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510 +ohos { + compileSdkVersion 7 + defaultConfig { + compatibleSdkVersion 7 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } + } +} \ No newline at end of file diff --git a/media/JsAudioPlayer/entry/src/main/config.json b/media/JsAudioPlayer/entry/src/main/config.json new file mode 100644 index 0000000000000000000000000000000000000000..f0c73229427d2b0385db8fbe8b8b19d0fa1dd33b --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/config.json @@ -0,0 +1,55 @@ +{ + "app": { + "bundleName": "ohos.samples.jsaudioplayer", + "version": { + "code": 1000000, + "name": "1.0.0" + } + }, + "deviceConfig": {}, + "module": { + "package": "ohos.samples.jsaudioplayer", + "name": ".MyApplication", + "mainAbility": ".default", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry", + "installationFree": false + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "orientation": "unspecified", + "name": ".default", + "icon": "$media:icon", + "srcLanguage": "js", + "srcPath": "default", + "description": "$string:mainability_description", + "label": "$string:entry_MainAbility", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": ".default" + } + ] + } +} \ No newline at end of file diff --git a/media/JsAudioPlayer/entry/src/main/js/default/app.js b/media/JsAudioPlayer/entry/src/main/js/default/app.js new file mode 100644 index 0000000000000000000000000000000000000000..58d12b7b501fbf46db906a86187aaf18dfb1f677 --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/js/default/app.js @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default { + onCreate() { + console.info("Application onCreate"); + }, + onDestroy() { + console.info("Application onDestroy"); + } +}; diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/PlayerModel.js b/media/JsAudioPlayer/entry/src/main/js/default/common/PlayerModel.js new file mode 100644 index 0000000000000000000000000000000000000000..2d1583b809505d3554ae27658d9d529025b1552d --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/js/default/common/PlayerModel.js @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES 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'; + +export + +class Playlist { + constructor() { + } + + audioFiles = []; +} +export + +class Song { + constructor(name, fileUri, duration) { + this.name = name; + this.fileUri = fileUri; + this.duration = duration; + } +} +export default class PlayerModel { + isPlaying = false; + playlist = new Playlist; + index; + #player; + #statusChangedListener; + #playingProgressListener; + #intervalID; + #currentTimeMs = 0; + + constructor() { + this.#player = media.createAudioPlayer(); + console.info('MusicPlayer[PlayerModel] createAudioPlayer=' + this.#player); + } + + initAudioPlayer() { + console.info('MusicPlayer[PlayerModel] initAudioPlayer begin'); + this.#player.on('error', (err, action) => { + console.error(`MusicPlayer[PlayerModel] player error: ${err.code}`); + }); + let self = this; + this.#player.on('finish', (err, action) => { + if (err) { + console.error(`MusicPlayer[PlayerModel] error returned in finish() callback`); + return; + } + console.log('MusicPlayer[PlayerModel] finish() callback is called'); + self.notifyPlayingStatus(false); + }); + this.#player.on('timeUpdate', (err, action) => { + if (err) { + console.error(`MusicPlayer[PlayerModel] error returned in timeUpdate() callback`); + return; + } + console.log('MusicPlayer[PlayerModel] timeUpdate() callback is called, ' + JSON.stringify(action)) + }); + console.info('MusicPlayer[PlayerModel] initAudioPlayer end'); + } + + release() { + if (typeof (this.#player) != 'undefined') { + console.info('MusicPlayer[PlayerModel] player.release begin'); + this.#player.release(); + console.info('MusicPlayer[PlayerModel] player.release end'); + this.#player = undefined; + } + } + + restorePlayingStatus(status, callback) { + console.info('MusicPlayer[PlayerModel] restorePlayingStatus ' + JSON.stringify(status)); + for (var i = 0; i < this.playlist.audioFiles.length; i++) { + if (this.playlist.audioFiles[i].fileUri === status.uri) { + console.info('MusicPlayer[PlayerModel] restore to index ' + i); + this.preLoad(i, () => { + this.play(status.seekTo, status.isPlaying); + console.info('MusicPlayer[PlayerModel] restore play status'); + callback(i); + }); + return; + } + } + console.warn('MusicPlayer[PlayerModel] restorePlayingStatus failed'); + callback(-1); + } + + getPlaylist(callback) { + // generate play list + console.info('MusicPlayer[PlayerModel] generatePlayList'); + const args = { + selections: 'audio', + selectionArgs: ['audioalbum'], + }; + let self = this; + console.info('MusicPlayer[PlayerModel] getAudioAssets begin'); + self.playlist = new Playlist(); + self.playlist.audioFiles = []; + self.playlist.audioFiles[0] = new Song('dynamic.wav', 'file://system/etc/dynamic.wav', 0); + self.playlist.audioFiles[1] = new Song('demo.wav', 'file://system/etc/demo.wav', 0); + console.info('MusicPlayer[PlayerModel] getAudioAssets end'); + } + + setOnStatusChangedListener(callback) { + this.#statusChangedListener = callback; + } + + setOnPlayingProgressListener(callback) { + this.#playingProgressListener = callback; + } + + notifyPlayingStatus(isPlaying) { + this.isPlaying = isPlaying; + this.#statusChangedListener(this.isPlaying); + console.log('MusicPlayer[PlayerModel] notifyPlayingStatus isPlaying=' + isPlaying + ' intervalId=' + this.#intervalID); + if (isPlaying) { + if (typeof (this.#intervalID) === 'undefined') { + let self = this; + this.#intervalID = setInterval(() => { + if (typeof (self.#playingProgressListener) != "undefined" && self.#playingProgressListener != null) { + var timeMs = self.#player.currentTime; + this.#currentTimeMs = timeMs; + if (typeof (timeMs) === 'undefined') { + timeMs = 0; + } + console.log('MusicPlayer[PlayerModel] player.currentTime=' + timeMs); + self.#playingProgressListener(timeMs); + } + }, 500); + console.log('MusicPlayer[PlayerModel] set update interval ' + this.#intervalID); + } + } else { + this.cancelTimer(); + } + } + + cancelTimer() { + if (typeof (this.#intervalID) != 'undefined') { + console.log('MusicPlayer[PlayerModel] clear update interval ' + this.#intervalID); + clearInterval(this.#intervalID); + this.#intervalID = undefined; + } + } + + preLoad(index, callback) { + console.info('MusicPlayer[PlayerModel] preLoad ' + index + "/" + this.playlist.audioFiles.length); + if (index < 0 || index >= this.playlist.audioFiles.length) { + console.error('MusicPlayer[PlayerModel] preLoad ignored'); + return 0; + } + this.index = index; + var source = this.playlist.audioFiles[index].fileUri; + if (typeof (source) === 'undefined') { + console.error('MusicPlayer[PlayerModel] preLoad ignored, source=' + source); + return; + } + console.info('MusicPlayer[PlayerModel] preLoad ' + source + ' begin'); + console.info('MusicPlayer[PlayerModel] state=' + this.#player.state); + let self = this; + if (source === this.#player.src && this.#player.state != 'idle') { + console.info('MusicPlayer[PlayerModel] preLoad finished. src not changed'); + callback(); + } else if (this.#player.state === 'idle') { + this.#player.on('dataLoad', () => { + console.info('MusicPlayer[PlayerModel] dataLoad callback, state=' + self.#player.state); + callback(); + }); + console.info('MusicPlayer[PlayerModel] player.src=' + source); + this.#player.src = source; + } else { + this.notifyPlayingStatus(false); + this.cancelTimer(); + console.info('MusicPlayer[PlayerModel] player.reset'); + self.#player.reset(); + console.info('MusicPlayer[PlayerModel] player.reset done, state=' + self.#player.state); + self.#player.on('dataLoad', () => { + console.info('MusicPlayer[PlayerModel] dataLoad callback, state=' + self.#player.state); + callback(); + }); + console.info('MusicPlayer[PlayerModel] player.src=' + source); + self.#player.src = source; + } + console.info('MusicPlayer[PlayerModel] preLoad ' + source + ' end'); + } + + getDuration() { + console.info('MusicPlayer[PlayerModel] getDuration index=' + this.index); + if (this.playlist.audioFiles[this.index].duration > 0) { + return this.playlist.audioFiles[this.index].duration; + } + console.info('MusicPlayer[PlayerModel] getDuration state=' + this.#player.state); + if (this.#player.state === 'idle') { + console.warn('MusicPlayer[PlayerModel] getDuration ignored, player.state=' + this.#player.state); + return 0; + } + this.playlist.audioFiles[this.index].duration = Math.min(this.#player.duration, 97615); + console.info('MusicPlayer[PlayerModel] getDuration player.src=' + this.#player.src + ", player.duration=" + this.playlist.audioFiles[this.index].duration); + return this.playlist.audioFiles[this.index].duration; + } + + getCurrentMs() { + return this.#currentTimeMs; + } + + play(seekTo, startPlay) { + console.info('MusicPlayer[PlayerModel] play seekTo=' + seekTo + ', startPlay=' + startPlay); + this.notifyPlayingStatus(startPlay); + if (startPlay) { + if (seekTo < 0 && this.#currentTimeMs > 0) { + console.info('MusicPlayer[PlayerModel] pop seekTo=' + this.#currentTimeMs); + seekTo = this.#currentTimeMs; + } + let self = this; + this.#player.on('play', (err, action) => { + if (err) { + console.error(`MusicPlayer[PlayerModel] error returned in play() callback`); + return; + } + console.log('MusicPlayer[PlayerModel] play() callback entered, player.state=' + self.#player.state); + if (seekTo > 0) { + self.seek(seekTo); + } + }); + console.info('MusicPlayer[PlayerModel] call player.play'); + this.#player.play(); + console.info('MusicPlayer[PlayerModel] player.play called player.state=' + this.#player.state); + } else if (seekTo > 0) { + this.#playingProgressListener(seekTo); + this.#currentTimeMs = seekTo; + console.info('MusicPlayer[PlayerModel] stash seekTo=' + this.#currentTimeMs); + } + } + + pause() { + if (!this.isPlaying) { + console.info('MusicPlayer[PlayerModel] pause ignored, isPlaying=' + this.isPlaying); + return; + } + this.notifyPlayingStatus(false); + console.info('MusicPlayer[PlayerModel] call player.pause'); + this.#player.pause(); + console.info('MusicPlayer[PlayerModel] player.pause called, player.state=' + this.#player.state); + } + + seek(ms) { + this.#currentTimeMs = ms; + if (this.isPlaying) { + console.log('MusicPlayer[PlayerModel] player.seek ' + ms); + this.#player.seek(ms); + } else { + console.log('MusicPlayer[PlayerModel] stash seekTo=' + ms); + } + } + + stop() { + if (!this.isPlaying) { + console.info('MusicPlayer[PlayerModel] stop ignored, isPlaying=' + this.isPlaying); + return; + } + this.notifyPlayingStatus(false); + console.info('MusicPlayer[PlayerModel] call player.stop'); + this.#player.stop(); + console.info('MusicPlayer[PlayerModel] player.stop called, player.state=' + this.#player.state); + } +} \ No newline at end of file diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/bell.png b/media/JsAudioPlayer/entry/src/main/js/default/common/images/bell.png new file mode 100644 index 0000000000000000000000000000000000000000..3af60825ceff573f19ceb5a766d8007be4f5a60c Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/bell.png differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/bg-tv.jpg b/media/JsAudioPlayer/entry/src/main/js/default/common/images/bg-tv.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86fc07358eea5c1474bc833fca07c6d4d8698a89 Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/bg-tv.jpg differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/music.png b/media/JsAudioPlayer/entry/src/main/js/default/common/images/music.png new file mode 100644 index 0000000000000000000000000000000000000000..75ac107329867329eefd976daf9a930a5d36dd5f Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/music.png differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/next.png b/media/JsAudioPlayer/entry/src/main/js/default/common/images/next.png new file mode 100644 index 0000000000000000000000000000000000000000..9f494768d70b4523cec310668cc7cc7b1cef8740 Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/next.png differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/pause.png b/media/JsAudioPlayer/entry/src/main/js/default/common/images/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..f89c97ded190c22c5c2f0ed60ff98cd3846e52ec Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/pause.png differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/play.png b/media/JsAudioPlayer/entry/src/main/js/default/common/images/play.png new file mode 100644 index 0000000000000000000000000000000000000000..aafcd9dbb1583f692b4dd56e63186f34e7205241 Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/play.png differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/previous.png b/media/JsAudioPlayer/entry/src/main/js/default/common/images/previous.png new file mode 100644 index 0000000000000000000000000000000000000000..a2db8a689402784c8fa547054298f2500c71c611 Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/previous.png differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/common/images/volume.png b/media/JsAudioPlayer/entry/src/main/js/default/common/images/volume.png new file mode 100644 index 0000000000000000000000000000000000000000..b22ef6b62b5b19f946a27fadff6c86a912cfd806 Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/js/default/common/images/volume.png differ diff --git a/media/JsAudioPlayer/entry/src/main/js/default/i18n/en-US.json b/media/JsAudioPlayer/entry/src/main/js/default/i18n/en-US.json new file mode 100644 index 0000000000000000000000000000000000000000..3aa3006a0021112b6a0504115d20294596fbc98b --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/js/default/i18n/en-US.json @@ -0,0 +1,8 @@ +{ + "strings": { + "media": "media", + "close": "Close" + }, + "Files": { + } +} \ No newline at end of file diff --git a/media/JsAudioPlayer/entry/src/main/js/default/i18n/zh-CN.json b/media/JsAudioPlayer/entry/src/main/js/default/i18n/zh-CN.json new file mode 100644 index 0000000000000000000000000000000000000000..816bb6a89e21314fc6ddf213264d3b54ebdb12c3 --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/js/default/i18n/zh-CN.json @@ -0,0 +1,8 @@ +{ + "strings": { + "media": "媒体", + "close":"关闭" + }, + "Files": { + } +} \ No newline at end of file diff --git a/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.css b/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.css new file mode 100644 index 0000000000000000000000000000000000000000..b8a9dffc0cb8782f77a32203785613969d3394e0 --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.css @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + left: 0px; + top: 0px; + width: 100%; + height: 100%; +} + +.div-image { + width: 80%; + flex-direction: row; + justify-content: center; +} + +.image { + width: 300px; + height: 300px; + object-fit: contain; + align-items: center; +} + +.title { + font-size: 42px; + text-align: center; + width: 100%; + height: 40%; + margin: 10px; +} + +.div-but { + width: 100%; + flex-direction: row; + justify-content: space-around; +} + +.btn { + width: 50px; + height: 50px; +} + +.btn-image { + object-fit: contain; +} + +.image-div { + width: 100%; + height: 80px; + align-items: center; +} + +.image-panel { + width: 30px; + height: 30px; + object-fit: contain; + margin-left: 20px; + margin-top: 20px; +} + +.text { + width: 100%; + height: 48px; + margin-left: 30px; + margin-top: 10px; + font-size: 25px; +} + +.bell-div { + width: 100%; + height: 100px; + flex-direction: row; + justify-content: center; +} + +.slider-value { + font-size: 30px; + height: 80px; +} + +.slider { + width: 70%; + height: 80px; + selected-color: mediumblue; + color: darkgrey; +} + +.title-panel { + width: 100%; + height: 100%; + background-color: #e9fcfbfb; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.close-panel { + width: 100%; + height: 50px; + margin-top: 10%; + justify-content: center; + align-items: center; +} + +.panel-btn { + width: 150px; +} \ No newline at end of file diff --git a/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.hml b/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.hml new file mode 100644 index 0000000000000000000000000000000000000000..7c4d75d7c8aced1d18fdb58d36434e049b232c1a --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.hml @@ -0,0 +1,54 @@ + + +
+
+ +
+ + {{ title }} + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + {{ $t('strings.media') }} +
+
+ 0 + + 15 +
+
+ +
+
+
+
diff --git a/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.js b/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4374b78ee8e24fa3662eb88f1ffb67d01319f634 --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/js/default/pages/index/index.js @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import audio from '@ohos.multimedia.audio' +import PlayerModel from '../../common/PlayerModel.js'; + +export default { + data: { + title: '', + audioUrl: '', + index: 0, + audioPlayer: null, + isSwitching: false, + playerModel: new PlayerModel(), + audioManager: null, + volume: 0 + }, + onInit() { + this.audioUrl = 'common/images/pause.png'; + this.playerModel.setOnStatusChangedListener((isPlaying) => { + console.info('MusicPlayer[IndexPage] on player status changed, isPlaying=' + isPlaying + ', refresh ui'); + if (isPlaying) { + this.audioUrl = 'common/images/play.png'; + } else { + this.audioUrl = 'common/images/pause.png'; + } + }); + this.playerModel.getPlaylist(() => { + console.info('MusicPlayer[IndexPage] on playlist generated, refresh ui'); + }); + this.title = this.playerModel.playlist.audioFiles[this.index].name; + this.audioManager = audio.getAudioManager(); + }, + onPlayClick() { + if (this.isSwitching) { + console.info('MusicPlayer[IndexPage] onPlayClick ignored, isSwitching'); + return; + } + console.info('MusicPlayer[IndexPage] onPlayClick, isPlaying=' + this.playerModel.isPlaying); + if (this.playerModel.isPlaying) { + this.playerModel.pause(); + } else { + this.playerModel.preLoad(this.index, () => { + this.playerModel.play(-1, true); + }); + } + }, + onPreviousClick() { + if (this.isSwitching) { + console.info('MusicPlayer[IndexPage] onPreviousClick ignored, isSwitching'); + return; + } + console.info('MusicPlayer[IndexPage] onPreviousClick'); + this.index--; + if (this.index < 0 && this.playerModel.playlist.audioFiles.length >= 1) { + this.index = this.playerModel.playlist.audioFiles.length - 1; + } + this.currentProgress = 0; + this.isSwitching = true; + let self = this; + this.playerModel.preLoad(this.index, () => { + self.playerModel.play(0, true); + self.isSwitching = false; + }); + this.title = this.playerModel.playlist.audioFiles[this.index].name; + }, + onNextClick() { + if (this.isSwitching) { + console.info('MusicPlayer[IndexPage] onNextClick ignored, isSwitching'); + return; + } + console.info('MusicPlayer[IndexPage] onNextClick'); + this.index++; + if (this.index >= this.playerModel.playlist.audioFiles.length) { + this.index = 0; + } + this.currentProgress = 0; + this.isSwitching = true; + let self = this; + this.playerModel.preLoad(this.index, () => { + self.playerModel.play(0, true); + self.isSwitching = false; + }); + this.title = this.playerModel.playlist.audioFiles[this.index].name; + }, + media(e) { + this.volume = e.value + this.audioManager.setVolume(audio.AudioVolumeType.MEDIA, this.volume).then(() => { + console.log('Promise returned to indicate a successful volume setting.'); + }) + + }, + showPanel() { + this.$element('showPanel').show(); + }, + closePanel() { + this.$element('showPanel').close(); + } +} + + + diff --git a/media/JsAudioPlayer/entry/src/main/resources/base/element/string.json b/media/JsAudioPlayer/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000000000000000000000000000000000..0e81d1d8f30bc4679ee60a2c13537d52a2154607 --- /dev/null +++ b/media/JsAudioPlayer/entry/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "entry_MainAbility", + "value": "JsAudioPlayer" + }, + { + "name": "mainability_description", + "value": "JS_Empty Ability" + } + ] +} \ No newline at end of file diff --git a/media/JsAudioPlayer/entry/src/main/resources/base/media/icon.png b/media/JsAudioPlayer/entry/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c Binary files /dev/null and b/media/JsAudioPlayer/entry/src/main/resources/base/media/icon.png differ diff --git a/media/JsAudioPlayer/screenshots/device/audioplayer.png b/media/JsAudioPlayer/screenshots/device/audioplayer.png new file mode 100644 index 0000000000000000000000000000000000000000..e97d03a0ecb01859768ec388c454284b344477a0 Binary files /dev/null and b/media/JsAudioPlayer/screenshots/device/audioplayer.png differ diff --git a/media/JsAudioPlayer/settings.gradle b/media/JsAudioPlayer/settings.gradle new file mode 100644 index 0000000000000000000000000000000000000000..4773db73233a570c2d0c01a22e75321acfbf7a07 --- /dev/null +++ b/media/JsAudioPlayer/settings.gradle @@ -0,0 +1 @@ +include ':entry'