diff --git a/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt b/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt index f6742bc31..3bc50ca85 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt @@ -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(postData).getOrThrow().let { it.forEach { source -> - appDb.bookSourceDao.delete(source) - SourceConfig.removeSource(source.bookSourceUrl) + SourceHelp.deleteBookSource(source.bookSourceUrl) } } }.onFailure { diff --git a/app/src/main/java/io/legado/app/data/dao/CacheDao.kt b/app/src/main/java/io/legado/app/data/dao/CacheDao.kt index 7ebd9bbd9..c3cdb331e 100644 --- a/app/src/main/java/io/legado/app/data/dao/CacheDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/CacheDao.kt @@ -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) diff --git a/app/src/main/java/io/legado/app/help/source/SourceHelp.kt b/app/src/main/java/io/legado/app/help/source/SourceHelp.kt index cb57a1ac3..03e29fcf1 100644 --- a/app/src/main/java/io/legado/app/help/source/SourceHelp.kt +++ b/app/src/main/java/io/legado/app/help/source/SourceHelp.kt @@ -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) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt index 6742335d9..732297092 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt @@ -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() diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index d34954990..b498190de 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -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 } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt index e3cc12f8b..173843fd9 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt @@ -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 diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index e320f3ff3..1db9bbfb1 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -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 = ArrayList() private val tocEntities: ArrayList = ArrayList() private val contentEntities: ArrayList = ArrayList() -// private val reviewEntities: ArrayList = ArrayList() + + // private val reviewEntities: ArrayList = 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 } diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt index 553b34d80..506f76f4c 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt @@ -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 diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index 499d9f9dc..581b14c7c 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -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) { execute { - appDb.bookSourceDao.delete(sources) sources.forEach { - SourceConfig.removeSource(it.bookSourceUrl) + SourceHelp.deleteBookSource(it.bookSourceUrl) } } } diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index ae127df25..d2e8f087c 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -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(), 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) } } diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt index 575436a52..f4a3e0ef9 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt @@ -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 } diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index d410b68a4..7c74eb027 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -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 } 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 } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt index 83c4a9bec..417b42836 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt @@ -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 } diff --git a/app/src/main/java/io/legado/app/utils/ViewExtensions.kt b/app/src/main/java/io/legado/app/utils/ViewExtensions.kt index a2ae217fb..603dc567b 100644 --- a/app/src/main/java/io/legado/app/utils/ViewExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ViewExtensions.kt @@ -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 { 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() }