|
@@ -7,15 +7,10 @@ import android.content.res.Configuration
|
|
|
import android.net.Uri
|
|
import android.net.Uri
|
|
|
import android.os.Bundle
|
|
import android.os.Bundle
|
|
|
import android.os.Looper
|
|
import android.os.Looper
|
|
|
-import android.view.Gravity
|
|
|
|
|
-import android.view.InputDevice
|
|
|
|
|
-import android.view.KeyEvent
|
|
|
|
|
-import android.view.Menu
|
|
|
|
|
-import android.view.MenuItem
|
|
|
|
|
-import android.view.MotionEvent
|
|
|
|
|
-import android.view.View
|
|
|
|
|
|
|
+import android.view.*
|
|
|
import androidx.activity.addCallback
|
|
import androidx.activity.addCallback
|
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
import androidx.activity.result.contract.ActivityResultContracts
|
|
|
|
|
+import androidx.appcompat.app.AlertDialog
|
|
|
import androidx.appcompat.widget.PopupMenu
|
|
import androidx.appcompat.widget.PopupMenu
|
|
|
import androidx.core.view.get
|
|
import androidx.core.view.get
|
|
|
import androidx.core.view.isVisible
|
|
import androidx.core.view.isVisible
|
|
@@ -24,12 +19,7 @@ import androidx.lifecycle.lifecycleScope
|
|
|
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
|
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
|
|
import io.legado.app.BuildConfig
|
|
import io.legado.app.BuildConfig
|
|
|
import io.legado.app.R
|
|
import io.legado.app.R
|
|
|
-import io.legado.app.constant.AppConst
|
|
|
|
|
-import io.legado.app.constant.AppLog
|
|
|
|
|
-import io.legado.app.constant.BookType
|
|
|
|
|
-import io.legado.app.constant.EventBus
|
|
|
|
|
-import io.legado.app.constant.PreferKey
|
|
|
|
|
-import io.legado.app.constant.Status
|
|
|
|
|
|
|
+import io.legado.app.constant.*
|
|
|
import io.legado.app.data.appDb
|
|
import io.legado.app.data.appDb
|
|
|
import io.legado.app.data.entities.Book
|
|
import io.legado.app.data.entities.Book
|
|
|
import io.legado.app.data.entities.BookChapter
|
|
import io.legado.app.data.entities.BookChapter
|
|
@@ -39,14 +29,7 @@ import io.legado.app.exception.NoStackTraceException
|
|
|
import io.legado.app.help.AppWebDav
|
|
import io.legado.app.help.AppWebDav
|
|
|
import io.legado.app.help.IntentData
|
|
import io.legado.app.help.IntentData
|
|
|
import io.legado.app.help.TTS
|
|
import io.legado.app.help.TTS
|
|
|
-import io.legado.app.help.book.BookHelp
|
|
|
|
|
-import io.legado.app.help.book.ContentProcessor
|
|
|
|
|
-import io.legado.app.help.book.isAudio
|
|
|
|
|
-import io.legado.app.help.book.isEpub
|
|
|
|
|
-import io.legado.app.help.book.isLocal
|
|
|
|
|
-import io.legado.app.help.book.isLocalTxt
|
|
|
|
|
-import io.legado.app.help.book.isMobi
|
|
|
|
|
-import io.legado.app.help.book.removeType
|
|
|
|
|
|
|
+import io.legado.app.help.book.*
|
|
|
import io.legado.app.help.config.AppConfig
|
|
import io.legado.app.help.config.AppConfig
|
|
|
import io.legado.app.help.config.ReadBookConfig
|
|
import io.legado.app.help.config.ReadBookConfig
|
|
|
import io.legado.app.help.config.ReadTipConfig
|
|
import io.legado.app.help.config.ReadTipConfig
|
|
@@ -59,6 +42,7 @@ import io.legado.app.lib.theme.accentColor
|
|
|
import io.legado.app.model.ReadAloud
|
|
import io.legado.app.model.ReadAloud
|
|
|
import io.legado.app.model.ReadBook
|
|
import io.legado.app.model.ReadBook
|
|
|
import io.legado.app.model.analyzeRule.AnalyzeRule
|
|
import io.legado.app.model.analyzeRule.AnalyzeRule
|
|
|
|
|
+import io.legado.app.receiver.NetworkChangedListener
|
|
|
import io.legado.app.model.localBook.EpubFile
|
|
import io.legado.app.model.localBook.EpubFile
|
|
|
import io.legado.app.model.localBook.MobiFile
|
|
import io.legado.app.model.localBook.MobiFile
|
|
|
import io.legado.app.receiver.TimeBatteryReceiver
|
|
import io.legado.app.receiver.TimeBatteryReceiver
|
|
@@ -69,7 +53,7 @@ import io.legado.app.ui.book.bookmark.BookmarkDialog
|
|
|
import io.legado.app.ui.book.changesource.ChangeBookSourceDialog
|
|
import io.legado.app.ui.book.changesource.ChangeBookSourceDialog
|
|
|
import io.legado.app.ui.book.changesource.ChangeChapterSourceDialog
|
|
import io.legado.app.ui.book.changesource.ChangeChapterSourceDialog
|
|
|
import io.legado.app.ui.book.info.BookInfoActivity
|
|
import io.legado.app.ui.book.info.BookInfoActivity
|
|
|
-import io.legado.app.ui.book.read.config.AutoReadDialog
|
|
|
|
|
|
|
+import io.legado.app.ui.book.read.config.*
|
|
|
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.BG_COLOR
|
|
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.BG_COLOR
|
|
|
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.TEXT_COLOR
|
|
import io.legado.app.ui.book.read.config.BgTextConfigDialog.Companion.TEXT_COLOR
|
|
|
import io.legado.app.ui.book.read.config.MoreConfigDialog
|
|
import io.legado.app.ui.book.read.config.MoreConfigDialog
|
|
@@ -96,38 +80,10 @@ import io.legado.app.ui.replace.ReplaceRuleActivity
|
|
|
import io.legado.app.ui.replace.edit.ReplaceEditActivity
|
|
import io.legado.app.ui.replace.edit.ReplaceEditActivity
|
|
|
import io.legado.app.ui.widget.PopupAction
|
|
import io.legado.app.ui.widget.PopupAction
|
|
|
import io.legado.app.ui.widget.dialog.PhotoDialog
|
|
import io.legado.app.ui.widget.dialog.PhotoDialog
|
|
|
-import io.legado.app.utils.ACache
|
|
|
|
|
-import io.legado.app.utils.Debounce
|
|
|
|
|
-import io.legado.app.utils.LogUtils
|
|
|
|
|
-import io.legado.app.utils.StartActivityContract
|
|
|
|
|
-import io.legado.app.utils.applyOpenTint
|
|
|
|
|
-import io.legado.app.utils.buildMainHandler
|
|
|
|
|
-import io.legado.app.utils.getPrefBoolean
|
|
|
|
|
-import io.legado.app.utils.getPrefString
|
|
|
|
|
-import io.legado.app.utils.hexString
|
|
|
|
|
-import io.legado.app.utils.iconItemOnLongClick
|
|
|
|
|
-import io.legado.app.utils.invisible
|
|
|
|
|
-import io.legado.app.utils.isAbsUrl
|
|
|
|
|
-import io.legado.app.utils.isTrue
|
|
|
|
|
-import io.legado.app.utils.launch
|
|
|
|
|
-import io.legado.app.utils.navigationBarGravity
|
|
|
|
|
-import io.legado.app.utils.observeEvent
|
|
|
|
|
-import io.legado.app.utils.observeEventSticky
|
|
|
|
|
-import io.legado.app.utils.postEvent
|
|
|
|
|
-import io.legado.app.utils.showDialogFragment
|
|
|
|
|
-import io.legado.app.utils.showHelp
|
|
|
|
|
-import io.legado.app.utils.startActivity
|
|
|
|
|
-import io.legado.app.utils.sysScreenOffTime
|
|
|
|
|
-import io.legado.app.utils.throttle
|
|
|
|
|
-import io.legado.app.utils.toastOnUi
|
|
|
|
|
-import io.legado.app.utils.visible
|
|
|
|
|
|
|
+import io.legado.app.utils.*
|
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
import kotlinx.coroutines.Dispatchers.IO
|
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
|
-import kotlinx.coroutines.Job
|
|
|
|
|
-import kotlinx.coroutines.delay
|
|
|
|
|
-import kotlinx.coroutines.ensureActive
|
|
|
|
|
-import kotlinx.coroutines.launch
|
|
|
|
|
-import kotlinx.coroutines.withContext
|
|
|
|
|
|
|
+import kotlinx.coroutines.*
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 阅读界面
|
|
* 阅读界面
|
|
@@ -245,6 +201,11 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
|
|
|
|
|
//恢复跳转前进度对话框的交互结果
|
|
//恢复跳转前进度对话框的交互结果
|
|
|
private var confirmRestoreProcess: Boolean? = null
|
|
private var confirmRestoreProcess: Boolean? = null
|
|
|
|
|
+ private val networkChangedListener by lazy {
|
|
|
|
|
+ NetworkChangedListener(this)
|
|
|
|
|
+ }
|
|
|
|
|
+ private var justInitData: Boolean = false
|
|
|
|
|
+ private var syncDialog: AlertDialog? = null
|
|
|
|
|
|
|
|
@SuppressLint("ClickableViewAccessibility")
|
|
@SuppressLint("ClickableViewAccessibility")
|
|
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
|
@@ -289,6 +250,7 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
viewModel.initData(intent)
|
|
viewModel.initData(intent)
|
|
|
false
|
|
false
|
|
|
}
|
|
}
|
|
|
|
|
+ justInitData = true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override fun onNewIntent(intent: Intent) {
|
|
override fun onNewIntent(intent: Intent) {
|
|
@@ -318,6 +280,7 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
bookChanged = false
|
|
bookChanged = false
|
|
|
ReadBook.callBack = this
|
|
ReadBook.callBack = this
|
|
|
viewModel.initData(intent)
|
|
viewModel.initData(intent)
|
|
|
|
|
+ justInitData = true
|
|
|
} else {
|
|
} else {
|
|
|
//web端阅读时,app处于阅读界面,本地记录会覆盖web保存的进度,在此处恢复
|
|
//web端阅读时,app处于阅读界面,本地记录会覆盖web保存的进度,在此处恢复
|
|
|
ReadBook.webBookProgress?.let {
|
|
ReadBook.webBookProgress?.let {
|
|
@@ -329,6 +292,14 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
registerReceiver(timeBatteryReceiver, timeBatteryReceiver.filter)
|
|
registerReceiver(timeBatteryReceiver, timeBatteryReceiver.filter)
|
|
|
binding.readView.upTime()
|
|
binding.readView.upTime()
|
|
|
screenOffTimerStart()
|
|
screenOffTimerStart()
|
|
|
|
|
+ // 网络监听,当从无网切换到网络环境时同步进度(注意注册的同时就会收到监听,因此界面激活时无需重复执行同步操作)
|
|
|
|
|
+ networkChangedListener.register()
|
|
|
|
|
+ networkChangedListener.onNetworkChanged = {
|
|
|
|
|
+ // 当网络是可用状态且无需初始化时同步进度(初始化中已有同步进度逻辑)
|
|
|
|
|
+ if (AppConfig.syncBookProgressPlus && NetworkUtils.isAvailable() && !justInitData) {
|
|
|
|
|
+ ReadBook.syncProgress({progress -> sureNewProgress(progress)}, null)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override fun onPause() {
|
|
override fun onPause() {
|
|
@@ -339,9 +310,15 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
unregisterReceiver(timeBatteryReceiver)
|
|
unregisterReceiver(timeBatteryReceiver)
|
|
|
upSystemUiVisibility()
|
|
upSystemUiVisibility()
|
|
|
if (!BuildConfig.DEBUG) {
|
|
if (!BuildConfig.DEBUG) {
|
|
|
- ReadBook.uploadProgress()
|
|
|
|
|
|
|
+ if (AppConfig.syncBookProgressPlus) {
|
|
|
|
|
+ ReadBook.syncProgress()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ReadBook.uploadProgress()
|
|
|
|
|
+ }
|
|
|
Backup.autoBack(this)
|
|
Backup.autoBack(this)
|
|
|
}
|
|
}
|
|
|
|
|
+ justInitData = false
|
|
|
|
|
+ networkChangedListener.unRegister()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
|
|
override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
|
|
@@ -408,6 +385,9 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
menu.findItem(R.id.menu_get_progress)?.isVisible = withContext(IO) {
|
|
menu.findItem(R.id.menu_get_progress)?.isVisible = withContext(IO) {
|
|
|
AppWebDav.isOk
|
|
AppWebDav.isOk
|
|
|
}
|
|
}
|
|
|
|
|
+ menu.findItem(R.id.menu_cover_progress)?.isVisible = withContext(IO) {
|
|
|
|
|
+ AppWebDav.isOk
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -551,6 +531,10 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ R.id.menu_cover_progress -> ReadBook.book?.let {
|
|
|
|
|
+ ReadBook.uploadProgress({ toastOnUi(R.string.upload_book_success) })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
R.id.menu_same_title_removed -> {
|
|
R.id.menu_same_title_removed -> {
|
|
|
ReadBook.book?.let {
|
|
ReadBook.book?.let {
|
|
|
val contentProcessor = ContentProcessor.get(it)
|
|
val contentProcessor = ContentProcessor.get(it)
|
|
@@ -1499,6 +1483,18 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ override fun sureNewProgress(progress: BookProgress) {
|
|
|
|
|
+ syncDialog?.dismiss()
|
|
|
|
|
+ syncDialog = alert(R.string.get_book_progress) {
|
|
|
|
|
+ setMessage(R.string.cloud_progress_exceeds_current)
|
|
|
|
|
+ okButton {
|
|
|
|
|
+ ReadBook.setProgress(progress)
|
|
|
|
|
+ ReadBook.saveRead()
|
|
|
|
|
+ }
|
|
|
|
|
+ noButton()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
override fun finish() {
|
|
override fun finish() {
|
|
|
val book = ReadBook.book ?: return super.finish()
|
|
val book = ReadBook.book ?: return super.finish()
|
|
|
|
|
|