Hide reading fab if history is empty
This commit is contained in:
@@ -38,6 +38,9 @@ abstract class HistoryDao {
|
|||||||
@Query("SELECT * FROM history WHERE manga_id = :id")
|
@Query("SELECT * FROM history WHERE manga_id = :id")
|
||||||
abstract fun observe(id: Long): Flow<HistoryEntity?>
|
abstract fun observe(id: Long): Flow<HistoryEntity?>
|
||||||
|
|
||||||
|
@Query("SELECT COUNT(*) FROM history")
|
||||||
|
abstract fun observeCount(): Flow<Int>
|
||||||
|
|
||||||
@Query("DELETE FROM history")
|
@Query("DELETE FROM history")
|
||||||
abstract suspend fun clear()
|
abstract suspend fun clear()
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.koitharu.kotatsu.history.domain
|
|||||||
|
|
||||||
import androidx.room.withTransaction
|
import androidx.room.withTransaction
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import org.koitharu.kotatsu.core.db.MangaDatabase
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
import org.koitharu.kotatsu.core.db.entity.MangaEntity
|
import org.koitharu.kotatsu.core.db.entity.MangaEntity
|
||||||
@@ -26,6 +27,11 @@ class HistoryRepository(
|
|||||||
return entities.map { it.manga.toManga(it.tags.mapToSet(TagEntity::toMangaTag)) }
|
return entities.map { it.manga.toManga(it.tags.mapToSet(TagEntity::toMangaTag)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getLastOrNull(): Manga? {
|
||||||
|
val entity = db.historyDao.findAll(0, 1).firstOrNull() ?: return null
|
||||||
|
return entity.manga.toManga(entity.tags.mapToSet { it.toMangaTag() })
|
||||||
|
}
|
||||||
|
|
||||||
fun observeAll(): Flow<List<Manga>> {
|
fun observeAll(): Flow<List<Manga>> {
|
||||||
return db.historyDao.observeAll().mapItems {
|
return db.historyDao.observeAll().mapItems {
|
||||||
it.manga.toManga(it.tags.mapToSet(TagEntity::toMangaTag))
|
it.manga.toManga(it.tags.mapToSet(TagEntity::toMangaTag))
|
||||||
@@ -47,6 +53,12 @@ class HistoryRepository(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun observeHasItems(): Flow<Boolean> {
|
||||||
|
return db.historyDao.observeCount()
|
||||||
|
.map { it > 0 }
|
||||||
|
.distinctUntilChanged()
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun addOrUpdate(manga: Manga, chapterId: Long, page: Int, scroll: Int) {
|
suspend fun addOrUpdate(manga: Manga, chapterId: Long, page: Int, scroll: Int) {
|
||||||
if (manga.isNsfw && settings.isHistoryExcludeNsfw) {
|
if (manga.isNsfw && settings.isHistoryExcludeNsfw) {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -11,16 +11,12 @@ import androidx.appcompat.app.ActionBarDrawerToggle
|
|||||||
import androidx.appcompat.view.ActionMode
|
import androidx.appcompat.view.ActionMode
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
import androidx.core.view.GravityCompat
|
import androidx.core.view.*
|
||||||
import androidx.core.view.ViewCompat
|
|
||||||
import androidx.core.view.updateLayoutParams
|
|
||||||
import androidx.core.view.updatePadding
|
|
||||||
import androidx.drawerlayout.widget.DrawerLayout
|
import androidx.drawerlayout.widget.DrawerLayout
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentTransaction
|
import androidx.fragment.app.FragmentTransaction
|
||||||
import androidx.fragment.app.commit
|
import androidx.fragment.app.commit
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.swiperefreshlayout.widget.CircularProgressDrawable
|
|
||||||
import com.google.android.material.appbar.AppBarLayout
|
import com.google.android.material.appbar.AppBarLayout
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.google.android.material.navigation.NavigationView
|
import com.google.android.material.navigation.NavigationView
|
||||||
@@ -135,6 +131,7 @@ class MainActivity :
|
|||||||
viewModel.onOpenReader.observe(this, this::onOpenReader)
|
viewModel.onOpenReader.observe(this, this::onOpenReader)
|
||||||
viewModel.onError.observe(this, this::onError)
|
viewModel.onError.observe(this, this::onError)
|
||||||
viewModel.isLoading.observe(this, this::onLoadingStateChanged)
|
viewModel.isLoading.observe(this, this::onLoadingStateChanged)
|
||||||
|
viewModel.isResumeEnabled.observe(this, this::onResumeEnabledChanged)
|
||||||
viewModel.remoteSources.observe(this, this::updateSideMenu)
|
viewModel.remoteSources.observe(this, this::updateSideMenu)
|
||||||
viewModel.isSuggestionsEnabled.observe(this, this::setSuggestionsEnabled)
|
viewModel.isSuggestionsEnabled.observe(this, this::setSuggestionsEnabled)
|
||||||
}
|
}
|
||||||
@@ -313,14 +310,17 @@ class MainActivity :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun onError(e: Throwable) {
|
private fun onError(e: Throwable) {
|
||||||
Snackbar.make(binding.container, e.getDisplayMessage(resources), Snackbar.LENGTH_SHORT)
|
Snackbar.make(binding.container, e.getDisplayMessage(resources), Snackbar.LENGTH_SHORT).show()
|
||||||
.show()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onLoadingStateChanged(isLoading: Boolean) {
|
private fun onLoadingStateChanged(isLoading: Boolean) {
|
||||||
binding.fab.isEnabled = !isLoading
|
binding.fab.isEnabled = !isLoading
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun onResumeEnabledChanged(isEnabled: Boolean) {
|
||||||
|
adjustFabVisibility(isResumeEnabled = isEnabled)
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateSideMenu(remoteSources: List<MangaSource>) {
|
private fun updateSideMenu(remoteSources: List<MangaSource>) {
|
||||||
val submenu = binding.navigationView.menu.findItem(R.id.nav_remote_sources).subMenu
|
val submenu = binding.navigationView.menu.findItem(R.id.nav_remote_sources).subMenu
|
||||||
submenu.removeGroup(R.id.group_remote_sources)
|
submenu.removeGroup(R.id.group_remote_sources)
|
||||||
@@ -397,10 +397,20 @@ class MainActivity :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun adjustFabVisibility(
|
private fun adjustFabVisibility(
|
||||||
|
isResumeEnabled: Boolean = viewModel.isResumeEnabled.value == true,
|
||||||
topFragment: Fragment? = supportFragmentManager.findFragmentByTag(TAG_PRIMARY),
|
topFragment: Fragment? = supportFragmentManager.findFragmentByTag(TAG_PRIMARY),
|
||||||
isSearchOpened: Boolean = supportFragmentManager.findFragmentByTag(TAG_SEARCH)?.isVisible == true,
|
isSearchOpened: Boolean = supportFragmentManager.findFragmentByTag(TAG_SEARCH)?.isVisible == true,
|
||||||
) {
|
) {
|
||||||
if (!isSearchOpened && topFragment is HistoryListFragment) binding.fab.show() else binding.fab.hide()
|
val fab = binding.fab
|
||||||
|
if (isResumeEnabled && !isSearchOpened && topFragment is HistoryListFragment) {
|
||||||
|
if (!fab.isVisible) {
|
||||||
|
fab.show()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (fab.isVisible) {
|
||||||
|
fab.hide()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun adjustDrawerLock() {
|
private fun adjustDrawerLock() {
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ class MainViewModel(
|
|||||||
.map { settings.isSuggestionsEnabled }
|
.map { settings.isSuggestionsEnabled }
|
||||||
.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default)
|
.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default)
|
||||||
|
|
||||||
|
val isResumeEnabled = historyRepository
|
||||||
|
.observeHasItems()
|
||||||
|
.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default)
|
||||||
|
|
||||||
val remoteSources = settings.observe()
|
val remoteSources = settings.observe()
|
||||||
.filter { it == AppSettings.KEY_SOURCES_ORDER || it == AppSettings.KEY_SOURCES_HIDDEN }
|
.filter { it == AppSettings.KEY_SOURCES_ORDER || it == AppSettings.KEY_SOURCES_HIDDEN }
|
||||||
.onStart { emit("") }
|
.onStart { emit("") }
|
||||||
@@ -35,9 +39,8 @@ class MainViewModel(
|
|||||||
|
|
||||||
fun openLastReader() {
|
fun openLastReader() {
|
||||||
launchLoadingJob {
|
launchLoadingJob {
|
||||||
val manga = historyRepository.getList(0, 1).firstOrNull()
|
val manga = historyRepository.getLastOrNull() ?: throw EmptyHistoryException()
|
||||||
?: throw EmptyHistoryException()
|
|
||||||
onOpenReader.call(manga)
|
onOpenReader.call(manga)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user