|
|
@@ -86,6 +86,9 @@ abstract class BaseReadAloudService : BaseService(),
|
|
|
BitmapFactory.decodeResource(appCtx.resources, R.drawable.icon_read_book)
|
|
|
var pageChanged = false
|
|
|
private var ttsProgress = 0
|
|
|
+ private var toLast = false
|
|
|
+ var paragraphStartPos = 0
|
|
|
+ private var readAloudByPage = false
|
|
|
|
|
|
private val broadcastReceiver = object : BroadcastReceiver() {
|
|
|
override fun onReceive(context: Context, intent: Intent) {
|
|
|
@@ -164,19 +167,40 @@ abstract class BaseReadAloudService : BaseService(),
|
|
|
}
|
|
|
|
|
|
private fun newReadAloud(play: Boolean, pageIndex: Int, startPos: Int) {
|
|
|
- lifecycleScope.launch(IO) {
|
|
|
+ execute(executeContext = IO) {
|
|
|
this@BaseReadAloudService.pageIndex = pageIndex
|
|
|
textChapter = ReadBook.curTextChapter
|
|
|
- val textChapter = textChapter ?: return@launch
|
|
|
- nowSpeak = 0
|
|
|
+ val textChapter = textChapter ?: return@execute
|
|
|
readAloudNumber = textChapter.getReadLength(pageIndex) + startPos
|
|
|
- val readAloudByPage = getPrefBoolean(PreferKey.readAloudByPage)
|
|
|
- contentList = textChapter.getNeedReadAloud(pageIndex, readAloudByPage, startPos)
|
|
|
+ readAloudByPage = getPrefBoolean(PreferKey.readAloudByPage)
|
|
|
+ contentList = textChapter.getNeedReadAloud(0, readAloudByPage, 0)
|
|
|
.split("\n")
|
|
|
.filter { it.isNotEmpty() }
|
|
|
+ var pos = startPos
|
|
|
+ val page = textChapter.getPage(pageIndex)!!
|
|
|
+ if (pos > 0) {
|
|
|
+ for (paragraph in page.paragraphs) {
|
|
|
+ val tmp = pos - paragraph.length - 1
|
|
|
+ if (tmp < 0) break
|
|
|
+ pos = tmp
|
|
|
+ }
|
|
|
+ }
|
|
|
+ nowSpeak = textChapter.getParagraphNum(readAloudNumber + 1, readAloudByPage) - 1
|
|
|
+ if (!readAloudByPage && pos == 0) {
|
|
|
+ pos = page.lines.first().chapterPosition -
|
|
|
+ textChapter.paragraphs[nowSpeak].chapterPosition
|
|
|
+ }
|
|
|
+ paragraphStartPos = pos
|
|
|
+ if (toLast) {
|
|
|
+ toLast = false
|
|
|
+ readAloudNumber = textChapter.getLastParagraphPosition()
|
|
|
+ nowSpeak = contentList.lastIndex
|
|
|
+ }
|
|
|
launch(Main) {
|
|
|
if (play) play() else pageChanged = true
|
|
|
}
|
|
|
+ }.onError {
|
|
|
+ AppLog.put("启动朗读出错\n${it.localizedMessage}", it, true)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -225,9 +249,24 @@ abstract class BaseReadAloudService : BaseService(),
|
|
|
if (nowSpeak > 0) {
|
|
|
playStop()
|
|
|
nowSpeak--
|
|
|
- readAloudNumber -= contentList[nowSpeak].length.minus(1)
|
|
|
+ readAloudNumber -= contentList[nowSpeak].length + 1 + paragraphStartPos
|
|
|
+ paragraphStartPos = 0
|
|
|
+ textChapter?.let {
|
|
|
+ val paragraphs = if (readAloudByPage) {
|
|
|
+ it.pageParagraphs
|
|
|
+ } else {
|
|
|
+ it.paragraphs
|
|
|
+ }
|
|
|
+ if (!paragraphs[nowSpeak].isParagraphEnd) readAloudNumber++
|
|
|
+ if (readAloudNumber < it.getReadLength(pageIndex)) {
|
|
|
+ pageIndex--
|
|
|
+ ReadBook.moveToPrevPage()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ upTtsProgress(readAloudNumber + 1)
|
|
|
play()
|
|
|
} else {
|
|
|
+ toLast = true
|
|
|
ReadBook.moveToPrevChapter(true)
|
|
|
}
|
|
|
}
|
|
|
@@ -235,8 +274,10 @@ abstract class BaseReadAloudService : BaseService(),
|
|
|
private fun nextP() {
|
|
|
if (nowSpeak < contentList.size - 1) {
|
|
|
playStop()
|
|
|
- readAloudNumber += contentList[nowSpeak].length.plus(1)
|
|
|
+ readAloudNumber += contentList[nowSpeak].length.plus(1) - paragraphStartPos
|
|
|
+ paragraphStartPos = 0
|
|
|
nowSpeak++
|
|
|
+ upTtsProgress(readAloudNumber + 1)
|
|
|
play()
|
|
|
} else {
|
|
|
nextChapter()
|