ankidroid/Anki-Android

Very long 'Processing' dialog if AutoSync is enabled and AnkiWeb is down. ANR if no notification permissions

Open

#17,551 opened on Dec 5, 2024

View on GitHub
 (12 comments) (0 reactions) (0 assignees)Kotlin (11,132 stars) (2,789 forks)batch import
2.19Help WantedKeep OpenPriority-HighSync

Description

  • Enable autosync
  • Open AnkiDroid when AnkiWeb is down
  • "Processing" dialog can't be cancelled and took ~15 second to close
    • Maybe longer, AnkiWeb was back up by the time it completed

A user reported that the app was hung, this may be related

  • Related: #17493

Reproduction patch:

Index: AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt b/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt
--- a/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt	(revision 951615f7753ca8b5710f15cce2bba2a9a114f91c)
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/Sync.kt	(date 1733378352598)
@@ -23,6 +23,7 @@
 import androidx.annotation.StringRes
 import androidx.appcompat.app.AlertDialog
 import androidx.core.content.edit
+import anki.backend.backendError
 import anki.sync.SyncAuth
 import anki.sync.SyncCollectionResponse
 import anki.sync.syncAuth
@@ -50,6 +51,7 @@
 import kotlinx.coroutines.withContext
 import net.ankiweb.rsdroid.Backend
 import net.ankiweb.rsdroid.exceptions.BackendInterruptedException
+import net.ankiweb.rsdroid.exceptions.BackendNetworkException
 import net.ankiweb.rsdroid.exceptions.BackendSyncException
 import timber.log.Timber
 
@@ -223,6 +225,12 @@
         manualCancelButton = R.string.dialog_cancel
     ) {
         withCol {
+            Timber.d("Simulating AnkiWeb wait")
+            Thread.sleep(10_000)
+            Timber.d("Simulating AnkiWeb timeout error")
+            throw BackendNetworkException(backendError {
+                message = "testing timeout"
+            })
             syncCollection(auth2, media = false) // media is synced by SyncMediaWorker
         }
     }

Contributor guide