This commit is contained in:
Horis
2025-05-17 16:26:07 +08:00
parent d965834823
commit 00b0ce949b
14 changed files with 55 additions and 38 deletions
@@ -3,9 +3,10 @@ package io.legado.app.api.controller
import android.text.TextUtils
import io.legado.app.api.ReturnData
import io.legado.app.constant.SourceType
import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource
import io.legado.app.help.config.SourceConfig
import io.legado.app.help.source.SourceHelp
import io.legado.app.utils.GSON
import io.legado.app.utils.fromJsonArray
import io.legado.app.utils.fromJsonObject
@@ -71,8 +72,7 @@ object BookSourceController {
kotlin.runCatching {
GSON.fromJsonArray<BookSource>(postData).getOrThrow().let {
it.forEach { source ->
appDb.bookSourceDao.delete(source)
SourceConfig.removeSource(source.bookSourceUrl)
SourceHelp.deleteBookSource(source.bookSourceUrl)
}
}
}.onFailure {
@@ -21,6 +21,14 @@ interface CacheDao {
@Query("delete from caches where `key` = :key")
fun delete(key: String)
@Query(
"""delete from caches where `key` like 'v_' || :key || '_%'
or `key` = 'userInfo_' || :key
or `key` = 'loginHeader_' || :key
or `key` = 'sourceVariable_' || :key"""
)
fun deleteSourceVariables(key: String)
@Query("delete from caches where deadline > 0 and deadline < :now")
fun clearDeadline(now: Long)
@@ -54,15 +54,21 @@ object SourceHelp {
fun deleteSource(key: String, @SourceType.Type type: Int) {
when (type) {
SourceType.book -> deleteBookSource(key)
SourceType.rss -> appDb.rssSourceDao.delete(key)
SourceType.rss -> deleteRssSource(key)
}
}
fun deleteBookSource(key: String) {
appDb.bookSourceDao.delete(key)
appDb.cacheDao.deleteSourceVariables(key)
SourceConfig.removeSource(key)
}
fun deleteRssSource(key: String) {
appDb.rssSourceDao.delete(key)
appDb.cacheDao.deleteSourceVariables(key)
}
fun enableSource(key: String, @SourceType.Type type: Int, enable: Boolean) {
when (type) {
SourceType.book -> appDb.bookSourceDao.enable(key, enable)
@@ -23,6 +23,7 @@ import io.legado.app.help.book.releaseHtmlData
import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.SourceConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.source.SourceHelp
import io.legado.app.model.webBook.WebBook
import io.legado.app.utils.internString
import io.legado.app.utils.mapParallel
@@ -520,11 +521,8 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
fun del(searchBook: SearchBook) {
execute {
appDb.bookSourceDao.getBookSource(searchBook.origin)?.let { source ->
appDb.bookSourceDao.delete(source)
appDb.searchBookDao.delete(searchBook)
SourceConfig.removeSource(source.bookSourceUrl)
}
SourceHelp.deleteBookSource(searchBook.origin)
appDb.searchBookDao.delete(searchBook)
}
searchBooks.remove(searchBook)
searchCallback?.upAdapter()
@@ -5,7 +5,6 @@ import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import io.legado.app.R
import io.legado.app.base.VMBaseActivity
@@ -26,6 +25,7 @@ import io.legado.app.utils.externalFiles
import io.legado.app.utils.inputStream
import io.legado.app.utils.launch
import io.legado.app.utils.readUri
import io.legado.app.utils.setOnApplyWindowInsetsListenerCompat
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding
@@ -70,10 +70,10 @@ class BookInfoEditActivity :
}
private fun initView() {
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
binding.root.setOnApplyWindowInsetsListenerCompat { view, windowInsets ->
val typeMask = WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()
val insets = windowInsets.getInsets(typeMask)
binding.root.bottomPadding = insets.bottom
view.bottomPadding = insets.bottom
windowInsets
}
}
@@ -10,7 +10,6 @@ import android.view.View
import android.view.WindowInsets
import android.view.WindowManager
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
@@ -44,6 +43,7 @@ import io.legado.app.utils.gone
import io.legado.app.utils.isTv
import io.legado.app.utils.setLightStatusBar
import io.legado.app.utils.setNavigationBarColorAuto
import io.legado.app.utils.setOnApplyWindowInsetsListenerCompat
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding
import java.time.LocalDate
@@ -84,9 +84,9 @@ abstract class BaseReadBookActivity :
setOrientation()
upLayoutInDisplayCutoutMode()
super.onCreate(savedInstanceState)
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
binding.navigationBar.setOnApplyWindowInsetsListenerCompat { view, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
binding.navigationBar.updateLayoutParams {
view.updateLayoutParams {
height = insets.bottom
}
windowInsets
@@ -6,7 +6,6 @@ import android.view.Menu
import android.view.MenuItem
import android.widget.EditText
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.lifecycle.lifecycleScope
import com.google.android.material.tabs.TabLayout
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
@@ -46,6 +45,7 @@ import io.legado.app.utils.launch
import io.legado.app.utils.navigationBarHeight
import io.legado.app.utils.sendToClip
import io.legado.app.utils.setEdgeEffectColor
import io.legado.app.utils.setOnApplyWindowInsetsListenerCompat
import io.legado.app.utils.share
import io.legado.app.utils.shareWithQr
import io.legado.app.utils.showDialogFragment
@@ -72,7 +72,8 @@ class BookSourceEditActivity :
private val infoEntities: ArrayList<EditEntity> = ArrayList()
private val tocEntities: ArrayList<EditEntity> = ArrayList()
private val contentEntities: ArrayList<EditEntity> = ArrayList()
// private val reviewEntities: ArrayList<EditEntity> = ArrayList()
// private val reviewEntities: ArrayList<EditEntity> = ArrayList()
private val qrCodeResult = registerForActivityResult(QrCodeResult()) {
it ?: return@registerForActivityResult
viewModel.importSource(it) { source ->
@@ -200,10 +201,10 @@ class BookSourceEditActivity :
setEditEntities(tab?.position)
}
})
ViewCompat.setOnApplyWindowInsetsListener(binding.recyclerView) { _, windowInsets ->
binding.recyclerView.setOnApplyWindowInsetsListenerCompat { view, windowInsets ->
val navigationBarHeight = windowInsets.navigationBarHeight
val imeHeight = windowInsets.imeHeight
binding.recyclerView.bottomPadding = if (imeHeight == 0) navigationBarHeight else 0
view.bottomPadding = if (imeHeight == 0) navigationBarHeight else 0
softKeyboardTool.initialPadding = imeHeight
windowInsets
}
@@ -8,10 +8,10 @@ import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource
import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.RuleComplete
import io.legado.app.help.config.SourceConfig
import io.legado.app.help.http.CookieStore
import io.legado.app.help.http.newCallStrResponse
import io.legado.app.help.http.okHttpClient
import io.legado.app.help.source.SourceHelp
import io.legado.app.help.source.clearExploreKindsCache
import io.legado.app.help.storage.ImportOldData
import io.legado.app.model.SharedJsScope
@@ -63,8 +63,7 @@ class BookSourceEditViewModel(application: Application) : BaseViewModel(applicat
}
}
bookSource?.let {
appDb.bookSourceDao.delete(it)
SourceConfig.removeSource(it.bookSourceUrl)
SourceHelp.deleteBookSource(it.bookSourceUrl)
}
appDb.bookSourceDao.insert(source)
bookSource = source
@@ -4,11 +4,13 @@ import android.app.Application
import android.text.TextUtils
import io.legado.app.R
import io.legado.app.base.BaseViewModel
import io.legado.app.constant.SourceType
import io.legado.app.data.appDb
import io.legado.app.data.entities.BookSource
import io.legado.app.data.entities.BookSourcePart
import io.legado.app.data.entities.toBookSource
import io.legado.app.help.config.SourceConfig
import io.legado.app.help.source.SourceHelp
import io.legado.app.utils.FileUtils
import io.legado.app.utils.GSON
import io.legado.app.utils.cnCompare
@@ -50,9 +52,8 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
fun del(sources: List<BookSourcePart>) {
execute {
appDb.bookSourceDao.delete(sources)
sources.forEach {
SourceConfig.removeSource(it.bookSourceUrl)
SourceHelp.deleteBookSource(it.bookSourceUrl)
}
}
}
@@ -9,7 +9,6 @@ import android.view.MotionEvent
import android.view.ViewGroup
import androidx.activity.addCallback
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.core.view.postDelayed
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
@@ -48,6 +47,7 @@ import io.legado.app.utils.isCreated
import io.legado.app.utils.navigationBarHeight
import io.legado.app.utils.observeEvent
import io.legado.app.utils.setEdgeEffectColor
import io.legado.app.utils.setOnApplyWindowInsetsListenerCompat
import io.legado.app.utils.shouldHideSoftInput
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.toastOnUi
@@ -202,9 +202,9 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
if (AppConfig.isEInkMode) {
bottomNavigationView.setBackgroundResource(R.drawable.bg_eink_border_top)
}
ViewCompat.setOnApplyWindowInsetsListener(root) { _, windowInsets ->
bottomNavigationView.setOnApplyWindowInsetsListenerCompat { view, windowInsets ->
val height = windowInsets.navigationBarHeight
bottomNavigationView.bottomPadding = height
view.bottomPadding = height
windowInsets.inset(0, 0, 0, height)
}
}
@@ -18,6 +18,7 @@ import io.legado.app.ui.widget.keyboard.KeyboardToolPop
import io.legado.app.utils.GSON
import io.legado.app.utils.imeHeight
import io.legado.app.utils.sendToClip
import io.legado.app.utils.setOnApplyWindowInsetsListenerCompat
import io.legado.app.utils.showHelp
import io.legado.app.utils.viewbindingdelegate.viewBinding
@@ -91,7 +92,7 @@ class ReplaceEditActivity :
binding.ivHelp.setOnClickListener {
showHelp("regexHelp")
}
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
binding.root.setOnApplyWindowInsetsListenerCompat { _, windowInsets ->
softKeyboardTool.initialPadding = windowInsets.imeHeight
windowInsets
}
@@ -22,7 +22,6 @@ import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.activity.addCallback
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.size
import androidx.lifecycle.lifecycleScope
@@ -54,6 +53,7 @@ import io.legado.app.utils.keepScreenOn
import io.legado.app.utils.longSnackbar
import io.legado.app.utils.openUrl
import io.legado.app.utils.setDarkeningAllowed
import io.legado.app.utils.setOnApplyWindowInsetsListenerCompat
import io.legado.app.utils.setTintMutate
import io.legado.app.utils.share
import io.legado.app.utils.showDialogFragment
@@ -208,10 +208,10 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
}
private fun initView() {
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
binding.root.setOnApplyWindowInsetsListenerCompat { view, windowInsets ->
val typeMask = WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()
val insets = windowInsets.getInsets(typeMask)
binding.root.bottomPadding = insets.bottom
view.bottomPadding = insets.bottom
windowInsets
}
}
@@ -5,7 +5,6 @@ import android.view.Menu
import android.view.MenuItem
import android.widget.EditText
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.lifecycle.lifecycleScope
import com.google.android.material.tabs.TabLayout
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
@@ -35,6 +34,7 @@ import io.legado.app.utils.launch
import io.legado.app.utils.navigationBarHeight
import io.legado.app.utils.sendToClip
import io.legado.app.utils.setEdgeEffectColor
import io.legado.app.utils.setOnApplyWindowInsetsListenerCompat
import io.legado.app.utils.share
import io.legado.app.utils.shareWithQr
import io.legado.app.utils.showDialogFragment
@@ -188,10 +188,10 @@ class RssSourceEditActivity :
setEditEntities(tab?.position)
}
})
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->
binding.recyclerView.setOnApplyWindowInsetsListenerCompat { view, windowInsets ->
val navigationBarHeight = windowInsets.navigationBarHeight
val imeHeight = windowInsets.imeHeight
binding.recyclerView.bottomPadding = if (imeHeight == 0) navigationBarHeight else 0
view.bottomPadding = if (imeHeight == 0) navigationBarHeight else 0
softKeyboardTool.initialPadding = imeHeight
windowInsets
}
@@ -266,7 +266,7 @@ fun View.shouldHideSoftInput(event: MotionEvent): Boolean {
fun View.applyStatusBarPadding(withInitialPadding: Boolean = false) {
val initialPadding = if (withInitialPadding) topPadding else 0
ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets ->
setOnApplyWindowInsetsListenerCompat { _, windowInsets ->
val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars())
topPadding = initialPadding + insets.top
windowInsets
@@ -275,7 +275,7 @@ fun View.applyStatusBarPadding(withInitialPadding: Boolean = false) {
fun View.applyNavigationBarPadding(withInitialPadding: Boolean = false) {
val initialPadding = if (withInitialPadding) bottomPadding else 0
ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets ->
setOnApplyWindowInsetsListenerCompat { _, windowInsets ->
bottomPadding = initialPadding + windowInsets.navigationBarHeight
windowInsets
}
@@ -283,7 +283,7 @@ fun View.applyNavigationBarPadding(withInitialPadding: Boolean = false) {
fun View.applyNavigationBarMargin(withInitialMargin: Boolean = false) {
val initialMargin = if (withInitialMargin) marginBottom else 0
ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets ->
setOnApplyWindowInsetsListenerCompat { _, windowInsets ->
updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = initialMargin + windowInsets.navigationBarHeight
}
@@ -304,10 +304,13 @@ fun View.canScroll(direction: Int): Boolean {
return canScrollVertically(direction) || canScrollHorizontally(direction)
}
private val requestLayoutBroken = Build.VERSION.SDK_INT <= Build.VERSION_CODES.M
|| Build.VERSION.SDK_INT in Build.VERSION_CODES.O..Build.VERSION_CODES.Q
fun View.setOnApplyWindowInsetsListenerCompat(listener: (View, WindowInsetsCompat) -> WindowInsetsCompat) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
val windowInsets = listener(view, insets)
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M && isLayoutRequested) {
if (requestLayoutBroken && isLayoutRequested) {
post {
requestLayout()
}