Skip to content

Commit 2529cac

Browse files
david-allisonmikehardy
authored andcommitted
fix: discard changes was shown if note contained a newline
`<br>` in the collection was converted to `\n` in the EditText, these weren't comparable Fixes 20174
1 parent 6829772 commit 2529cac

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

AnkiDroid/src/main/java/com/ichi2/anki/NoteEditorFragment.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ import com.ichi2.anki.previewer.TemplatePreviewerArguments
149149
import com.ichi2.anki.previewer.TemplatePreviewerPage
150150
import com.ichi2.anki.servicelayer.LanguageHintService.languageHint
151151
import com.ichi2.anki.servicelayer.NoteService
152+
import com.ichi2.anki.servicelayer.NoteService.convertToHtmlNewline
152153
import com.ichi2.anki.snackbar.BaseSnackbarBuilderProvider
153154
import com.ichi2.anki.snackbar.SnackbarBuilder
154155
import com.ichi2.anki.snackbar.showSnackbar
@@ -1233,7 +1234,10 @@ class NoteEditorFragment :
12331234
fun fieldsEdited(): Boolean {
12341235
// Editing an existing note: Check to see if the fields are changed
12351236
if (!addNote) {
1236-
return editFields!!.map { it.text?.toString() } != editorNote!!.fields.toList()
1237+
fun normalizeNewlines(s: String) = convertToHtmlNewline(s, replaceNewlines = true)
1238+
val currentStrings = editFields!!.map { it.text?.toString() ?: "" }
1239+
val originalStrings = editorNote!!.fields.toList()
1240+
return currentStrings.map(::normalizeNewlines) != originalStrings.map(::normalizeNewlines)
12371241
}
12381242

12391243
if (!isFieldEdited) return false

AnkiDroid/src/test/java/com/ichi2/anki/NoteEditorTest.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,32 @@ class NoteEditorTest : RobolectricTest() {
631631
}
632632
}
633633

634+
@Test
635+
fun `hasUnsavedChanges - note is unchanged`() =
636+
withNoteEditorEditing(addBasicNote("hello world")) {
637+
this.setField(0, "hello world")
638+
assertFalse(hasUnsavedChanges())
639+
}
640+
641+
@Test
642+
fun `hasUnsavedChanges - note is changed`() =
643+
withNoteEditorEditing(addBasicNote("hello world")) {
644+
this.setField(0, "hi")
645+
assertTrue(hasUnsavedChanges())
646+
}
647+
648+
@Test
649+
fun `hasUnsavedChanges - note contained a newline`() =
650+
withNoteEditorEditing(addBasicNote("hello\nworld")) {
651+
assertFalse(hasUnsavedChanges())
652+
}
653+
654+
@Test
655+
fun `hasUnsavedChanges - note contained a HTML newline - 20174`() =
656+
withNoteEditorEditing(addBasicNote("hello<br>world")) {
657+
assertFalse(hasUnsavedChanges())
658+
}
659+
634660
private suspend fun withNoteEditorAdding(
635661
from: FromScreen = FromScreen.DECK_LIST,
636662
block: suspend NoteEditorFragment.() -> Unit,
@@ -639,6 +665,13 @@ class NoteEditorTest : RobolectricTest() {
639665
editor.block()
640666
}
641667

668+
private fun withNoteEditorEditing(
669+
note: Note,
670+
block: suspend NoteEditorFragment.() -> Unit,
671+
) = runTest {
672+
block(getNoteEditorEditingExistingBasicNote(note, from = REVIEWER))
673+
}
674+
642675
private fun moveToDynamicDeck(note: Note): DeckId {
643676
val dyn = addDynamicDeck("All")
644677
col.decks.select(dyn)

0 commit comments

Comments
 (0)