From 745b349e5ea2fb2af68123b5819aaecc5baf5d2d Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 21 Jun 2023 15:27:20 +0300 Subject: [PATCH] Ability to remove item from updates --- .../kotatsu/tracker/data/TrackEntity.kt | 8 ++--- .../kotatsu/tracker/data/TracksDao.kt | 3 ++ .../tracker/domain/TrackingRepository.kt | 12 ++++++++ .../tracker/ui/updates/UpdatesFragment.kt | 21 ++++++++++++++ .../tracker/ui/updates/UpdatesViewModel.kt | 6 ++++ app/src/main/res/menu/mode_updates.xml | 29 +++++++++++++++++++ 6 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/menu/mode_updates.xml diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt index 52f7b8d18..cc98636f5 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TrackEntity.kt @@ -13,9 +13,9 @@ import org.koitharu.kotatsu.core.db.entity.MangaEntity entity = MangaEntity::class, parentColumns = ["manga_id"], childColumns = ["manga_id"], - onDelete = ForeignKey.CASCADE - ) - ] + onDelete = ForeignKey.CASCADE, + ), + ], ) class TrackEntity( @PrimaryKey(autoGenerate = false) @@ -27,4 +27,4 @@ class TrackEntity( @ColumnInfo(name = "last_check") val lastCheck: Long, @get:Deprecated(message = "Should not be used", level = DeprecationLevel.ERROR) @ColumnInfo(name = "last_notified_id") val lastNotifiedChapterId: Long -) \ No newline at end of file +) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt index bd9b03a83..4a9770fc8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/data/TracksDao.kt @@ -43,6 +43,9 @@ abstract class TracksDao { @Query("UPDATE tracks SET chapters_new = 0") abstract suspend fun clearCounters() + @Query("UPDATE tracks SET chapters_new = 0 WHERE manga_id = :mangaId") + abstract suspend fun clearCounter(mangaId: Long) + @Query("DELETE FROM tracks WHERE manga_id = :mangaId") abstract suspend fun delete(mangaId: Long) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt index 482b25fa1..f0a7b8968 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt @@ -126,6 +126,18 @@ class TrackingRepository @Inject constructor( } } + suspend fun clearUpdates(ids: Collection) { + when { + ids.isEmpty() -> return + ids.size == 1 -> db.tracksDao.clearCounter(ids.single()) + else -> db.withTransaction { + for (id in ids) { + db.tracksDao.clearCounter(id) + } + } + } + } + suspend fun syncWithHistory(manga: Manga, chapterId: Long) { val chapters = manga.chapters ?: return val chapterIndex = chapters.indexOfFirst { x -> x.id == chapterId } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesFragment.kt index 1b860a256..73f562648 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesFragment.kt @@ -1,7 +1,12 @@ package org.koitharu.kotatsu.tracker.ui.updates +import android.view.Menu +import android.view.MenuItem +import androidx.appcompat.view.ActionMode import androidx.fragment.app.viewModels import dagger.hilt.android.AndroidEntryPoint +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.ui.list.ListSelectionController import org.koitharu.kotatsu.list.ui.MangaListFragment @AndroidEntryPoint @@ -12,6 +17,22 @@ class UpdatesFragment : MangaListFragment() { override fun onScrolledToEnd() = Unit + override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean { + mode.menuInflater.inflate(R.menu.mode_updates, menu) + return super.onCreateActionMode(controller, mode, menu) + } + + override fun onActionItemClicked(controller: ListSelectionController, mode: ActionMode, item: MenuItem): Boolean { + return when (item.itemId) { + R.id.action_remove -> { + viewModel.remove(controller.snapshot()) + true + } + + else -> super.onActionItemClicked(controller, mode, item) + } + } + companion object { fun newInstance() = UpdatesFragment() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt index a8c437c6b..fedfd6bbe 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/tracker/ui/updates/UpdatesViewModel.kt @@ -59,4 +59,10 @@ class UpdatesViewModel @Inject constructor( override fun onRefresh() = Unit override fun onRetry() = Unit + + fun remove(ids: Set) { + launchJob(Dispatchers.Default) { + repository.clearUpdates(ids) + } + } } diff --git a/app/src/main/res/menu/mode_updates.xml b/app/src/main/res/menu/mode_updates.xml new file mode 100644 index 000000000..0c73ae23f --- /dev/null +++ b/app/src/main/res/menu/mode_updates.xml @@ -0,0 +1,29 @@ + + + + + + + + + + +