diff --git a/OHBM/oh-package-lock.json5 b/OHBM/oh-package-lock.json5 index 3976e98b5af33d64655abb327cea3ef223a29b79..26d726f5447b0cb02c0dab10cd704da925c80427 100644 --- a/OHBM/oh-package-lock.json5 +++ b/OHBM/oh-package-lock.json5 @@ -1,18 +1,3 @@ -/* - * 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. - */ - { "meta": { "stableOrder": true diff --git a/scenario/MusicPlayerOnline/README_zh.md b/scenario/MusicPlayerOnline/README_zh.md index ff206b10fb47337e412840b90b49fd1b73cc2cd3..4b1f84f0fadd78ac9127a019050b104a4e0fca37 100644 --- a/scenario/MusicPlayerOnline/README_zh.md +++ b/scenario/MusicPlayerOnline/README_zh.md @@ -97,16 +97,16 @@ 12. 桌面播放卡片 (已完成) 13. 歌曲分类: 热门歌手 (已完成) 14. 其他平台歌曲推荐、播放 - 15. 音频焦点处理 + 15. 音频焦点处理 (已完成) 16. 其他界面交互效果(切换动画、点击效果) 17. 设置页 17.1. 退出应用 (已完成) 17.2. 其他设置:仅WiFi下载、自动登录、边听边存 (部分) 18. 分布式播放 - 19. 性能优化:加载大量歌单和歌曲的列表(1000以上容易appfreeze),应用优化+服务器控制数据量 + 19. 性能优化:加载大量歌单和歌曲的列表(1000以上容易appfreeze),应用优化+服务器控制数据量 (已完成) 20. 一多适配:平板、pc - 21. 异常处理:检测网络状态、播放器异常等 - 22. 播放状态保存恢复:服务器记录,上次播放的歌曲和歌单,登录或重启后恢复 (部分) + 21. 异常处理:检测网络状态、播放器异常等 (已完成) + 22. 播放状态保存恢复:服务器记录,上次播放的歌曲和歌单,登录或重启后恢复 (已完成) #### 未计划功能: 1. 社交(用户信息,好友,分享,评论) diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets index 5267cb765850b63bcc675acca61402405e51de8c..f0c01f6665f442c8566c4bf29e407e3a1453b390 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/manager/PlayerManager.ets @@ -43,7 +43,6 @@ export default class PlayerManager { private currentTime: number = 0; private currentDuration: number = 0; private lastUpdateProgressTime: number = 0; - private item: AudioData = new AudioData('未播放', '--', ''); private listPosition: number = 0; private state: string = AppConstants.PLAYER_STATE_UNKNOWN; private listTitle: string = AppConstants.LIST_SONG_NO_PLAYING; @@ -64,9 +63,6 @@ export default class PlayerManager { let id = AppStorage.get(AppConstants.PLAYLIST_RECORD_INDEX) as string; let index = this.list.findIndex((audioData) => audioData.id === id); this.listPosition = (index !== -1) ? index : 0; - if (this.list.length > 0) { - this.item = this.list[this.listPosition]; - } this.listTitle = AppConstants.CURRENT_LIST_TITLE; this.shuffleIndex = []; for (let i = 0; i < this.list.length; i++) { @@ -114,7 +110,7 @@ export default class PlayerManager { // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程 avPlayer.on('error', (err: BusinessError) => { Logger.error(this.tag, `Invoke PlayerManager failed, code is ${err.code}, message is ${err.message}`); - avPlayer.reset(); // 调用reset重置资源,触发idle状态 + avPlayer.reset(); }) // 状态机变化回调函数 avPlayer.on('timeUpdate', (time: number) => { @@ -139,38 +135,36 @@ export default class PlayerManager { avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => { switch (state) { case AppConstants.PLAYER_STATE_IDLE: - //Logger.info(this.tag, 'PlayerManager state idle called.'); - //avPlayer.release(); + Logger.info(this.tag, 'PlayerManager state idle called.'); break; case AppConstants.PLAYER_STATE_INITIALIZED: - //Logger.info(this.tag, 'PlayerManager state initialized called.'); + Logger.info(this.tag, 'PlayerManager state initialized called.'); avPlayer.prepare(); break; case AppConstants.PLAYER_STATE_PREPARED: - //Logger.info(this.tag, 'PlayerManager state prepared called.'); + Logger.info(this.tag, 'PlayerManager state prepared called.'); avPlayer.play(); break; case AppConstants.PLAYER_STATE_PLAYING: - //Logger.info(this.tag, 'PlayerManager state playing called.'); - this.list[this.listPosition].isPlaying = true; + Logger.info(this.tag, 'PlayerManager state playing called.'); HttpManager.getInstance().record_recent(); break; case AppConstants.PLAYER_STATE_PAUSED: - //Logger.info(this.tag, 'PlayerManager state paused called.'); + Logger.info(this.tag, 'PlayerManager state paused called.'); break; case AppConstants.PLAYER_STATE_COMPLETED: - //Logger.info(this.tag, 'PlayerManager state completed called.'); + Logger.info(this.tag, 'PlayerManager state completed called.'); avPlayer.stop(); break; case AppConstants.PLAYER_STATE_STOPPED: - //Logger.info(this.tag, 'PlayerManager state stopped called.'); + Logger.info(this.tag, 'PlayerManager state stopped called.'); this.next(); break; case AppConstants.PLAYER_STATE_RELEASED: - //Logger.info(this.tag, 'PlayerManager state released called.'); + Logger.info(this.tag, 'PlayerManager state released called.'); break; default: - //Logger.info(this.tag, 'PlayerManager state unknown called.'); + Logger.info(this.tag, 'PlayerManager state unknown called.'); if (this.avPlayer !== undefined) { try { this.avPlayer.release(); @@ -203,7 +197,7 @@ export default class PlayerManager { * 初始化 */ playList(listTitle: string, list: AudioData[], item: AudioData, isNotify?: boolean): void { - this.stop(); + this.reset(); if (list.length <= 0) { Logger.error(this.tag, 'PlayList:' + 'list length <= 0'); return; @@ -233,7 +227,7 @@ export default class PlayerManager { if (this.state === AppConstants.PLAYER_STATE_PAUSED && this.avPlayer !== undefined) { this.avPlayer.play(); } else { - this.play(this.item); + this.play(this.getItem()); } } @@ -242,9 +236,7 @@ export default class PlayerManager { */ play(item: AudioData): void { Logger.info(this.tag, 'Play finish:' + this.listPosition.toString()); - if (this.item) { - this.item.isPlaying = false; - } + this.getItem().isPlaying = false; let index = -1 if (item === undefined || item.id === '') { return @@ -256,18 +248,21 @@ export default class PlayerManager { this.listPosition = index; } Logger.info(this.tag, 'Play :' + this.listPosition.toString()); - this.item = this.list[this.listPosition] - AppStorage.setOrCreate(AppConstants.PLAYLIST_RECORD_INDEX, this.item.id); + this.getItem().isPlaying = true; + AppStorage.setOrCreate(AppConstants.PLAYLIST_RECORD_INDEX, this.getItem().id); let isFavor = false; for (let favorItem of this.favourList) { - if (this.item.id === favorItem.id) { + if (this.getItem().id === favorItem.id) { isFavor = true; break; } } - this.item.isFavor = isFavor; - HttpManager.getInstance().getLrc(this.item.id); - this.avPlayerLive(AppStorage.get(AppConstants.SERVER_HOST_PROP) + AppConstants.PLAY_SONG_URL + this.item.id); + this.getItem().isFavor = isFavor; + if (this.getItem().lrc.length === 0) { + HttpManager.getInstance().getLrc(this.getItem().id); + } + this.avPlayerLive(AppStorage.get(AppConstants.SERVER_HOST_PROP) + AppConstants.PLAY_SONG_URL + + this.getItem().id); } /** @@ -280,15 +275,14 @@ export default class PlayerManager { } /** - * 停止 + * reset */ - stop(): void { + reset(): void { if (this.avPlayer !== undefined) { - this.avPlayer.stop(); + this.avPlayer.reset(); if (this.list.length > this.listPosition) { - this.list[this.listPosition].isPlaying = false; + this.getItem().isPlaying = false; } - this.item = new AudioData('未播放', '--', ''); } } @@ -384,7 +378,10 @@ export default class PlayerManager { } getItem(): AudioData { - return this.item; + if (this.list.length === 0) { + return new AudioData('未播放', '--', ''); + } + return this.list[this.listPosition]; } setFormId(formId: string) { @@ -395,11 +392,11 @@ export default class PlayerManager { } setItemQuality(quality: string) { - this.item.quality = quality; + this.getItem().quality = quality; } setItemFavor(isFavor: boolean) { - this.item.isFavor = isFavor; + this.getItem().isFavor = isFavor; this.updateCard(); } @@ -453,8 +450,8 @@ export default class PlayerManager { } setLrc(id: string, lrc: string) { - if (id == this.item.id) { - this.item.lrc = CommonUtils.getLrc(lrc); + if (id == this.getItem().id) { + this.getItem().lrc = CommonUtils.getLrc(lrc); emitter.emit(AppConstants.DETAIL_UPDATE_LRC, this.emitterOptions); } } @@ -502,7 +499,7 @@ export default class PlayerManager { } updateLrcIndex() { - let newLrcIndex = CommonUtils.findLrcIndexByTime(this.item.lrc, this.currentTime, this.lrcIndex) + let newLrcIndex = CommonUtils.findLrcIndexByTime(this.getItem().lrc, this.currentTime, this.lrcIndex) if (newLrcIndex !== this.lrcIndex && newLrcIndex !== -1) { this.lrcIndex = newLrcIndex; let eventData: emitter.EventData = { @@ -548,8 +545,8 @@ export default class PlayerManager { } removeSongFromCurrentList(item: AudioData) { - if (this.item.id == item.id) { - this.stop(); + if (this.getItem().id == item.id) { + this.reset(); } let index = this.list.indexOf(item); if (index > -1) { @@ -668,7 +665,7 @@ export default class PlayerManager { return; } let formData: Record = { - 'audioItem': this.item, + 'audioItem': this.getItem(), 'isPlaying': this.state, 'serverHost': AppStorage.get(AppConstants.SERVER_HOST_PROP), }; diff --git a/scenario/MusicPlayerOnline/entry/src/main/ets/view/CurrentPlayList.ets b/scenario/MusicPlayerOnline/entry/src/main/ets/view/CurrentPlayList.ets index 2ded1f271cd416cca903b20e18b8c244123a249d..ec3defe23b3ef54d5946f74c0eae9fe7666f5979 100644 --- a/scenario/MusicPlayerOnline/entry/src/main/ets/view/CurrentPlayList.ets +++ b/scenario/MusicPlayerOnline/entry/src/main/ets/view/CurrentPlayList.ets @@ -22,13 +22,12 @@ import AppConstants from '../constants/AppConstants'; @Component export default struct CurrentPlayList { private playerManager: PlayerManager = AppStorage.get('PlayerManager') as PlayerManager; - @State playingList: AudioData[] = Array(); - @Prop listTitle: string; + @State playingList: AudioData[] = []; + @State listTitle: string = this.playerManager.getListTitle();; @Prop currentTime: number; private scrollerForList: Scroller = new Scroller(); aboutToAppear() { - this.listTitle = this.playerManager.getListTitle(); animateTo({ duration: 1000 }, () => { this.playingList = this.playerManager.getCurrentPlayList(); }) @@ -100,13 +99,13 @@ export default struct CurrentPlayList { updateState(eventData: emitter.EventData) { if (eventData !== undefined && eventData.data !== undefined && eventData.data.state === AppConstants.PLAYER_STATE_PLAYING) { - animateTo({ duration: 2000 }, () => { + animateTo({ duration: 1000 }, () => { this.playingList = this.playerManager.getCurrentPlayList(); }) setTimeout(() => { this.scrollerForList.scrollToIndex(this.playingList.indexOf(this.playerManager.getItem()), true, ScrollAlign.CENTER); - }, 2000) + }, 1000) } } } diff --git a/scenario/MusicPlayerOnline/oh-package-lock.json5 b/scenario/MusicPlayerOnline/oh-package-lock.json5 index 94b1117f437ae396c4679fa73ad7a2b5b673b49b..aa353fc14645a3a4d0ba9a389c315d2001db97b0 100644 --- a/scenario/MusicPlayerOnline/oh-package-lock.json5 +++ b/scenario/MusicPlayerOnline/oh-package-lock.json5 @@ -1,18 +1,3 @@ -/* - * 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. - */ - { "meta": { "stableOrder": true