From 9183d2fc4859e4f93a2c0b93e474a7e9cf68b59d Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Sun, 26 Oct 2025 13:44:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=89=E5=A3=B0=E4=B9=A6=E5=AA=92=E4=BD=93?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E5=BC=80=E5=85=B3=20#143?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legato/kazusa/constant/PreferKey.kt | 1 + .../io/legato/kazusa/help/config/AppConfig.kt | 6 + .../legato/kazusa/service/AudioPlayService.kt | 112 ++++++++++++------ .../kazusa/service/BaseReadAloudService.kt | 4 +- .../kazusa/ui/book/audio/AudioPlayActivity.kt | 4 +- app/src/main/res/menu/audio_play.xml | 5 + 6 files changed, 91 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt index 517b7be7f..85e91c41d 100644 --- a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt +++ b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt @@ -207,4 +207,5 @@ object PreferKey { const val menuAlpha = "menuAlpha" const val colorImage = "colorImage" const val bookshelfRefreshingLimit = "bookshelfRefreshingLimit" + const val systemMediaControlCompatibilityChange = "systemMediaControlCompatibilityChange" } diff --git a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt index 40a67966a..a3ae1d598 100644 --- a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt +++ b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt @@ -837,5 +837,11 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { set(value) { appCtx.putPrefInt(PreferKey.bookshelfRefreshingLimit, value) } + + var systemMediaControlCompatibilityChange: Boolean + get() = appCtx.getPrefBoolean(PreferKey.systemMediaControlCompatibilityChange, true) + set(value) { + appCtx.putPrefBoolean(PreferKey.systemMediaControlCompatibilityChange, value) + } } diff --git a/app/src/main/java/io/legato/kazusa/service/AudioPlayService.kt b/app/src/main/java/io/legato/kazusa/service/AudioPlayService.kt index 50b07b054..1483e89cb 100644 --- a/app/src/main/java/io/legato/kazusa/service/AudioPlayService.kt +++ b/app/src/main/java/io/legato/kazusa/service/AudioPlayService.kt @@ -41,6 +41,7 @@ import io.legato.kazusa.receiver.MediaButtonReceiver import io.legato.kazusa.ui.book.audio.AudioPlayActivity import io.legato.kazusa.utils.activityPendingIntent import io.legato.kazusa.utils.broadcastPendingIntent +import io.legato.kazusa.utils.getPrefBoolean import io.legato.kazusa.utils.postEvent import io.legato.kazusa.utils.printOnDebug import io.legato.kazusa.utils.servicePendingIntent @@ -81,7 +82,9 @@ class AudioPlayService : BaseService(), private const val MEDIA_SESSION_ACTIONS = (PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PAUSE or PlaybackStateCompat.ACTION_PLAY_PAUSE - or PlaybackStateCompat.ACTION_SEEK_TO) + or PlaybackStateCompat.ACTION_SEEK_TO + or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS + or PlaybackStateCompat.ACTION_SKIP_TO_NEXT) private const val APP_ACTION_STOP = "Stop" private const val APP_ACTION_TIMER = "Timer" @@ -468,33 +471,50 @@ class AudioPlayService : BaseService(), @SuppressLint("UnspecifiedImmutableFlag") private fun initMediaSession() { mediaSessionCompat = MediaSessionCompat(this, "readAloud") - mediaSessionCompat?.setCallback(object : MediaSessionCompat.Callback() { - override fun onSeekTo(pos: Long) { - position = pos.toInt() - exoPlayer.seekTo(pos) - } - - override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { - return MediaButtonReceiver.handleIntent(this@AudioPlayService, mediaButtonEvent) - } - - override fun onPlay() = resume() - - override fun onPause() = pause() - - override fun onCustomAction(action: String?, extras: Bundle?) { - action ?: return - - when (action) { - APP_ACTION_STOP -> stopSelf() - APP_ACTION_TIMER -> addTimer() + if (AppConfig.systemMediaControlCompatibilityChange) { + mediaSessionCompat?.setCallback(object : MediaSessionCompat.Callback() { + override fun onSeekTo(pos: Long) { + position = pos.toInt() + exoPlayer.seekTo(pos) } - } - }) - mediaSessionCompat?.setMediaButtonReceiver( - broadcastPendingIntent(Intent.ACTION_MEDIA_BUTTON) - ) - mediaSessionCompat?.isActive = true + + override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { + return MediaButtonReceiver.handleIntent(this@AudioPlayService, mediaButtonEvent) + } + + override fun onPlay() = resume() + + override fun onPause() = pause() + + override fun onCustomAction(action: String?, extras: Bundle?) { + action ?: return + + when (action) { + APP_ACTION_STOP -> stopSelf() + APP_ACTION_TIMER -> addTimer() + } + } + + override fun onSkipToPrevious() { + super.onSkipToPrevious() + AudioPlay.prev() + } + + override fun onSkipToNext() { + super.onSkipToNext() + AudioPlay.next() + } + + }) + } else { + mediaSessionCompat?.setCallback(object : MediaSessionCompat.Callback() { + override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { + return MediaButtonReceiver.handleIntent( + this@AudioPlayService, mediaButtonEvent + ) + } + }) + } } /** @@ -559,22 +579,23 @@ class AudioPlayService : BaseService(), val nSubtitle = AudioPlay.durChapter?.title ?: getString(R.string.audio_play_s) - val builder = NotificationCompat.Builder(this@AudioPlayService, AppConst.channelIdReadAloud) + val builder = NotificationCompat + .Builder(this@AudioPlayService, AppConst.channelIdReadAloud) .setSmallIcon(R.drawable.ic_volume_up) .setSubText(getString(R.string.audio)) .setOngoing(true) .setOnlyAlertOnce(true) .setContentTitle(nTitle) .setContentText(nSubtitle) - .setContentIntent(activityPendingIntent("activity")) - .setLargeIcon(cover) - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setStyle( - androidx.media.app.NotificationCompat.MediaStyle() - .setShowActionsInCompactView(0, 1, 2) - .setMediaSession(mediaSessionCompat?.sessionToken) + .setContentIntent( + activityPendingIntent("activity") ) - + builder.setLargeIcon(cover) + builder.addAction( + R.drawable.ic_skip_previous, + getString(R.string.prev_page), + servicePendingIntent(IntentAction.prev) + ) if (pause) { builder.addAction( R.drawable.ic_play, @@ -588,7 +609,11 @@ class AudioPlayService : BaseService(), servicePendingIntent(IntentAction.pause) ) } - + builder.addAction( + R.drawable.ic_skip_next, + getString(R.string.next_page), + servicePendingIntent(IntentAction.next) + ) builder.addAction( R.drawable.ic_stop_black_24dp, getString(R.string.stop), @@ -599,10 +624,21 @@ class AudioPlayService : BaseService(), getString(R.string.set_timer), servicePendingIntent(IntentAction.addTimer) ) - + builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + builder.setStyle(choiceMediaStyle()) return builder } + private fun choiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { + val mediaStyle = androidx.media.app.NotificationCompat.MediaStyle() + mediaStyle.setShowActionsInCompactView(1,2,4) + if (AppConfig.systemMediaControlCompatibilityChange) { + //fix #4090 android 14 can not show play control in lock screen + mediaStyle.setMediaSession(mediaSessionCompat?.sessionToken) + } + return mediaStyle + } + private fun upAudioPlayNotification() { upNotificationJob = execute { try { diff --git a/app/src/main/java/io/legato/kazusa/service/BaseReadAloudService.kt b/app/src/main/java/io/legato/kazusa/service/BaseReadAloudService.kt index 6f942231c..64cd8be3e 100644 --- a/app/src/main/java/io/legato/kazusa/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legato/kazusa/service/BaseReadAloudService.kt @@ -466,7 +466,7 @@ abstract class BaseReadAloudService : BaseService(), */ @SuppressLint("UnspecifiedImmutableFlag") private fun initMediaSession() { - if (getPrefBoolean("systemMediaControlCompatibilityChange")) { + if (AppConfig.systemMediaControlCompatibilityChange) { mediaSessionCompat.setCallback(object : MediaSessionCompat.Callback() { override fun onPlay() { resumeReadAloud() @@ -577,7 +577,7 @@ abstract class BaseReadAloudService : BaseService(), private fun choiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { val mediaStyle = androidx.media.app.NotificationCompat.MediaStyle() .setShowActionsInCompactView(1, 2, 4) - if (getPrefBoolean("systemMediaControlCompatibilityChange")) { + if (AppConfig.systemMediaControlCompatibilityChange) { //fix #4090 android 14 can not show play control in lock screen mediaStyle.setMediaSession(mediaSessionCompat.sessionToken) } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt index 4fa441158..ab5b6acf2 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/audio/AudioPlayActivity.kt @@ -33,6 +33,7 @@ import io.legato.kazusa.R import io.legato.kazusa.base.VMBaseActivity import io.legato.kazusa.constant.BookType import io.legato.kazusa.constant.EventBus +import io.legato.kazusa.constant.PreferKey import io.legato.kazusa.constant.Status import io.legato.kazusa.constant.Theme import io.legato.kazusa.data.appDb @@ -173,6 +174,7 @@ class AudioPlayActivity : override fun onMenuOpened(featureId: Int, menu: Menu): Boolean { menu.findItem(R.id.menu_login)?.isVisible = !AudioPlay.bookSource?.loginUrl.isNullOrBlank() menu.findItem(R.id.menu_wake_lock)?.isChecked = AppConfig.audioPlayUseWakeLock + menu.findItem(R.id.menu_media_control)?.isChecked = AppConfig.systemMediaControlCompatibilityChange return super.onMenuOpened(featureId, menu) } @@ -188,7 +190,7 @@ class AudioPlayActivity : putExtra("key", it.bookSourceUrl) } } - + R.id.menu_media_control -> AppConfig.systemMediaControlCompatibilityChange = !AppConfig.systemMediaControlCompatibilityChange R.id.menu_wake_lock -> AppConfig.audioPlayUseWakeLock = !AppConfig.audioPlayUseWakeLock R.id.menu_copy_audio_url -> sendToClip(AudioPlayService.url) R.id.menu_edit_source -> AudioPlay.bookSource?.let { diff --git a/app/src/main/res/menu/audio_play.xml b/app/src/main/res/menu/audio_play.xml index 8d9362f28..158f2a284 100644 --- a/app/src/main/res/menu/audio_play.xml +++ b/app/src/main/res/menu/audio_play.xml @@ -31,6 +31,11 @@ android:checkable="true" app:showAsAction="never" /> +