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