diff --git a/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt b/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt index acfd0cdb..40fbd116 100644 --- a/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt +++ b/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt @@ -19,7 +19,7 @@ fun updateProgress(media: Media, number: String) { if (Anilist.userid != null) { CoroutineScope(Dispatchers.IO).launch { val a = number.toFloatOrNull()?.toInt() - if ((a ?: 0) > (media.userProgress ?: 0)) { + if ((a ?: 0) > (media.userProgress ?: -1)) { Anilist.mutation.editList( media.id, a, diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt index 919da868..16f9f51a 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -296,6 +296,52 @@ class AnilistQueries { return media } + fun userMediaDetails(media: Media): Media { + val query = + """{Media(id:${media.id}){id mediaListEntry{id status progress private repeat customLists updatedAt startedAt{year month day}completedAt{year month day}}isFavourite idMal}}""" + runBlocking { + val anilist = async { + var response = executeQuery(query, force = true, show = true) + if (response != null) { + fun parse() { + val fetchedMedia = response?.data?.media ?: return + + if (fetchedMedia.mediaListEntry != null) { + fetchedMedia.mediaListEntry?.apply { + media.userProgress = progress + media.isListPrivate = private ?: false + media.userListId = id + media.userStatus = status?.toString() + media.inCustomListsOf = customLists?.toMutableMap() + media.userRepeat = repeat ?: 0 + media.userUpdatedAt = updatedAt?.toString()?.toLong()?.times(1000) + media.userCompletedAt = completedAt ?: FuzzyDate() + media.userStartedAt = startedAt ?: FuzzyDate() + } + } else { + media.isListPrivate = false + media.userStatus = null + media.userListId = null + media.userProgress = null + media.userRepeat = 0 + media.userUpdatedAt = null + media.userCompletedAt = FuzzyDate() + media.userStartedAt = FuzzyDate() + } + } + + if (response.data?.media != null) parse() + else { + response = executeQuery(query, force = true, useToken = false) + if (response?.data?.media != null) parse() + } + } + } + awaitAll(anilist) + } + return media + } + suspend fun continueMedia(type: String, planned: Boolean = false): ArrayList { val returnArray = arrayListOf() val map = mutableMapOf() diff --git a/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt index fe5c0c93..0430709b 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaListDialogFragment.kt @@ -254,20 +254,28 @@ class MediaListDialogFragment : BottomSheetDialogFragment() { } binding.mediaListDelete.setOnClickListener { - val id = media!!.userListId - if (id != null) { - scope.launch { - withContext(Dispatchers.IO) { - Anilist.mutation.deleteList(id) + var id = media!!.userListId + scope.launch { + withContext(Dispatchers.IO) { + if (id != null) { + Anilist.mutation.deleteList(id!!) MAL.query.deleteList(media?.anime != null, media?.idMAL) + } else { + val profile = Anilist.query.userMediaDetails(media!!) + profile.userListId?.let { listId -> + id = listId + Anilist.mutation.deleteList(listId) + MAL.query.deleteList(media?.anime != null, media?.idMAL) + } } - Refresh.all() - snackString(getString(R.string.deleted_from_list)) - dismissAllowingStateLoss() } + } + if (id != null) { + Refresh.all() + snackString(getString(R.string.deleted_from_list)) + dismissAllowingStateLoss() } else { snackString(getString(R.string.no_list_id)) - Refresh.all() } } } diff --git a/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt index 185e4916..982eca8e 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaListDialogSmallFragment.kt @@ -59,12 +59,12 @@ class MediaListDialogSmallFragment : BottomSheetDialogFragment() { binding.mediaListContainer.updateLayoutParams { bottomMargin += navBarHeight } val scope = viewLifecycleOwner.lifecycleScope binding.mediaListDelete.setOnClickListener { - val id = media.userListId - if (id != null) { - viewLifecycleOwner.lifecycleScope.launch { - withContext(Dispatchers.IO) { + var id = media.userListId + viewLifecycleOwner.lifecycleScope.launch { + withContext(Dispatchers.IO) { + if (id != null) { try { - Anilist.mutation.deleteList(id) + Anilist.mutation.deleteList(id!!) MAL.query.deleteList(media.anime != null, media.idMAL) } catch (e: Exception) { withContext(Dispatchers.Main) { @@ -72,16 +72,24 @@ class MediaListDialogSmallFragment : BottomSheetDialogFragment() { } return@withContext } + } else { + val profile = Anilist.query.userMediaDetails(media) + profile.userListId?.let { listId -> + id = listId + Anilist.mutation.deleteList(listId) + MAL.query.deleteList(media.anime != null, media.idMAL) + } } - withContext(Dispatchers.Main) { + } + withContext(Dispatchers.Main) { + if (id != null) { Refresh.all() snackString(getString(R.string.deleted_from_list)) dismissAllowingStateLoss() + } else { + snackString(getString(R.string.no_list_id)) } } - } else { - snackString(getString(R.string.no_list_id)) - Refresh.all() } } diff --git a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt index 2ee044b2..7ae06a1a 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -1854,17 +1854,23 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL private fun updateAniProgress() { val incognito: Boolean = PrefManager.getVal(PrefName.Incognito) - if (!incognito && exoPlayer.currentPosition / episodeLength > PrefManager.getVal( - PrefName.WatchPercentage - ) && Anilist.userid != null + val episodeEnd = exoPlayer.currentPosition / episodeLength > PrefManager.getVal( + PrefName.WatchPercentage + ) + val episode0 = currentEpisodeIndex == 0 && PrefManager.getVal(PrefName.ChapterZeroPlayer) + if (!incognito && (episodeEnd || episode0) && Anilist.userid != null ) if (PrefManager.getCustomVal( "${media.id}_save_progress", true ) && (if (media.isAdult) PrefManager.getVal(PrefName.UpdateForHPlayer) else true) ) { - media.anime!!.selectedEpisode?.apply { - updateProgress(media, this) + if (episode0) { + updateProgress(media, "0") + } else { + media.anime!!.selectedEpisode?.apply { + updateProgress(media, this) + } } } } diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt index 1265d8be..157c6146 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt @@ -151,7 +151,21 @@ class MangaReaderActivity : AppCompatActivity() { defaultSettings = loadReaderSettings("reader_settings") ?: defaultSettings onBackPressedDispatcher.addCallback(this) { - progress { finish() } + val chapter = (MangaNameAdapter.findChapterNumber(media.manga!!.selectedChapter!!) + ?.minus(1L) ?: 0).toString() + if (chapter == "0.0" && PrefManager.getVal(PrefName.ChapterZeroReader) + // Not asking individually or incognito + && !showProgressDialog && !PrefManager.getVal(PrefName.Incognito) + // Not ...opted out ...already? Somehow? + && PrefManager.getCustomVal("${media.id}_save_progress", true) + // Allowing Doujin updates or not one + && if (media.isAdult) PrefManager.getVal(PrefName.UpdateForHReader) else true + ) { + updateProgress(media, chapter) + finish() + } else { + progress { finish() } + } } controllerDuration = (PrefManager.getVal(PrefName.AnimationSpeed) * 200).toLong() diff --git a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt index 7cb5521b..5faccc17 100644 --- a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt @@ -167,6 +167,14 @@ class PlayerSettingsActivity : AppCompatActivity() { PrefManager.getVal(PrefName.AskIndividualPlayer) binding.playerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.AskIndividualPlayer, isChecked) + binding.playerSettingsAskChapterZero.isEnabled = !isChecked + } + binding.playerSettingsAskChapterZero.isChecked = + PrefManager.getVal(PrefName.ChapterZeroPlayer) + binding.playerSettingsAskChapterZero.isEnabled = + !PrefManager.getVal(PrefName.AskIndividualPlayer) + binding.playerSettingsAskChapterZero.setOnCheckedChangeListener { _, isChecked -> + PrefManager.setVal(PrefName.ChapterZeroPlayer, isChecked) } binding.playerSettingsAskUpdateHentai.isChecked = PrefManager.getVal(PrefName.UpdateForHPlayer) diff --git a/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt index 8cbdac58..911b49de 100644 --- a/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt @@ -355,6 +355,14 @@ class ReaderSettingsActivity : AppCompatActivity() { PrefManager.getVal(PrefName.AskIndividualReader) binding.readerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.AskIndividualReader, isChecked) + binding.readerSettingsAskChapterZero.isEnabled = !isChecked + } + binding.readerSettingsAskChapterZero.isChecked = + PrefManager.getVal(PrefName.ChapterZeroReader) + binding.readerSettingsAskChapterZero.isEnabled = + !PrefManager.getVal(PrefName.AskIndividualReader) + binding.readerSettingsAskChapterZero.setOnCheckedChangeListener { _, isChecked -> + PrefManager.setVal(PrefName.ChapterZeroReader, isChecked) } binding.readerSettingsAskUpdateDoujins.isChecked = PrefManager.getVal(PrefName.UpdateForHReader) diff --git a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt index 14d83caf..a429392b 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -95,6 +95,7 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files AutoPlay(Pref(Location.Player, Boolean::class, true)), AutoSkipFiller(Pref(Location.Player, Boolean::class, false)), AskIndividualPlayer(Pref(Location.Player, Boolean::class, true)), + ChapterZeroPlayer(Pref(Location.Player, Boolean::class, true)), UpdateForHPlayer(Pref(Location.Player, Boolean::class, false)), WatchPercentage(Pref(Location.Player, Float::class, 0.8f)), AlwaysContinue(Pref(Location.Player, Boolean::class, true)), @@ -114,6 +115,7 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files ShowSystemBars(Pref(Location.Reader, Boolean::class, false)), AutoDetectWebtoon(Pref(Location.Reader, Boolean::class, true)), AskIndividualReader(Pref(Location.Reader, Boolean::class, true)), + ChapterZeroReader(Pref(Location.Reader, Boolean::class, true)), UpdateForHReader(Pref(Location.Reader, Boolean::class, false)), Direction(Pref(Location.Reader, Int::class, 0)), LayoutReader(Pref(Location.Reader, Int::class, 2)), diff --git a/app/src/main/res/drawable/ic_round_early_bird_special.xml b/app/src/main/res/drawable/ic_round_early_bird_special.xml new file mode 100644 index 00000000..4aa4292f --- /dev/null +++ b/app/src/main/res/drawable/ic_round_early_bird_special.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_player_settings.xml b/app/src/main/res/layout/activity_player_settings.xml index 8a6fd187..d9486c31 100644 --- a/app/src/main/res/layout/activity_player_settings.xml +++ b/app/src/main/res/layout/activity_player_settings.xml @@ -705,6 +705,41 @@ android:text="@string/ask_update_progress_info_ep" android:textSize="14sp" /> + + + + + + + + + + + + Ask for each Manga \"Individually\" Turning off will always automatically update progress when the episode is watched. Turning off will always automatically update progress when the chapter is read. + Update Progress for Chapter 0 + Turning on will add newly started items to Anilist with progress set to chapter 0. Update Progress for Hentai Update Progress for Doujins very bold of you sar @@ -434,7 +436,7 @@ Couldn\'t find episode : %1$s List Updated Deleted from List - No List ID found, reloading… + No List ID found… Checking for Update Don\'t show again for version %1$s No Update Found