Skip to content

Commit 2644a6d

Browse files
lukstbitmikehardy
authored andcommitted
Fix displayed selected deck in NoteEditorFragment
Properly sets the displayed deck in NoteEditorFragment when starting: - when adding don't show a filtered deck(even if it's the currently selected one) and revert to 'Default' - show the original deck for the card being edited from the reviewer
1 parent 1890f7e commit 2644a6d

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ import com.ichi2.anki.dialogs.tags.TagsDialogFactory
102102
import com.ichi2.anki.dialogs.tags.TagsDialogListener
103103
import com.ichi2.anki.libanki.Card
104104
import com.ichi2.anki.libanki.Collection
105+
import com.ichi2.anki.libanki.Consts
105106
import com.ichi2.anki.libanki.DeckId
106107
import com.ichi2.anki.libanki.Decks.Companion.CURRENT_DECK
107108
import com.ichi2.anki.libanki.Field
@@ -821,6 +822,33 @@ class NoteEditorFragment :
821822
}
822823

823824
deckId = requireArguments().getLong(EXTRA_DID, deckId)
825+
if (addNote) {
826+
// When adding and if we didn't receive a valid deck id or it's the 'Default' deck, look
827+
// at what deck is selected and use that(guards against certain scenarios when deleting
828+
// a deck and no deck is visually selected in DeckPicker)
829+
if (deckId == 0L || deckId == Consts.DEFAULT_DECK_ID) {
830+
// check if this is the actual deck selected
831+
val currentSelectedDeckId = col.decks.selected()
832+
if (currentSelectedDeckId != Consts.DEFAULT_DECK_ID) {
833+
deckId = currentSelectedDeckId
834+
}
835+
}
836+
// Also guard against adding to a filtered deck in which case revert to 'Default'
837+
val deck = col.decks.getLegacy(deckId)
838+
if (deck == null || deck.isFiltered) {
839+
deckId = Consts.DEFAULT_DECK_ID
840+
}
841+
} else {
842+
// When editing we always have a valid currentEditCard. Check to see if it's from a normal
843+
// deck or a filtered deck(in which case use it's original did or revert to 'Default')
844+
val cardDeckId = currentEditedCard?.did
845+
deckId =
846+
if (cardDeckId == null || col.decks.isFiltered(cardDeckId)) {
847+
currentEditedCard?.oDid ?: Consts.DEFAULT_DECK_ID
848+
} else {
849+
cardDeckId
850+
}
851+
}
824852
view?.findViewById<TextView>(R.id.note_deck_name)?.apply {
825853
text = col.decks.name(deckId)
826854
setOnClickListener {

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,50 @@ class NoteEditorTest : RobolectricTest() {
413413
}
414414
}
415415

416+
@Test
417+
fun `shows 'Default' as selected when attempting to add to a filtered deck`() {
418+
val testDeckId = addDeck("TestDeckA")
419+
val testFilteredDeckId = addDynamicDeck("TestFiltered")
420+
col.decks.select(testFilteredDeckId)
421+
val editor = getNoteEditorAdding(NoteType.BASIC).build()
422+
val deckNameView = editor.view?.findViewById<TextView>(R.id.note_deck_name)
423+
assertNotNull(deckNameView)
424+
// we can't add to a filtered deck so this should show the Default deck
425+
assertEquals("Default", deckNameView.text.toString())
426+
}
427+
428+
@Test
429+
fun `shows the currently selected deck if no deck id is provided`() {
430+
val testDeckName = "TestDeckC"
431+
addDeck("TestDeckA")
432+
addDeck("TestDeckB")
433+
val testDeckId3 = addDeck(testDeckName)
434+
col.decks.select(testDeckId3)
435+
val editor = getNoteEditorAdding(NoteType.BASIC).build()
436+
val deckNameView = editor.view?.findViewById<TextView>(R.id.note_deck_name)
437+
assertNotNull(deckNameView)
438+
// we can't add to a filtered deck so this should show the Default deck
439+
assertEquals(testDeckName, deckNameView.text.toString())
440+
}
441+
442+
@Test
443+
fun `shows the expected deck if a deck id is provided`() {
444+
val testDeckName = "TestDeckA"
445+
val testDeckId1 = addDeck(testDeckName)
446+
val testDeckId2 = addDeck("TestDeckB")
447+
col.decks.select(testDeckId2)
448+
val activity =
449+
startActivityNormallyOpenCollectionWithIntent(
450+
NoteEditorActivity::class.java,
451+
NoteEditorLauncher.AddNote(testDeckId1).toIntent(targetContext),
452+
)
453+
val editor = activity.getNoteEditorFragment()
454+
val deckNameView = editor.view?.findViewById<TextView>(R.id.note_deck_name)
455+
assertNotNull(deckNameView)
456+
// we can't add to a filtered deck so this should show the Default deck
457+
assertEquals(testDeckName, deckNameView.text.toString())
458+
}
459+
416460
@Test
417461
fun `edit note in filtered deck from reviewer - 15919`() {
418462
// TODO: As a future extension, the filtered deck should be displayed

0 commit comments

Comments
 (0)