|
@@ -14,6 +14,8 @@ import androidx.appcompat.widget.PopupMenu
|
|
|
import androidx.appcompat.widget.SearchView
|
|
import androidx.appcompat.widget.SearchView
|
|
|
import androidx.core.os.bundleOf
|
|
import androidx.core.os.bundleOf
|
|
|
import androidx.lifecycle.Lifecycle
|
|
import androidx.lifecycle.Lifecycle
|
|
|
|
|
+import androidx.lifecycle.LifecycleOwner
|
|
|
|
|
+import androidx.lifecycle.LifecycleRegistry
|
|
|
import androidx.lifecycle.flowWithLifecycle
|
|
import androidx.lifecycle.flowWithLifecycle
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
import androidx.lifecycle.repeatOnLifecycle
|
|
import androidx.lifecycle.repeatOnLifecycle
|
|
@@ -50,6 +52,7 @@ import io.legado.app.utils.ACache
|
|
|
import io.legado.app.utils.applyTint
|
|
import io.legado.app.utils.applyTint
|
|
|
import io.legado.app.utils.cnCompare
|
|
import io.legado.app.utils.cnCompare
|
|
|
import io.legado.app.utils.dpToPx
|
|
import io.legado.app.utils.dpToPx
|
|
|
|
|
+import io.legado.app.utils.flowWithLifecycleFirst
|
|
|
import io.legado.app.utils.hideSoftInput
|
|
import io.legado.app.utils.hideSoftInput
|
|
|
import io.legado.app.utils.isAbsUrl
|
|
import io.legado.app.utils.isAbsUrl
|
|
|
import io.legado.app.utils.launch
|
|
import io.legado.app.utils.launch
|
|
@@ -68,6 +71,7 @@ import kotlinx.coroutines.Job
|
|
|
import kotlinx.coroutines.delay
|
|
import kotlinx.coroutines.delay
|
|
|
import kotlinx.coroutines.flow.catch
|
|
import kotlinx.coroutines.flow.catch
|
|
|
import kotlinx.coroutines.flow.conflate
|
|
import kotlinx.coroutines.flow.conflate
|
|
|
|
|
+import kotlinx.coroutines.flow.distinctUntilChanged
|
|
|
import kotlinx.coroutines.flow.flowOn
|
|
import kotlinx.coroutines.flow.flowOn
|
|
|
import kotlinx.coroutines.flow.map
|
|
import kotlinx.coroutines.flow.map
|
|
|
import kotlinx.coroutines.isActive
|
|
import kotlinx.coroutines.isActive
|
|
@@ -98,7 +102,6 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
|
|
|
override var sortAscending = true
|
|
override var sortAscending = true
|
|
|
private set
|
|
private set
|
|
|
private var snackBar: Snackbar? = null
|
|
private var snackBar: Snackbar? = null
|
|
|
- private var isPaused = false
|
|
|
|
|
private val qrResult = registerForActivityResult(QrCodeResult()) {
|
|
private val qrResult = registerForActivityResult(QrCodeResult()) {
|
|
|
it ?: return@registerForActivityResult
|
|
it ?: return@registerForActivityResult
|
|
|
showDialogFragment(ImportBookSourceDialog(it))
|
|
showDialogFragment(ImportBookSourceDialog(it))
|
|
@@ -125,6 +128,19 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ private val groupMenuLifecycleOwner = object : LifecycleOwner {
|
|
|
|
|
+ private val registry = LifecycleRegistry(this)
|
|
|
|
|
+ override val lifecycle: Lifecycle get() = registry
|
|
|
|
|
+
|
|
|
|
|
+ fun onMenuOpened() {
|
|
|
|
|
+ registry.handleLifecycleEvent(Lifecycle.Event.ON_START)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ fun onMenuClosed() {
|
|
|
|
|
+ registry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
|
|
initRecyclerView()
|
|
initRecyclerView()
|
|
@@ -372,12 +388,17 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
|
|
|
|
|
|
|
|
private fun initLiveDataGroup() {
|
|
private fun initLiveDataGroup() {
|
|
|
lifecycleScope.launch {
|
|
lifecycleScope.launch {
|
|
|
- appDb.bookSourceDao.flowGroups().conflate().collect {
|
|
|
|
|
- groups.clear()
|
|
|
|
|
- groups.addAll(it)
|
|
|
|
|
- upGroupMenu()
|
|
|
|
|
- delay(500)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ appDb.bookSourceDao.flowGroups()
|
|
|
|
|
+ .flowWithLifecycle(lifecycle)
|
|
|
|
|
+ .flowWithLifecycleFirst(groupMenuLifecycleOwner.lifecycle)
|
|
|
|
|
+ .conflate()
|
|
|
|
|
+ .distinctUntilChanged()
|
|
|
|
|
+ .collect {
|
|
|
|
|
+ groups.clear()
|
|
|
|
|
+ groups.addAll(it)
|
|
|
|
|
+ upGroupMenu()
|
|
|
|
|
+ delay(500)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -400,6 +421,20 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
|
|
|
|
|
+ if (menu === groupMenu) {
|
|
|
|
|
+ groupMenuLifecycleOwner.onMenuOpened()
|
|
|
|
|
+ }
|
|
|
|
|
+ return super.onMenuOpened(featureId, menu)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ override fun onPanelClosed(featureId: Int, menu: Menu) {
|
|
|
|
|
+ super.onPanelClosed(featureId, menu)
|
|
|
|
|
+ if (menu === groupMenu) {
|
|
|
|
|
+ groupMenuLifecycleOwner.onMenuClosed()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private fun initSelectActionBar() {
|
|
private fun initSelectActionBar() {
|
|
|
binding.selectActionBar.setMainActionText(R.string.delete)
|
|
binding.selectActionBar.setMainActionText(R.string.delete)
|
|
|
binding.selectActionBar.inflateMenu(R.menu.book_source_sel)
|
|
binding.selectActionBar.inflateMenu(R.menu.book_source_sel)
|
|
@@ -637,16 +672,6 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- override fun onPause() {
|
|
|
|
|
- super.onPause()
|
|
|
|
|
- isPaused = true
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- override fun onResume() {
|
|
|
|
|
- super.onResume()
|
|
|
|
|
- isPaused = false
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
override fun upCountView() {
|
|
override fun upCountView() {
|
|
|
binding.selectActionBar
|
|
binding.selectActionBar
|
|
|
.upCountView(adapter.selection.size, adapter.itemCount)
|
|
.upCountView(adapter.selection.size, adapter.itemCount)
|