From a73d3d375a3e94d19ea577ed76dce0a4d2e787f0 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Fri, 1 Jul 2022 22:05:30 +0300 Subject: [PATCH] Unregistering scrobbler --- .../kotatsu/details/ui/DetailsViewModel.kt | 8 +++++ .../scrobbling/ScrobblingInfoBottomSheet.kt | 35 ++++++++++++++----- .../kotatsu/scrobbling/data/ScrobblingDao.kt | 3 ++ .../kotatsu/scrobbling/domain/Scrobbler.kt | 2 ++ .../shikimori/data/ShikimoriRepository.kt | 4 +++ .../shikimori/domain/ShikimoriScrobbler.kt | 4 +++ app/src/main/res/layout/sheet_scrobbling.xml | 7 ++-- app/src/main/res/menu/opt_scrobbling.xml | 13 +++++++ 8 files changed, 64 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/menu/opt_scrobbling.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 42e0ec024..1ef416990 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -207,6 +207,14 @@ class DetailsViewModel( } } + fun unregisterScrobbling() { + launchJob(Dispatchers.Default) { + scrobbler.unregisterScrobbling( + mangaId = delegate.mangaId + ) + } + } + private fun doLoad() = launchLoadingJob(Dispatchers.Default) { delegate.doLoad() } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt index dd68d16ab..3ab49fcfe 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/scrobbling/ScrobblingInfoBottomSheet.kt @@ -5,11 +5,13 @@ import android.content.Intent import android.os.Bundle import android.text.method.LinkMovementMethod import android.view.LayoutInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.AdapterView import android.widget.RatingBar import android.widget.Toast +import androidx.appcompat.widget.PopupMenu import androidx.core.net.toUri import androidx.fragment.app.FragmentManager import coil.ImageLoader @@ -31,7 +33,8 @@ class ScrobblingInfoBottomSheet : BaseBottomSheet(), AdapterView.OnItemSelectedListener, RatingBar.OnRatingBarChangeListener, - View.OnClickListener { + View.OnClickListener, + PopupMenu.OnMenuItemClickListener { private val viewModel by sharedViewModel() private val coil by inject(mode = LazyThreadSafetyMode.NONE) @@ -52,6 +55,12 @@ class ScrobblingInfoBottomSheet : binding.buttonOpen.setOnClickListener(this) binding.imageViewCover.setOnClickListener(this) binding.textViewDescription.movementMethod = LinkMovementMethod.getInstance() + + val popupMenu = PopupMenu(view.context, binding.buttonOpen) + popupMenu.inflate(R.menu.opt_scrobbling) + popupMenu.setOnMenuItemClickListener(this) + + binding.buttonOpen.setOnClickListener { popupMenu.show() } } override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { @@ -74,13 +83,6 @@ class ScrobblingInfoBottomSheet : override fun onClick(v: View) { when (v.id) { - R.id.button_open -> { - val url = viewModel.scrobblingInfo.value?.externalUrl ?: return - val intent = Intent(Intent.ACTION_VIEW, url.toUri()) - startActivity( - Intent.createChooser(intent, getString(R.string.open_in_browser)) - ) - } R.id.imageView_cover -> { val coverUrl = viewModel.scrobblingInfo.value?.coverUrl ?: return val options = ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.width, v.height) @@ -116,4 +118,21 @@ class ScrobblingInfoBottomSheet : fun show(fm: FragmentManager) = ScrobblingInfoBottomSheet().show(fm, TAG) } + + override fun onMenuItemClick(item: MenuItem?): Boolean { + when (item?.itemId) { + R.id.action_browser -> { + val url = viewModel.scrobblingInfo.value?.externalUrl ?: return false + val intent = Intent(Intent.ACTION_VIEW, url.toUri()) + startActivity( + Intent.createChooser(intent, getString(R.string.open_in_browser)) + ) + } + R.id.action_unregister -> { + dismiss() + viewModel.unregisterScrobbling() + } + } + return true + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblingDao.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblingDao.kt index 38b798b94..72cf83031 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblingDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/data/ScrobblingDao.kt @@ -17,4 +17,7 @@ abstract class ScrobblingDao { @Update abstract suspend fun update(entity: ScrobblingEntity) + + @Query("DELETE FROM scrobblings WHERE scrobbler = :scrobbler AND manga_id = :mangaId") + abstract suspend fun delete(scrobbler: Int, mangaId: Long) } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/domain/Scrobbler.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/domain/Scrobbler.kt index 5f7e42cc8..2fe44e39c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/domain/Scrobbler.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/domain/Scrobbler.kt @@ -41,6 +41,8 @@ abstract class Scrobbler( .map { it?.toScrobblingInfo(mangaId) } } + abstract suspend fun unregisterScrobbling(mangaId: Long) + protected abstract suspend fun getMangaInfo(id: Long): ScrobblerMangaInfo private suspend fun ScrobblingEntity.toScrobblingInfo(mangaId: Long): ScrobblingInfo? { diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt index 4907916fe..119d33637 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/data/ShikimoriRepository.kt @@ -69,6 +69,10 @@ class ShikimoriRepository( return storage.user } + suspend fun unregister(mangaId: Long) { + return db.scrobblingDao.delete(ScrobblerService.SHIKIMORI.id, mangaId) + } + fun logout() { storage.clear() } diff --git a/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt b/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt index 4bdb7db1f..72f9d5cbf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt +++ b/app/src/main/java/org/koitharu/kotatsu/scrobbling/shikimori/domain/ShikimoriScrobbler.kt @@ -58,6 +58,10 @@ class ShikimoriScrobbler( ) } + override suspend fun unregisterScrobbling(mangaId: Long) { + repository.unregister(mangaId) + } + override suspend fun getMangaInfo(id: Long): ScrobblerMangaInfo { return repository.getMangaInfo(id) } diff --git a/app/src/main/res/layout/sheet_scrobbling.xml b/app/src/main/res/layout/sheet_scrobbling.xml index 2894ecb5d..24589e88d 100644 --- a/app/src/main/res/layout/sheet_scrobbling.xml +++ b/app/src/main/res/layout/sheet_scrobbling.xml @@ -45,14 +45,13 @@ diff --git a/app/src/main/res/menu/opt_scrobbling.xml b/app/src/main/res/menu/opt_scrobbling.xml new file mode 100644 index 000000000..90de1379e --- /dev/null +++ b/app/src/main/res/menu/opt_scrobbling.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file