ankidroid / Anki-Android

AnkiDroid: Anki flashcards on Android. Your secret trick to achieve superhuman information retention.
GNU General Public License v3.0
8.48k stars 2.2k forks source link

[BUG]: "Reset progress" can't work in Reviewer on the spot and causes error #17079

Open snowtimeglass opened 1 week ago

snowtimeglass commented 1 week ago

Checked for duplicates?

Does it also happen in the desktop version?

What are the steps to reproduce this bug?

  1. Show a review card in Reviewer

    (counterpart screen in Desktop)

  2. "Reschedule" > "Reset progress" > "OK"

    (then, a message, "1 card reset", is shown)

Result

https://github.com/user-attachments/assets/1547c887-ef42-4e37-b90a-835987e62e78

Expected behaviour

The count number of review cards decreases by one, and the count number of new cards increases by one, as in the desktop version. (The cards is treated as a new card on the spot.)

image

Debug info

AnkiDroid Version = 2.19beta2 (2dab92e5214d6e21ebe2dd3a05e20a04ed7a9858)

Backend Version = 0.1.40-anki24.06.3 (24.06.3 d678e39350a2d243242a69f4e22f5192b04398f2)

Android Version = 11 (SDK 30)

ProductFlavor = full

Manufacturer = OPPO

Model = CPH2013

Hardware = qcom

Webview User Agent = Mozilla/5.0 (Linux; Android 11; CPH2013 Build/RKQ1.200903.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/128.0.6613.127 Mobile Safari/537.36

ACRA UUID = 5e59349c-ede4-4942-91b7-199dcf1342c0

FSRS Enabled = true

Crash Reports Enabled = true

(Optional) Anything else you want to share?

No response

Research

oyeraghib commented 1 week ago

@david-allison can I work on this?

david-allison commented 1 week ago

Sure

oyeraghib commented 1 week ago

Current error logs after reproducing the above steps :

  E  net.ankiweb.rsdroid.exceptions.BackendInvalidInputException: card was modified: Normal(
                                                                                                        New(
                                                                                                            NewState {
                                                                                                                position: 15,
                                                                                                            },
                                                                                                        ),
                                                                                                    ) Normal(
                                                                                                        Learning(
                                                                                                            LearnState {
                                                                                                                remaining_steps: 1,
                                                                                                                scheduled_secs: 600,
                                                                                                                elapsed_secs: 15883707,
                                                                                                                memory_state: None,
                                                                                                            },
                                                                                                        ),
                                                                                                    )
                                                                                                        at net.ankiweb.rsdroid.exceptions.BackendInvalidInputException$Companion.fromInvalidInputError(BackendInvalidInputException.kt:37)
                                                                                                        at net.ankiweb.rsdroid.BackendException$Companion.fromError(BackendException.kt:114)
                                                                                                        at net.ankiweb.rsdroid.BackendKt.unpackResult(Backend.kt:281)
                                                                                                        at net.ankiweb.rsdroid.BackendKt.access$unpackResult(Backend.kt:1)
                                                                                                        at net.ankiweb.rsdroid.Backend.runMethodRaw$lambda$1(Backend.kt:118)
                                                                                                        at net.ankiweb.rsdroid.Backend.$r8$lambda$rLALQVYPlbbEmpwIB7kwMA6SO_U(Unknown Source:0)
                                                                                                        at net.ankiweb.rsdroid.Backend$$ExternalSyntheticLambda2.invoke(D8$$SyntheticClass:0)
                                                                                                        at net.ankiweb.rsdroid.Backend.withBackend(Backend.kt:131)
                                                                                                        at net.ankiweb.rsdroid.Backend.runMethodRaw(Backend.kt:117)
                                                                                                        at anki.backend.GeneratedBackend.answerCardRaw(GeneratedBackend.kt:698)
                                                                                                        at anki.backend.GeneratedBackend.answerCard(GeneratedBackend.kt:703)
                                                                                                        at com.ichi2.libanki.sched.Scheduler.answerCard(Scheduler.kt:140)
                                                                                                        at com.ichi2.anki.Reviewer.answerCardInner$lambda$10(Reviewer.kt:1071)
                                                                                                        at com.ichi2.anki.Reviewer.$r8$lambda$LbgNo9oDBDuCvfjZjbS__zeJtMc(Unknown Source:0)
                                                                                                        at com.ichi2.anki.Reviewer$$ExternalSyntheticLambda2.invoke(D8$$SyntheticClass:0)
                                                                                                        at com.ichi2.libanki.ChangeManagerKt.undoableOp$lambda$0(ChangeManager.kt:136)
                                                                                                        at com.ichi2.libanki.ChangeManagerKt.$r8$lambda$nfOTnN_QmO6PfFJdkZgJou8q83U(Unknown Source:0)
                                                                                                        at com.ichi2.libanki.ChangeManagerKt$$ExternalSyntheticLambda1.invoke(D8$$SyntheticClass:0)
                                                                                                        at com.ichi2.anki.CollectionManager.withCol$lambda$1(CollectionManager.kt:114)
                                                                                                        at com.ichi2.anki.CollectionManager.$r8$lambda$ffr4nUlMOyAvThaKA2WuJlnLaPU(Unknown Source:0)
                                                                                                        at com.ichi2.anki.CollectionManager$$ExternalSyntheticLambda9.invoke(D8$$SyntheticClass:0)
                                                                                                        at com.ichi2.anki.CollectionManager$withQueue$3.invokeSuspend(CollectionManager.kt:98)
                                                                                                        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
                                                                                                        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
                                                                                                        at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
                                                                                                        at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
                                                                                                        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
                                                                                                        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:811)
                                                                                                        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:715)
                                                                                                        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:702)
