From 31cc56aa80e05b115be60c9d77e1ec1cb1c4415c Mon Sep 17 00:00:00 2001 From: jradchaima Date: Thu, 13 Feb 2025 23:08:35 +0100 Subject: [PATCH 1/3] Fix Auto Advance waiting for audio when autoplay is disabled --- .../java/com/ichi2/anki/AbstractFlashcardViewer.kt | 12 ++++++++---- .../anki/ui/windows/reviewer/ReviewerViewModel.kt | 6 ++++++ .../ui/windows/reviewer/autoadvance/AutoAdvance.kt | 4 +++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt index 496c7ab6da67..4551ec88813f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt @@ -87,6 +87,7 @@ import com.ichi2.anki.android.back.exitViaDoubleTapBackCallback import com.ichi2.anki.cardviewer.AndroidCardRenderContext import com.ichi2.anki.cardviewer.AndroidCardRenderContext.Companion.createInstance import com.ichi2.anki.cardviewer.CardMediaPlayer +import com.ichi2.anki.cardviewer.CardSoundConfig import com.ichi2.anki.cardviewer.Gesture import com.ichi2.anki.cardviewer.GestureProcessor import com.ichi2.anki.cardviewer.JavascriptEvaluator @@ -1306,10 +1307,13 @@ abstract class AbstractFlashcardViewer : } } - private suspend fun automaticAnswerShouldWaitForAudio(): Boolean = - withCol { - decks.configDictForDeckId(currentCard!!.did).waitForAudio - } + suspend fun automaticAnswerShouldWaitForAudio(): Boolean = withCol { + val card = currentCard ?: return@withCol false // Prevents null crash + val waitForAudio = decks.configDictForDeckId(card.did).waitForAudio + val soundConfig = CardSoundConfig.create(this, card) // Fetch autoplay setting + + return@withCol waitForAudio && soundConfig.autoplay // Only wait if autoplay is enabled + } internal inner class ReadTextListener : ReadText.ReadTextListener { override fun onDone(playedSide: CardSide?) { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt index 7b9637a0a39c..2aceace8ea1f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt @@ -23,6 +23,7 @@ import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import anki.collection.OpChanges import anki.frontend.SetSchedulingStatesRequest +import com.ichi2.anki.AbstractFlashcardViewer import com.ichi2.anki.CollectionManager import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.Ease @@ -71,6 +72,7 @@ class ReviewerViewModel( queueState.await()!!.topCard } var isQueueFinishedFlow = MutableSharedFlow() + var flashcardViewer: AbstractFlashcardViewer? = null val isMarkedFlow = MutableStateFlow(false) val flagFlow = MutableStateFlow(Flag.NONE) val actionFeedbackFlow = MutableSharedFlow() @@ -509,4 +511,8 @@ class ReviewerViewModel( title } } + suspend fun shouldWaitForAudio(): Boolean { + return flashcardViewer?.automaticAnswerShouldWaitForAudio() ?: false + } + } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt index b999d2912348..5c210341cfa9 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt @@ -61,7 +61,9 @@ class AutoAdvance( private suspend fun answerAction() = settings.await().answerAction - suspend fun shouldWaitForAudio() = settings.await().waitForAudio + suspend fun shouldWaitForAudio(): Boolean { + return viewModel.shouldWaitForAudio() + } fun cancelQuestionAndAnswerActionJobs() { questionActionJob?.cancel() From b0c6e3aa0f43eaad7dec402fa8d9b3bcc64a6993 Mon Sep 17 00:00:00 2001 From: jradchaima Date: Sat, 15 Feb 2025 18:36:50 +0100 Subject: [PATCH 2/3] Ensure Auto Advance checks autoplay setting --- .../java/com/ichi2/anki/AbstractFlashcardViewer.kt | 14 +++++++------- .../anki/ui/windows/reviewer/ReviewerViewModel.kt | 6 ------ .../ui/windows/reviewer/autoadvance/AutoAdvance.kt | 4 +--- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt index 4551ec88813f..0fbf1a0b197b 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt @@ -1307,13 +1307,13 @@ abstract class AbstractFlashcardViewer : } } - suspend fun automaticAnswerShouldWaitForAudio(): Boolean = withCol { - val card = currentCard ?: return@withCol false // Prevents null crash - val waitForAudio = decks.configDictForDeckId(card.did).waitForAudio - val soundConfig = CardSoundConfig.create(this, card) // Fetch autoplay setting - - return@withCol waitForAudio && soundConfig.autoplay // Only wait if autoplay is enabled - } + private suspend fun automaticAnswerShouldWaitForAudio(): Boolean = + withCol { + val card = currentCard ?: return@withCol false // Prevents null crash + val waitForAudio = decks.configDictForDeckId(card.did).waitForAudio + val soundConfig = CardSoundConfig.create(this, card) // Fetch autoplay setting + return@withCol waitForAudio && soundConfig.autoplay // Only wait if autoplay is enabled + } internal inner class ReadTextListener : ReadText.ReadTextListener { override fun onDone(playedSide: CardSide?) { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt index 2aceace8ea1f..7b9637a0a39c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModel.kt @@ -23,7 +23,6 @@ import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import anki.collection.OpChanges import anki.frontend.SetSchedulingStatesRequest -import com.ichi2.anki.AbstractFlashcardViewer import com.ichi2.anki.CollectionManager import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.Ease @@ -72,7 +71,6 @@ class ReviewerViewModel( queueState.await()!!.topCard } var isQueueFinishedFlow = MutableSharedFlow() - var flashcardViewer: AbstractFlashcardViewer? = null val isMarkedFlow = MutableStateFlow(false) val flagFlow = MutableStateFlow(Flag.NONE) val actionFeedbackFlow = MutableSharedFlow() @@ -511,8 +509,4 @@ class ReviewerViewModel( title } } - suspend fun shouldWaitForAudio(): Boolean { - return flashcardViewer?.automaticAnswerShouldWaitForAudio() ?: false - } - } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt index 5c210341cfa9..b999d2912348 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/autoadvance/AutoAdvance.kt @@ -61,9 +61,7 @@ class AutoAdvance( private suspend fun answerAction() = settings.await().answerAction - suspend fun shouldWaitForAudio(): Boolean { - return viewModel.shouldWaitForAudio() - } + suspend fun shouldWaitForAudio() = settings.await().waitForAudio fun cancelQuestionAndAnswerActionJobs() { questionActionJob?.cancel() From 7c84bc74b85f22122cade63c5b9d16c44623f08b Mon Sep 17 00:00:00 2001 From: jradchaima <57156938+jradchaima@users.noreply.github.com> Date: Sun, 16 Feb 2025 06:36:35 +0100 Subject: [PATCH 3/3] Update AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt Co-authored-by: Brayan Oliveira <69634269+BrayanDSO@users.noreply.github.com> --- .../src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt index 0fbf1a0b197b..6703cfee074a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt @@ -1309,10 +1309,10 @@ abstract class AbstractFlashcardViewer : private suspend fun automaticAnswerShouldWaitForAudio(): Boolean = withCol { - val card = currentCard ?: return@withCol false // Prevents null crash + val card = currentCard ?: return@withCol false val waitForAudio = decks.configDictForDeckId(card.did).waitForAudio - val soundConfig = CardSoundConfig.create(this, card) // Fetch autoplay setting - return@withCol waitForAudio && soundConfig.autoplay // Only wait if autoplay is enabled + val soundConfig = CardSoundConfig.create(this, card) + return@withCol waitForAudio && soundConfig.autoplay } internal inner class ReadTextListener : ReadText.ReadTextListener {