From 72fa5bcc1af84f989072c11a633c421826d6c716 Mon Sep 17 00:00:00 2001 From: 3harmony Date: Thu, 3 Jul 2025 19:14:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9F=B3=E9=A2=91=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E6=A8=A1=E5=BC=8F=20(#5227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add files via upload * Update EventBus.kt * Update strings.xml * Update activity_audio_play.xml * Update AudioPlay.kt * Update AudioPlayActivity.kt --- .../java/io/legado/app/constant/EventBus.kt | 3 +- .../java/io/legado/app/model/AudioPlay.kt | 62 ++++++++++++++++--- .../app/ui/book/audio/AudioPlayActivity.kt | 16 ++++- .../drawable/ic_play_mode_list_end_stop.xml | 12 ++++ .../res/drawable/ic_play_mode_list_loop.xml | 12 ++++ .../main/res/drawable/ic_play_mode_random.xml | 15 +++++ .../res/drawable/ic_play_mode_single_loop.xml | 18 ++++++ .../main/res/layout/activity_audio_play.xml | 16 ++++- app/src/main/res/values/strings.xml | 1 + 9 files changed, 145 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/ic_play_mode_list_end_stop.xml create mode 100644 app/src/main/res/drawable/ic_play_mode_list_loop.xml create mode 100644 app/src/main/res/drawable/ic_play_mode_random.xml create mode 100644 app/src/main/res/drawable/ic_play_mode_single_loop.xml diff --git a/app/src/main/java/io/legado/app/constant/EventBus.kt b/app/src/main/java/io/legado/app/constant/EventBus.kt index 050bf6996..a04563743 100644 --- a/app/src/main/java/io/legado/app/constant/EventBus.kt +++ b/app/src/main/java/io/legado/app/constant/EventBus.kt @@ -32,4 +32,5 @@ object EventBus { const val READ_ALOUD_PLAY = "readAloudPlay" const val EXPORT_BOOK = "exportBook" const val UP_MANGA_CONFIG = "upMangaConfig" -} \ No newline at end of file + const val PLAY_MODE_CHANGED = "playModeChanged" +} diff --git a/app/src/main/java/io/legado/app/model/AudioPlay.kt b/app/src/main/java/io/legado/app/model/AudioPlay.kt index 636759ca9..584da8e03 100644 --- a/app/src/main/java/io/legado/app/model/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/model/AudioPlay.kt @@ -31,6 +31,25 @@ import splitties.init.appCtx @SuppressLint("StaticFieldLeak") @Suppress("unused") object AudioPlay : CoroutineScope by MainScope() { + /** + * 播放模式枚举 + */ + enum class PlayMode(val iconRes: Int) { + LIST_END_STOP(R.drawable.ic_play_mode_list_end_stop), + SINGLE_LOOP(R.drawable.ic_play_mode_single_loop), + RANDOM(R.drawable.ic_play_mode_random), + LIST_LOOP(R.drawable.ic_play_mode_list_loop); + + fun next(): PlayMode { + return when (this) { + LIST_END_STOP -> SINGLE_LOOP + SINGLE_LOOP -> RANDOM + RANDOM -> LIST_LOOP + LIST_LOOP -> LIST_END_STOP + } + } + } + var playMode = PlayMode.LIST_END_STOP var status = Status.STOP private var activityContext: Context? = null private var serviceContext: Context? = null @@ -48,6 +67,11 @@ object AudioPlay : CoroutineScope by MainScope() { var bookSource: BookSource? = null val loadingChapters = arrayListOf() + fun changePlayMode() { + playMode = playMode.next() + postEvent(EventBus.PLAY_MODE_CHANGED, playMode) + } + fun upData(book: Book) { AudioPlay.book = book chapterSize = appDb.bookChapterDao.getChapterCount(book.bookUrl) @@ -259,12 +283,36 @@ object AudioPlay : CoroutineScope by MainScope() { fun next() { stopPlay() - if (durChapterIndex + 1 < simulatedChapterSize) { - durChapterIndex += 1 - durChapterPos = 0 - durPlayUrl = "" - saveRead() - loadPlayUrl() + when (playMode) { + PlayMode.LIST_END_STOP -> { + if (durChapterIndex + 1 < simulatedChapterSize) { + durChapterIndex += 1 + durChapterPos = 0 + durPlayUrl = "" + saveRead() + loadPlayUrl() + } + } + PlayMode.SINGLE_LOOP -> { + durChapterPos = 0 + durPlayUrl = "" + saveRead() + loadPlayUrl() + } + PlayMode.RANDOM -> { + durChapterIndex = (0 until simulatedChapterSize).random() + durChapterPos = 0 + durPlayUrl = "" + saveRead() + loadPlayUrl() + } + PlayMode.LIST_LOOP -> { + durChapterIndex = (durChapterIndex + 1) % simulatedChapterSize + durChapterPos = 0 + durPlayUrl = "" + saveRead() + loadPlayUrl() + } } } @@ -367,4 +415,4 @@ object AudioPlay : CoroutineScope by MainScope() { } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index 3be60477c..abf57c5fd 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -65,6 +65,7 @@ class AudioPlayActivity : override val viewModel by viewModels() private val timerSliderPopup by lazy { TimerSliderPopup(this) } private var adjustProgress = false + private var playMode = AudioPlay.PlayMode.LIST_END_STOP private val progressTimeFormat by lazy { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -140,6 +141,15 @@ class AudioPlayActivity : } private fun initView() { + binding.ivPlayMode.setOnClickListener { + AudioPlay.changePlayMode() + } + + observeEventSticky(EventBus.PLAY_MODE_CHANGED) { + playMode = it + updatePlayModeIcon() + } + binding.fabPlayStop.setOnClickListener { playButton() } @@ -187,6 +197,10 @@ class AudioPlayActivity : binding.llPlayMenu.applyNavigationBarPadding() } + private fun updatePlayModeIcon() { + binding.ivPlayMode.setImageResource(playMode.iconRes) + } + private fun upCover(path: String?) { BookCover.load(this, path, sourceOrigin = AudioPlay.bookSource?.bookSourceUrl) { BookCover.loadBlur(this, path, sourceOrigin = AudioPlay.bookSource?.bookSourceUrl) @@ -303,4 +317,4 @@ class AudioPlayActivity : } } -} \ No newline at end of file +} diff --git a/app/src/main/res/drawable/ic_play_mode_list_end_stop.xml b/app/src/main/res/drawable/ic_play_mode_list_end_stop.xml new file mode 100644 index 000000000..edc09be4e --- /dev/null +++ b/app/src/main/res/drawable/ic_play_mode_list_end_stop.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_play_mode_list_loop.xml b/app/src/main/res/drawable/ic_play_mode_list_loop.xml new file mode 100644 index 000000000..9137c0298 --- /dev/null +++ b/app/src/main/res/drawable/ic_play_mode_list_loop.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_play_mode_random.xml b/app/src/main/res/drawable/ic_play_mode_random.xml new file mode 100644 index 000000000..159b056a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_play_mode_random.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_play_mode_single_loop.xml b/app/src/main/res/drawable/ic_play_mode_single_loop.xml new file mode 100644 index 000000000..27014b26e --- /dev/null +++ b/app/src/main/res/drawable/ic_play_mode_single_loop.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_audio_play.xml b/app/src/main/res/layout/activity_audio_play.xml index 7aa5d6f69..9ec0976d0 100644 --- a/app/src/main/res/layout/activity_audio_play.xml +++ b/app/src/main/res/layout/activity_audio_play.xml @@ -69,6 +69,20 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/title_bar" /> + + - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b52dc887e..f042cbafa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1227,4 +1227,5 @@ 阈值 禁用水平滚动动画 开启图片灰色 + 播放模式