This commit is contained in:
gedoor 2021-09-03 21:09:16 +08:00
parent 263177cc6e
commit 346c725e19
5 changed files with 37 additions and 43 deletions

View File

@ -14,7 +14,6 @@ import android.support.v4.media.session.MediaSessionCompat
import android.support.v4.media.session.PlaybackStateCompat
import androidx.core.app.NotificationCompat
import androidx.media.AudioFocusRequestCompat
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.PlaybackException
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.SimpleExoPlayer
@ -25,6 +24,7 @@ import io.legado.app.constant.EventBus
import io.legado.app.constant.IntentAction
import io.legado.app.constant.Status
import io.legado.app.data.appDb
import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter
import io.legado.app.help.ExoPlayerHelper
import io.legado.app.help.IntentHelp
@ -54,7 +54,7 @@ class AudioPlayService : BaseService(),
private lateinit var audioManager: AudioManager
private lateinit var mFocusRequest: AudioFocusRequestCompat
private lateinit var exoPlayer: ExoPlayer
private lateinit var exoPlayer: SimpleExoPlayer
private var title: String = ""
private var subtitle: String = ""
private var mediaSessionCompat: MediaSessionCompat? = null
@ -135,6 +135,7 @@ class AudioPlayService : BaseService(),
exoPlayer.setMediaSource(mediaSource)
exoPlayer.playWhenReady = true
exoPlayer.prepare()
exoPlayer.seekTo(position.toLong())
}.onFailure {
it.printStackTrace()
toastOnUi("$url ${it.localizedMessage}")
@ -163,7 +164,6 @@ class AudioPlayService : BaseService(),
pause = false
if (!exoPlayer.isPlaying) {
exoPlayer.play()
exoPlayer.seekTo(position.toLong())
}
upPlayProgress()
upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING)
@ -177,11 +177,7 @@ class AudioPlayService : BaseService(),
}
private fun adjustProgress(position: Int) {
if (exoPlayer.isPlaying) {
exoPlayer.seekTo(position.toLong())
} else {
this.position = position
}
exoPlayer.seekTo(position.toLong())
}
private fun upSpeed(adjust: Float) {
@ -205,8 +201,13 @@ class AudioPlayService : BaseService(),
}
Player.STATE_READY -> {
// 准备好
AudioPlay.status = Status.PLAY
postEvent(EventBus.AUDIO_STATE, Status.PLAY)
if (exoPlayer.playWhenReady) {
AudioPlay.status = Status.PLAY
postEvent(EventBus.AUDIO_STATE, Status.PLAY)
} else {
AudioPlay.status = Status.PAUSE
postEvent(EventBus.AUDIO_STATE, Status.PAUSE)
}
postEvent(EventBus.AUDIO_SIZE, exoPlayer.duration)
upPlayProgress()
AudioPlay.saveDurChapter(exoPlayer.duration)
@ -277,8 +278,11 @@ class AudioPlayService : BaseService(),
upPlayProgressJob?.cancel()
upPlayProgressJob = launch {
while (isActive) {
saveProgress()
postEvent(EventBus.AUDIO_PROGRESS, exoPlayer.currentPosition)
AudioPlay.book?.let {
it.durChapterPos = exoPlayer.currentPosition.toInt()
postEvent(EventBus.AUDIO_PROGRESS, it.durChapterPos)
saveProgress(it)
}
delay(1000)
}
}
@ -286,7 +290,7 @@ class AudioPlayService : BaseService(),
private fun loadContent() = with(AudioPlay) {
durChapter?.let { chapter ->
if (addLoading(durChapterIndex)) {
if (addLoading(chapter.index)) {
val book = AudioPlay.book
val bookSource = AudioPlay.bookSource
if (book != null && bookSource != null) {
@ -330,19 +334,16 @@ class AudioPlayService : BaseService(),
* 加载完成
*/
private fun contentLoadFinish(chapter: BookChapter, content: String) {
if (chapter.index == AudioPlay.durChapterIndex) {
if (chapter.index == AudioPlay.book?.durChapterIndex) {
subtitle = chapter.title
url = content
play()
}
}
private fun saveProgress() {
private fun saveProgress(book: Book) {
execute {
AudioPlay.book?.let {
AudioPlay.durChapterPos = exoPlayer.currentPosition.toInt()
appDb.bookDao.upProgress(it.bookUrl, AudioPlay.durChapterPos)
}
appDb.bookDao.upProgress(book.bookUrl, book.durChapterPos)
}
}

View File

@ -22,8 +22,6 @@ object AudioPlay {
var book: Book? = null
var durChapter: BookChapter? = null
var inBookshelf = false
var durChapterIndex = 0
var durChapterPos = 0
var bookSource: BookSource? = null
val loadingChapters = arrayListOf<Int>()
@ -37,18 +35,19 @@ object AudioPlay {
upDurChapter(it)
}
durChapter?.let {
val intent = Intent(context, AudioPlayService::class.java)
intent.action = IntentAction.play
context.startService(intent)
context.startService<AudioPlayService> {
action = IntentAction.play
}
}
}
}
fun upDurChapter(book: Book) {
durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex)
durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex)
postEvent(EventBus.AUDIO_SUB_TITLE, durChapter?.title ?: "")
postEvent(EventBus.AUDIO_SIZE, durChapter?.end?.toInt() ?: 0)
postEvent(EventBus.AUDIO_PROGRESS, durChapterPos)
postEvent(EventBus.AUDIO_PROGRESS, book.durChapterPos)
}
fun pause(context: Context) {
@ -96,8 +95,8 @@ object AudioPlay {
fun skipTo(context: Context, index: Int) {
Coroutine.async {
book?.let { book ->
durChapterIndex = index
durChapterPos = 0
book.durChapterIndex = index
book.durChapterPos = 0
durChapter = null
saveRead(book)
play(context)
@ -111,8 +110,8 @@ object AudioPlay {
if (book.durChapterIndex <= 0) {
return@let
}
durChapterIndex--
durChapterPos = 0
book.durChapterIndex = book.durChapterIndex - 1
book.durChapterPos = 0
durChapter = null
saveRead(book)
play(context)
@ -125,8 +124,8 @@ object AudioPlay {
if (book.durChapterIndex >= book.totalChapterNum) {
return@let
}
durChapterIndex++
durChapterPos = 0
book.durChapterIndex = book.durChapterIndex + 1
book.durChapterPos = 0
durChapter = null
saveRead(book)
play(context)
@ -142,8 +141,6 @@ object AudioPlay {
fun saveRead(book: Book) {
book.lastCheckCount = 0
book.durChapterTime = System.currentTimeMillis()
book.durChapterIndex = durChapterIndex
book.durChapterPos = durChapterPos
Coroutine.async {
appDb.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex)?.let {
book.durChapterTitle = it.title

View File

@ -54,7 +54,7 @@ class AudioPlayActivity :
}
private val tocActivityResult = registerForActivityResult(TocActivityResult()) {
it?.let {
if (it.first != AudioPlay.durChapterIndex) {
if (it.first != AudioPlay.book?.durChapterIndex) {
AudioPlay.skipTo(this, it.first)
}
}
@ -233,7 +233,6 @@ class AudioPlayActivity :
binding.tvAllTime.text = progressTimeFormat.format(it.toLong())
}
observeEventSticky<Int>(EventBus.AUDIO_PROGRESS) {
AudioPlay.durChapterPos = it
if (!adjustProgress) binding.playerProgress.progress = it
binding.tvDurTime.text = progressTimeFormat.format(it.toLong())
}

View File

@ -27,9 +27,7 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application)
book?.let { book ->
titleData.postValue(book.name)
coverData.postValue(book.getDisplayCover())
durChapterIndex = book.durChapterIndex
durChapterPos = book.durChapterPos
durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex)
durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex)
upDurChapter(book)
bookSource = appDb.bookSourceDao.getBookSource(book.origin)
if (durChapter == null) {
@ -111,14 +109,13 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application)
chapters: List<BookChapter>
) {
execute {
AudioPlay.durChapterIndex = BookHelp.getDurChapter(
book.durChapterIndex = BookHelp.getDurChapter(
book.durChapterIndex,
oldTocSize,
book.durChapterTitle,
chapters
)
book.durChapterIndex = AudioPlay.durChapterIndex
book.durChapterTitle = chapters[AudioPlay.durChapterIndex].title
book.durChapterTitle = chapters[book.durChapterIndex].title
appDb.bookDao.update(book)
appDb.bookChapterDao.insert(*chapters.toTypedArray())
}

View File

@ -10,7 +10,7 @@ buildscript {
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.1'
classpath 'com.android.tools.build:gradle:7.0.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'de.timfreiheit.resourceplaceholders:placeholders:0.4'
classpath 'de.undercouch:gradle-download-task:4.1.2'