From e54cb3131e4bb978830bdef93d29e0df7e891f15 Mon Sep 17 00:00:00 2001 From: folke Date: Thu, 17 Aug 2023 14:58:46 +0200 Subject: [PATCH 1/3] feat(player): add intro skip for media controls --- .../presentation/more/settings/screen/SettingsPlayerScreen.kt | 1 + .../main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt | 3 +++ i18n/src/main/res/values/strings-aniyomi.xml | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt index c0e7c1aed9..a85b2db097 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsPlayerScreen.kt @@ -248,6 +248,7 @@ object SettingsPlayerScreen : SearchableSettings { Preference.PreferenceItem.SwitchPreference( pref = mediaChapterSeek, title = stringResource(R.string.pref_media_control_chapter_seeking), + subtitle = stringResource(R.string.pref_media_control_chapter_seeking_summary), ), Preference.PreferenceItem.InfoPreference( title = stringResource(R.string.pref_category_player_aniskip_info), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt index 6c68e6691f..c0dfd395c7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt @@ -497,6 +497,9 @@ class PlayerActivity : BaseActivity() { if (playerPreferences.mediaChapterSeek().get()) { if (player.loadChapters().isNotEmpty()) { MPVLib.command(arrayOf("add", "chapter", "1")) + } else { + doubleTapSeek(viewModel.getAnimeSkipIntroLength(), isDoubleTap = false) + playerControls.resetControlsFade() } } else { changeEpisode(viewModel.getAdjacentEpisodeId(previous = false)) diff --git a/i18n/src/main/res/values/strings-aniyomi.xml b/i18n/src/main/res/values/strings-aniyomi.xml index a375548fd8..f1e52b851f 100644 --- a/i18n/src/main/res/values/strings-aniyomi.xml +++ b/i18n/src/main/res/values/strings-aniyomi.xml @@ -106,7 +106,8 @@ 5s 3s Disable - Use media controls for chapter seeking + Seek chapters with media controls + When enabled, using next will invoke the skip intro button if no chapters are found Enable precise seeking When enabled, seeking will not focus on keyframes, leading to slower but precise seeking Show content in display cutout From b871a1136925dac9196d6741a1b8c260a00041e4 Mon Sep 17 00:00:00 2001 From: folke Date: Thu, 17 Aug 2023 15:50:39 +0200 Subject: [PATCH 2/3] Add animations and fix ktlint --- .../tachiyomi/ui/player/PlayerActivity.kt | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt index c0dfd395c7..6ad400971f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt @@ -487,6 +487,7 @@ class PlayerActivity : BaseActivity() { if (playerPreferences.mediaChapterSeek().get()) { if (player.loadChapters().isNotEmpty()) { MPVLib.command(arrayOf("add", "chapter", "-1")) + skipAnimation("Previous chapter", isForward = false) } } else { changeEpisode(viewModel.getAdjacentEpisodeId(previous = true)) @@ -497,9 +498,10 @@ class PlayerActivity : BaseActivity() { if (playerPreferences.mediaChapterSeek().get()) { if (player.loadChapters().isNotEmpty()) { MPVLib.command(arrayOf("add", "chapter", "1")) + skipAnimation("Next chapter", isForward = true) } else { - doubleTapSeek(viewModel.getAnimeSkipIntroLength(), isDoubleTap = false) - playerControls.resetControlsFade() + MPVLib.command(arrayOf("seek", viewModel.getAnimeSkipIntroLength().toString(), "relative+exact")) + skipAnimation("Skipped opening", isForward = true) } } else { changeEpisode(viewModel.getAdjacentEpisodeId(previous = false)) @@ -923,6 +925,33 @@ class PlayerActivity : BaseActivity() { MPVLib.command(arrayOf("seek", time.toString(), "relative+exact")) } + // Taken from util/AniSkipApi.kt + private fun skipAnimation(skipText: String, isForward: Boolean) { + binding.secondsView.binding.doubleTapSeconds.text = skipText + + binding.secondsView.updateLayoutParams { + rightToRight = if (isForward) ConstraintLayout.LayoutParams.PARENT_ID else ConstraintLayout.LayoutParams.UNSET + leftToLeft = if (isForward) ConstraintLayout.LayoutParams.UNSET else ConstraintLayout.LayoutParams.PARENT_ID + } + binding.secondsView.visibility = View.VISIBLE + binding.secondsView.isForward = isForward + + val bindingBg = if (isForward) binding.ffwdBg else binding.rewBg + + bindingBg.visibility = View.VISIBLE + bindingBg.animate().alpha(0.15f).setDuration(100).withEndAction { + binding.secondsView.animate().alpha(1f).setDuration(500).withEndAction { + binding.secondsView.animate().alpha(0f).setDuration(500).withEndAction { + bindingBg.animate().alpha(0f).setDuration(100).withEndAction { + bindingBg.visibility = View.GONE + binding.secondsView.visibility = View.GONE + binding.secondsView.alpha = 1f + } + } + } + }.start() + } + // Gesture Functions -- Start -- internal fun initSeek() { From ece8f162c8dce404483b4f0e719312ff7d67606d Mon Sep 17 00:00:00 2001 From: folke Date: Thu, 17 Aug 2023 17:23:12 +0200 Subject: [PATCH 3/3] Don't hardcode strings --- .../java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt | 6 +++--- i18n/src/main/res/values/strings-aniyomi.xml | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt index 6ad400971f..fb98fa5a65 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt @@ -487,7 +487,7 @@ class PlayerActivity : BaseActivity() { if (playerPreferences.mediaChapterSeek().get()) { if (player.loadChapters().isNotEmpty()) { MPVLib.command(arrayOf("add", "chapter", "-1")) - skipAnimation("Previous chapter", isForward = false) + skipAnimation(getString(R.string.go_to_previous_chapter), isForward = false) } } else { changeEpisode(viewModel.getAdjacentEpisodeId(previous = true)) @@ -498,10 +498,10 @@ class PlayerActivity : BaseActivity() { if (playerPreferences.mediaChapterSeek().get()) { if (player.loadChapters().isNotEmpty()) { MPVLib.command(arrayOf("add", "chapter", "1")) - skipAnimation("Next chapter", isForward = true) + skipAnimation(getString(R.string.go_to_next_chapter), isForward = true) } else { MPVLib.command(arrayOf("seek", viewModel.getAnimeSkipIntroLength().toString(), "relative+exact")) - skipAnimation("Skipped opening", isForward = true) + skipAnimation(getString(R.string.go_to_after_opening), isForward = true) } } else { changeEpisode(viewModel.getAdjacentEpisodeId(previous = false)) diff --git a/i18n/src/main/res/values/strings-aniyomi.xml b/i18n/src/main/res/values/strings-aniyomi.xml index f1e52b851f..931d57a45c 100644 --- a/i18n/src/main/res/values/strings-aniyomi.xml +++ b/i18n/src/main/res/values/strings-aniyomi.xml @@ -108,6 +108,9 @@ Disable Seek chapters with media controls When enabled, using next will invoke the skip intro button if no chapters are found + Next chapter + Previous chapter + Skipped opening Enable precise seeking When enabled, seeking will not focus on keyframes, leading to slower but precise seeking Show content in display cutout