From 7262b403f029ff4ff7a08b6a9ab1d0f615b9572d Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 10 Apr 2022 10:25:11 +0300 Subject: [PATCH] Hide reading fab if history is empty --- .../kotatsu/history/data/HistoryDao.kt | 3 +++ .../history/domain/HistoryRepository.kt | 12 +++++++++ .../koitharu/kotatsu/main/ui/MainActivity.kt | 26 +++++++++++++------ .../koitharu/kotatsu/main/ui/MainViewModel.kt | 9 ++++--- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/history/data/HistoryDao.kt b/app/src/main/java/org/koitharu/kotatsu/history/data/HistoryDao.kt index a2527f59e..062e8d898 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/data/HistoryDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/data/HistoryDao.kt @@ -38,6 +38,9 @@ abstract class HistoryDao { @Query("SELECT * FROM history WHERE manga_id = :id") abstract fun observe(id: Long): Flow + @Query("SELECT COUNT(*) FROM history") + abstract fun observeCount(): Flow + @Query("DELETE FROM history") abstract suspend fun clear() diff --git a/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt b/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt index 99fa176f4..0701dafd0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/domain/HistoryRepository.kt @@ -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> { return db.historyDao.observeAll().mapItems { it.manga.toManga(it.tags.mapToSet(TagEntity::toMangaTag)) @@ -47,6 +53,12 @@ class HistoryRepository( } } + fun observeHasItems(): Flow { + 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 diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index fe5dce1d5..29f0c01ac 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -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) { 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() { diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt index a3fe2b263..f2b98d7e0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainViewModel.kt @@ -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) } } -} +} \ No newline at end of file