From 7d64f366b7ea5df7ac0119900c97018174735f48 Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison@users.noreply.github.com> Date: Sun, 24 Dec 2023 13:32:21 +0000 Subject: [PATCH] refactor: Card Browser - Preview --- .../main/java/com/ichi2/anki/CardBrowser.kt | 19 ++++--------------- .../anki/browser/CardBrowserViewModel.kt | 19 +++++++++++++++++++ .../java/com/ichi2/anki/CardBrowserTest.kt | 12 ++++++------ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt index d5e21fa2cca3..1c1e2db094c2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt @@ -1192,21 +1192,10 @@ open class CardBrowser : ) } - protected fun onPreview() { - onPreviewCardsActivityResult.launch(previewIntent) - } // Preview all cards, starting from the one that is currently selected - - // Multiple cards have been explicitly selected, so preview only those cards - @get:VisibleForTesting - val previewIntent: Intent - get() = if (isInMultiSelectMode && viewModel.selectedRowCount() > 1) { - // Multiple cards have been explicitly selected, so preview only those cards - getPreviewIntent(0, selectedCardIds.toLongArray()) - } else { - // Preview all cards, starting from the one that is currently selected - val startIndex = viewModel.selectedRows.firstOrNull()?.position ?: 0 - getPreviewIntent(startIndex, viewModel.allCardIds) - } + private fun onPreview() { + val intentData = viewModel.previewIntentData + onPreviewCardsActivityResult.launch(getPreviewIntent(intentData.index, intentData.cardList)) + } private fun getPreviewIntent(index: Int, selectedCardIds: LongArray): Intent { return if (sharedPrefs().getBoolean("new_previewer", false)) { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt index 59d2a74d96a4..3b616fa6a9bb 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt @@ -27,6 +27,7 @@ import com.ichi2.anki.CardBrowser import com.ichi2.anki.CollectionManager.withCol import com.ichi2.anki.DeckSpinnerSelection.Companion.ALL_DECKS_ID import com.ichi2.anki.Flag +import com.ichi2.anki.PreviewDestination import com.ichi2.anki.R import com.ichi2.anki.dialogs.ExportDialogParams import com.ichi2.anki.export.ExportType @@ -459,6 +460,24 @@ class CardBrowserViewModel( setFilterQuery(sb.toString()) } + /** Previewing */ + + val previewIntentData: PreviewDestination + get() = if (selectedRowCount() > 1) { + // Multiple cards have been explicitly selected, so preview only those cards + PreviewDestination(index = 0, cardList = selectedCardIds.toLongArray()) + } else { + // Preview all cards, starting from the one that is currently selected + val startIndex = indexOfFirstCheckedCard() ?: 0 + PreviewDestination(startIndex, allCardIds) + } + + /** @return the index of the first checked card in [cards], or `null` if no cards are checked */ + private fun indexOfFirstCheckedCard(): Int? { + val idToFind = selectedRows.firstOrNull()?.id ?: return null + return allCardIds.indexOf(idToFind) + } + companion object { const val DISPLAY_COLUMN_1_KEY = "cardBrowserColumn1" const val DISPLAY_COLUMN_2_KEY = "cardBrowserColumn2" diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt index e5894220192a..502f5d260256 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/CardBrowserTest.kt @@ -435,11 +435,11 @@ class CardBrowserTest : RobolectricTest() { assertThat(b.getPropertiesForCardId(cid2).position, equalTo(1)) b.selectRowsWithPositions(0) - val previewIntent = b.previewIntent - assertThat("before: index", previewIntent.getIntExtra("index", -100), equalTo(0)) + val previewIntent = b.viewModel.previewIntentData + assertThat("before: index", previewIntent.index, equalTo(0)) assertThat( "before: cards", - previewIntent.getLongArrayExtra("cardList"), + previewIntent.cardList, equalTo(longArrayOf(cid1, cid2)) ) @@ -450,11 +450,11 @@ class CardBrowserTest : RobolectricTest() { assertThat(b.getPropertiesForCardId(cid2).position, equalTo(0)) b.replaceSelectionWith(intArrayOf(0)) - val intentAfterReverse = b.previewIntent - assertThat("after: index", intentAfterReverse.getIntExtra("index", -100), equalTo(0)) + val intentAfterReverse = b.viewModel.previewIntentData + assertThat("after: index", intentAfterReverse.index, equalTo(0)) assertThat( "after: cards", - intentAfterReverse.getLongArrayExtra("cardList"), + intentAfterReverse.cardList, equalTo(longArrayOf(cid2, cid1)) ) }