From c92b96fb3d280dc94a2f0bf102032f880f7d9e9e Mon Sep 17 00:00:00 2001 From: Sumit Singh Date: Wed, 25 Feb 2026 17:36:33 +0530 Subject: [PATCH] Add default-folder recovery option for broken collection path --- .../ichi2/anki/dialogs/DatabaseErrorDialog.kt | 34 +++++++++++++++++-- AnkiDroid/src/main/res/values/09-backup.xml | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DatabaseErrorDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DatabaseErrorDialog.kt index 6e4da4102881..54956f2aa553 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DatabaseErrorDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DatabaseErrorDialog.kt @@ -151,8 +151,8 @@ class DatabaseErrorDialog : AsyncDialogFragment() { DIALOG_ERROR_HANDLING -> { // The user has asked to see repair options; allow them to choose one of the repair options or go back // to the previous dialog - val options = ArrayList(7) - val values = ArrayList(7) + val options = ArrayList(8) + val values = ArrayList(8) if (!requireAnkiActivity().colIsOpenUnsafe()) { // retry options.add(res.getString(R.string.backup_retry_opening)) @@ -171,6 +171,23 @@ class DatabaseErrorDialog : AsyncDialogFragment() { options.add(res.getString(R.string.backup_one_way_sync_from_server)) values.add(ErrorHandlingEntries.ONE_WAY) } + + val activity = requireActivity() + val shouldOfferResetToDefaultDirectory = + try { + val currentDir = CollectionHelper.getCurrentAnkiDroidDirectory(activity) + val defaultDir = CollectionHelper.getDefaultAnkiDroidDirectory(activity) + currentDir.absolutePath != defaultDir.absolutePath + } catch (e: SystemStorageException) { + Timber.w(e, "Failed to determine whether to offer reset-to-default directory option") + false + } + + if (shouldOfferResetToDefaultDirectory) { + options.add(res.getString(R.string.backup_use_default_folder)) + values.add(ErrorHandlingEntries.RESET_TO_DEFAULT_DIRECTORY) + } + // delete old collection and build new one options.add(res.getString(R.string.backup_del_collection)) values.add(ErrorHandlingEntries.NEW) @@ -200,6 +217,18 @@ class DatabaseErrorDialog : AsyncDialogFragment() { showDatabaseErrorDialog(DIALOG_ONE_WAY_SYNC_FROM_SERVER) return@listItems } + ErrorHandlingEntries.RESET_TO_DEFAULT_DIRECTORY -> { + try { + val defaultDir = CollectionHelper.getDefaultAnkiDroidDirectory(activity) + CollectionManager.closeCollectionBlocking() + CollectionHelper.resetAnkiDroidDirectory(activity, defaultDir) + closeCollectionAndFinish() + } catch (e: SystemStorageException) { + Timber.w(e, "Failed to reset AnkiDroid directory to default") + showDatabaseErrorDialog(DIALOG_LOAD_FAILED) + } + return@listItems + } ErrorHandlingEntries.NEW -> { showDatabaseErrorDialog(DIALOG_NEW_COLLECTION) return@listItems @@ -747,6 +776,7 @@ private enum class ErrorHandlingEntries { REPAIR, RESTORE, ONE_WAY, + RESET_TO_DEFAULT_DIRECTORY, NEW, DEBUG_INFO, } diff --git a/AnkiDroid/src/main/res/values/09-backup.xml b/AnkiDroid/src/main/res/values/09-backup.xml index 1cfc5a1f2c52..4a387c2800aa 100644 --- a/AnkiDroid/src/main/res/values/09-backup.xml +++ b/AnkiDroid/src/main/res/values/09-backup.xml @@ -26,6 +26,7 @@ Delete collection and create new one Delete the collection and create a new one? This will drop all your learning progress and delete all cards. One-way sync from server + Use default collection folder Overwrite your collection with the one from AnkiWeb? This will drop all your learning progress and added information since your last sync. Error handling Options