2024-09-23 21:51:56.044  9592-9592  CoroutineHelpersKt      com.ichi2.anki.debug                 E      at com.ichi2.anki.CoroutineHelpersKt.launchCatchingTask(CoroutineHelpers.kt:230)
                                                                                                        at com.ichi2.anki.CoroutineHelpersKt.launchCatchingTask$default(CoroutineHelpers.kt:226)
                                                                                                        at com.ichi2.anki.AbstractFlashcardViewer.answerCard$lambda$16(AbstractFlashcardViewer.kt:890)
                                                                                                        at com.ichi2.anki.AbstractFlashcardViewer.$r8$lambda$cqQ2mllVMPsv5J3_TtTFKxUMg9E(Unknown Source:0)
                                                                                                        at com.ichi2.anki.AbstractFlashcardViewer$$ExternalSyntheticLambda8.invoke(D8$$SyntheticClass:0)
                                                                                                        at com.ichi2.anki.utils.OnlyOnce.preventSimultaneousExecutions(OnlyOnce.kt:45)
                                                                                                        at com.ichi2.anki.AbstractFlashcardViewer.answerCard(AbstractFlashcardViewer.kt:889)
                                                                                                        at com.ichi2.anki.AbstractFlashcardViewer$SelectEaseHandler.onClick(AbstractFlashcardViewer.kt:439)
                                                                                                        at com.ichi2.anki.reviewer.EaseButton.setListeners$lambda$0(EaseButton.kt:70)
                                                                                                        at com.ichi2.anki.reviewer.EaseButton.$r8$lambda$uIozAmA4u9kBcKK6Ps0s37STnQo(Unknown Source:0)
                                                                                                        at com.ichi2.anki.reviewer.EaseButton$$ExternalSyntheticLambda1.onClick(D8$$SyntheticClass:0)
                                                                                                        at android.view.View.performClick(View.java:7506)
                                                                                                        at android.view.View.performClickInternal(View.java:7483)
                                                                                                        at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
                                                                                                        at android.view.View$PerformClick.run(View.java:29357)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:942)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7884)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)