diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt index b252b5b2731c..25907aa935f8 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeDialog.kt @@ -68,7 +68,7 @@ import com.ichi2.anki.libanki.NoteTypeId import com.ichi2.anki.requireAnkiActivity import com.ichi2.anki.showError import com.ichi2.anki.snackbar.showSnackbar -import com.ichi2.anki.sync.launchCatchingRequiringOneWaySyncDiscardUndo +import com.ichi2.anki.sync.launchCatchingRequiringOneWaySync import com.ichi2.anki.ui.BasicItemSelectedListener import com.ichi2.anki.ui.internationalization.toSentenceCase import com.ichi2.anki.utils.InitStatus @@ -637,7 +637,7 @@ class ChangeNoteTypeDialog : AnalyticsDialogFragment() { * Changes note type of multiple notes, displaying a message on success */ private fun AnkiActivity.changeNoteType(viewModel: ChangeNoteTypeViewModel) = - this.launchCatchingRequiringOneWaySyncDiscardUndo { + this.launchCatchingRequiringOneWaySync { try { val notesUpdated = withProgress { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeViewModel.kt index c743194991da..6acadadc7508 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ChangeNoteTypeViewModel.kt @@ -316,8 +316,6 @@ class ChangeNoteTypeViewModel( Timber.d("Field map: %s", fieldChangeMap) Timber.d("Card map: %s", templateChangeMap) - withCol { modSchema(check = true) } - val changes = changeNoteTypeOfNotes( noteIds = noteIds, diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/sync/SchemaChanges.kt b/AnkiDroid/src/main/java/com/ichi2/anki/sync/SchemaChanges.kt index 786f5b0377c2..a3acec5d7e13 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/sync/SchemaChanges.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/sync/SchemaChanges.kt @@ -23,6 +23,7 @@ import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.R import com.ichi2.anki.dialogs.ConfirmationDialog import com.ichi2.anki.launchCatchingTask +import com.ichi2.anki.libanki.Collection import com.ichi2.anki.libanki.exception.ConfirmModSchemaException import com.ichi2.anki.utils.ext.showDialogFragment import com.ichi2.utils.message @@ -32,6 +33,32 @@ import com.ichi2.utils.show import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine +/** + * [launchCatchingTask], showing a one-way sync dialog: [R.string.full_sync_confirmation] + * + * @param block calls a backend method which unconditionally performs a schema change, + * such as [Collection.changeNotetypeRaw] + */ +fun AnkiActivity.launchCatchingRequiringOneWaySync(block: suspend () -> Unit) = + launchCatchingTask { + if (withCol { !schemaChanged() }) { + // .also is used to ensure the activity is used as context + val confirmModSchemaDialog = + ConfirmationDialog().also { dialog -> + dialog.setArgs(message = getString(R.string.full_sync_confirmation)) + dialog.setConfirm { + launchCatchingTask { + block() + } + } + } + showDialogFragment(confirmModSchemaDialog) + return@launchCatchingTask + } + // TODO: use context(SchemaChangedConfirmed) after bug #20247 is fixed (upstream-issue) + block() + } + /** * [launchCatchingTask], showing a one-way sync dialog: [R.string.full_sync_confirmation] * diff --git a/libanki/src/main/java/com/ichi2/anki/libanki/Notetypes.kt b/libanki/src/main/java/com/ichi2/anki/libanki/Notetypes.kt index 79edc1a278e2..25e852aaacc8 100644 --- a/libanki/src/main/java/com/ichi2/anki/libanki/Notetypes.kt +++ b/libanki/src/main/java/com/ichi2/anki/libanki/Notetypes.kt @@ -561,10 +561,12 @@ class Notetypes( * * Each value represents the index in the previous notetype. * -1 indicates the original value will be discarded. + * + * **This method updates the schema without confirmation** */ @LibAnkiAlias("change_notetype_of_notes") fun changeNotetypeOfNotes(input: ChangeNotetypeRequest): OpChanges { - val opBytes = this.col.backend.changeNotetypeRaw(input.toByteArray()) + val opBytes = col.backend.changeNotetypeRaw(input.toByteArray()) return OpChanges.parseFrom(opBytes) }