diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouritesDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouritesDao.kt index 1ad93fbdb..52f6018b4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouritesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouritesDao.kt @@ -37,6 +37,9 @@ abstract class FavouritesDao { @Update abstract suspend fun update(favourite: FavouriteEntity): Int + @Query("DELETE FROM favourites WHERE manga_id = :mangaId") + abstract suspend fun delete(mangaId: Long) + @Query("DELETE FROM favourites WHERE manga_id = :mangaId AND category_id = :categoryId") abstract suspend fun delete(categoryId: Long, mangaId: Long) diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt index 8d3bf12b5..f8a5bb3ff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt @@ -93,6 +93,11 @@ class FavouritesRepository(private val db: MangaDatabase) { notifyFavouritesChanged(manga.id) } + suspend fun removeFromFavourites(manga: Manga) { + db.favouritesDao.delete(manga.id) + notifyFavouritesChanged(manga.id) + } + companion object { private val listeners = ArraySet() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt index 28908bbad..3cf72c697 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt @@ -28,7 +28,7 @@ class MangaListDetailsHolder( imageRequest?.dispose() textView_title.text = data.title textView_subtitle.textAndVisible = data.altTitle - imageView_cover.newImageRequest(data.coverUrl) + imageRequest = imageView_cover.newImageRequest(data.coverUrl) .placeholder(R.drawable.ic_placeholder) .fallback(R.drawable.ic_placeholder) .error(R.drawable.ic_placeholder) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListFragment.kt index 025b0dee7..a9a2d9816 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListFragment.kt @@ -1,33 +1,54 @@ package org.koitharu.kotatsu.ui.list.favourites +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import kotlinx.android.synthetic.main.fragment_list.* import moxy.ktx.moxyPresenter +import org.koin.android.ext.android.get import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.ui.list.MangaListFragment import org.koitharu.kotatsu.ui.list.MangaListView import org.koitharu.kotatsu.utils.ext.withArgs -class FavouritesListFragment : MangaListFragment(), - MangaListView { +class FavouritesListFragment : MangaListFragment(), MangaListView { - private val presenter by moxyPresenter(factory = ::FavouritesListPresenter) + private val presenter by moxyPresenter { + FavouritesListPresenter(categoryId, get()) + } private val categoryId: Long get() = arguments?.getLong(ARG_CATEGORY_ID) ?: 0L override fun onRequestMoreItems(offset: Int) { - presenter.loadList(categoryId, offset) + presenter.loadList(offset) } override fun setUpEmptyListHolder() { - textView_holder.setText(if (categoryId == 0L) { - R.string.you_have_not_favourites_yet - } else { - R.string.favourites_category_empty - }) + textView_holder.setText( + if (categoryId == 0L) { + R.string.you_have_not_favourites_yet + } else { + R.string.favourites_category_empty + } + ) textView_holder.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0) } + override fun onCreatePopupMenu(inflater: MenuInflater, menu: Menu, data: Manga) { + super.onCreatePopupMenu(inflater, menu, data) + inflater.inflate(R.menu.popup_favourites, menu) + } + + override fun onPopupMenuItemSelected(item: MenuItem, data: Manga) = when(item.itemId) { + R.id.action_remove -> { + presenter.removeFromFavourites(data) + true + } + else -> super.onPopupMenuItemSelected(item, data) + } + companion object { private const val ARG_CATEGORY_ID = "category_id" diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt index 17ef27b1e..1cc777a00 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt @@ -4,18 +4,19 @@ import kotlinx.coroutines.CancellationException import kotlinx.coroutines.launch import moxy.InjectViewState import moxy.presenterScope -import org.koin.core.component.get import org.koitharu.kotatsu.BuildConfig +import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.domain.favourites.FavouritesRepository import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.list.MangaListView @InjectViewState -class FavouritesListPresenter : BasePresenter>() { +class FavouritesListPresenter( + private val categoryId: Long, + private val repository: FavouritesRepository +) : BasePresenter>() { - private val repository = get() - - fun loadList(categoryId: Long, offset: Int) { + fun loadList(offset: Int) { presenterScope.launch { viewState.onLoadingStateChanged(true) try { @@ -44,4 +45,15 @@ class FavouritesListPresenter : BasePresenter>() { } } } + + fun removeFromFavourites(manga: Manga) { + launchJob { + if (categoryId == 0L) { + repository.removeFromFavourites(manga) + } else { + repository.removeFromCategory(manga, categoryId) + } + viewState.onItemRemoved(manga) + } + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CollectionExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CollectionExt.kt index 29ff62f07..b7a5dc816 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CollectionExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CollectionExt.kt @@ -31,11 +31,7 @@ fun List.medianOrNull(): T? = when { } inline fun Collection.mapToSet(transform: (T) -> R): Set { - val destination = ArraySet(size) - for (item in this) { - destination.add(transform(item)) - } - return destination + return mapTo(ArraySet(size), transform) } inline fun Collection.mapNotNullToSet(transform: (T) -> R?): Set { diff --git a/app/src/main/res/menu/popup_favourites.xml b/app/src/main/res/menu/popup_favourites.xml new file mode 100644 index 000000000..42eebe5fb --- /dev/null +++ b/app/src/main/res/menu/popup_favourites.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file