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