Skip to content

Commit

Permalink
aa
Browse files Browse the repository at this point in the history
  • Loading branch information
david-allison committed Jan 9, 2025
1 parent 79ee355 commit d410708
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 32 deletions.
3 changes: 2 additions & 1 deletion AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,8 @@ open class CardBrowser :

findViewById<ViewGroup>(R.id.browser_column_headings).setOnLongClickListener {
Timber.d("long press on headings: opening column selection options")
showDialogFragment(BrowserColumnSelectionFragment())
val dialog = BrowserColumnSelectionFragment.createInstance(viewModel.cardsOrNotes)
showDialogFragment(dialog)
true
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class BrowserColumnSelectionFragment : DialogFragment(R.layout.preferences_brows

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// TODO
// fullscreen material dialog
setStyle(STYLE_NORMAL, com.google.android.material.R.style.MaterialAlertDialog_Material3)
}

Expand Down Expand Up @@ -222,6 +222,7 @@ class BrowserColumnSelectionFragment : DialogFragment(R.layout.preferences_brows

fun createInstance(cardsOrNotes: CardsOrNotes): BrowserColumnSelectionFragment =
BrowserColumnSelectionFragment().apply {
Timber.d("Building 'Manage columns' dialog for %s mode", cardsOrNotes)
arguments =
bundleOf(
ARG_MODE to cardsOrNotes,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -511,11 +511,14 @@ class CardBrowserViewModel(
}

@CheckResult
@NeedsTest("update with same CoN")
@NeedsTest("update with different CoN")
fun updateColumns(
columns: List<CardBrowserColumn>,
cardsOrNotes: CardsOrNotes,
): Boolean {
if (columns.isEmpty()) return false
if (columns.isEmpty()) return false.also { Timber.d("updateColumns: no columns") }
if (availableColumns == columns) return false.also { Timber.d("updateColumns: no changes") }

val columns =
BrowserColumnCollection.update(sharedPrefs(), cardsOrNotes) { cols ->
Expand All @@ -524,10 +527,21 @@ class CardBrowserViewModel(
return@update true
}!!

viewModelScope.launch {
withCol { backend.setActiveBrowserColumns(columns.backendKeys) }
flowOfAvailableColumns.update { columns }
// A user can edit the non-active columns if they:
// * Edit the cards/notes setting in the browser options
// * Edit the visible columns
// * Save the columns and discard the options changes
val isEditingCurrentHeadings = cardsOrNotes == this.cardsOrNotes
Timber.d("editing columns for current headings: %b", isEditingCurrentHeadings)

if (isEditingCurrentHeadings) {
Timber.d("updating active columns")
viewModelScope.launch {
withCol { backend.setActiveBrowserColumns(columns.backendKeys) }
flowOfAvailableColumns.update { columns }
}
}

return true
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,20 @@ class BrowserOptionsDialog : AppCompatDialogFragment() {

private val viewModel: CardBrowserViewModel by activityViewModels()

/** The unsaved value of [CardsOrNotes] */
private val dialogCardsOrNotes: CardsOrNotes
get() {
@IdRes val selectedButtonId =
dialogView.findViewById<RadioGroup>(R.id.select_browser_mode).checkedRadioButtonId
return when (selectedButtonId) {
R.id.select_cards_mode -> CardsOrNotes.CARDS
else -> CardsOrNotes.NOTES
}
}

private val positiveButtonClick = { _: DialogInterface, _: Int ->
@IdRes val selectedButtonId =
dialogView.findViewById<RadioGroup>(R.id.select_browser_mode).checkedRadioButtonId
val newCardsOrNotes =
if (selectedButtonId == R.id.select_cards_mode) CardsOrNotes.CARDS else CardsOrNotes.NOTES
if (cardsOrNotes != newCardsOrNotes) {
viewModel.setCardsOrNotes(newCardsOrNotes)
if (cardsOrNotes != dialogCardsOrNotes) {
viewModel.setCardsOrNotes(dialogCardsOrNotes)
}
val newTruncate = dialogView.findViewById<CheckBox>(R.id.truncate_checkbox).isChecked

Expand Down Expand Up @@ -114,9 +121,10 @@ class BrowserOptionsDialog : AppCompatDialogFragment() {
}
}

fun openColumnManager() {
Timber.d("opening column manager")
requireActivity().showDialogFragment(BrowserColumnSelectionFragment())
/** Opens [BrowserColumnSelectionFragment] for the current selection of [CardsOrNotes] */
private fun openColumnManager() {
val dialog = BrowserColumnSelectionFragment.createInstance(dialogCardsOrNotes)
requireActivity().showDialogFragment(dialog)
}

companion object {
Expand Down
7 changes: 6 additions & 1 deletion AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import com.ichi2.anki.browser.CardBrowserColumn.TAGS
import com.ichi2.anki.browser.CardBrowserViewModel
import com.ichi2.anki.browser.CardBrowserViewModelTest
import com.ichi2.anki.browser.CardOrNoteId
import com.ichi2.anki.browser.column1
import com.ichi2.anki.common.utils.isRunningAsUnitTest
import com.ichi2.anki.dialogs.DeckSelectionDialog
import com.ichi2.anki.model.CardsOrNotes.CARDS
Expand Down Expand Up @@ -216,7 +217,11 @@ class CardBrowserTest : RobolectricTest() {
assertThat("the row stays visible", browser.viewModel.rowCount, equalTo(6))
assertThat(
"the row is displayed as deleted",
browser.getVisibleRows().first().firstColumn,
browser
.getVisibleRows()
.first()
.columnViews[0]
.text,
equalTo("(deleted)"),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -337,75 +337,75 @@ class CardBrowserViewModelTest : JvmTest() {
@Test
fun `cards - changing column index 1`() =
runViewModelTest {
flowOfColumn1.test {
flowOfAvailableColumns.test {
ignoreEventsDuringViewModelInit()

assertThat("default column1 value", column1, equalTo(SFLD))

setColumn1(QUESTION)
setColumn(0, QUESTION)

assertThat("flowOfColumn1", awaitItem(), equalTo(QUESTION))
assertThat("flowOfColumn1", awaitItem().columns[0], equalTo(QUESTION))
assertThat("column1", column1, equalTo(QUESTION))

// expect no change if the value is selected again
setColumn1(QUESTION)
setColumn(0, QUESTION)
expectNoEvents()
}
}

@Test
fun `cards - changing column index 2`() =
runViewModelTest {
flowOfColumn2.test {
flowOfAvailableColumns.test {
ignoreEventsDuringViewModelInit()

assertThat("default column2Index value", column2, equalTo(CARD))

setColumn2(ANSWER)
setColumn(1, ANSWER)

assertThat("flowOfColumnIndex2", awaitItem(), equalTo(ANSWER))
assertThat("flowOfColumnIndex2", awaitItem().columns[1], equalTo(ANSWER))
assertThat("column2Index", column2, equalTo(ANSWER))

// expect no change if the value is selected again
setColumn2(ANSWER)
setColumn(1, ANSWER)
expectNoEvents()
}
}

@Test
fun `notes - changing column index 1`() =
runViewModelNotesTest {
flowOfColumn1.test {
flowOfAvailableColumns.test {
ignoreEventsDuringViewModelInit()

assertThat("default column1 value", column1, equalTo(SFLD))

setColumn1(QUESTION)
setColumn(0, QUESTION)

assertThat("flowOfColumn1", awaitItem(), equalTo(QUESTION))
assertThat("flowOfColumn1", awaitItem().columns[0], equalTo(QUESTION))
assertThat("column1", column1, equalTo(QUESTION))

// expect no change if the value is selected again
setColumn1(QUESTION)
setColumn(0, QUESTION)
expectNoEvents()
}
}

@Test
fun `notes - changing column index 2`() =
runViewModelNotesTest {
flowOfColumn2.test {
flowOfAvailableColumns.test {
ignoreEventsDuringViewModelInit()

assertThat("default column2Index value", column2, equalTo(NOTE_TYPE))

setColumn2(ANSWER)
setColumn(1, ANSWER)

assertThat("flowOfColumnIndex2", awaitItem(), equalTo(ANSWER))
assertThat("flowOfColumnIndex2", awaitItem().columns[1], equalTo(ANSWER))
assertThat("column2Index", column2, equalTo(ANSWER))

// expect no change if the value is selected again
setColumn2(ANSWER)
setColumn(1, ANSWER)
expectNoEvents()
}
}
Expand Down Expand Up @@ -959,3 +959,18 @@ private fun TestClass.suspend(vararg cardIds: CardId) {
private fun TestClass.suspend(note: Note) {
col.sched.suspendCards(note.cardIds(col))
}

val CardBrowserViewModel.column1
get() = this.availableColumns[0]

val CardBrowserViewModel.column2
get() = this.availableColumns[1]

fun CardBrowserViewModel.setColumn(
index: Int,
column: CardBrowserColumn,
): Boolean {
val newColumns = availableColumns.toMutableList()
newColumns[index] = column
return updateColumns(newColumns, cardsOrNotes)
}

0 comments on commit d410708

Please sign in to comment.