Skip to content

Commit d5ab5a5

Browse files
BrayanDSOmikehardy
authored andcommitted
refactor: generify PreviewerIdsFile
to be used in another classes, like the tags dialog
1 parent b504593 commit d5ab5a5

File tree

7 files changed

+40
-38
lines changed

7 files changed

+40
-38
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ import com.ichi2.anki.browser.CardOrNoteId
7272
import com.ichi2.anki.browser.ColumnHeading
7373
import com.ichi2.anki.browser.ColumnSelectionDialogFragment
7474
import com.ichi2.anki.browser.FindAndReplaceDialogFragment
75-
import com.ichi2.anki.browser.PreviewerIdsFile
75+
import com.ichi2.anki.browser.IdsFile
7676
import com.ichi2.anki.browser.RepositionCardFragment
7777
import com.ichi2.anki.browser.RepositionCardFragment.Companion.REQUEST_REPOSITION_NEW_CARDS
7878
import com.ichi2.anki.browser.RepositionCardsRequest.ContainsNonNewCardsError
@@ -1481,14 +1481,14 @@ open class CardBrowser :
14811481
private fun onPreview() {
14821482
launchCatchingTask {
14831483
val intentData = viewModel.queryPreviewIntentData()
1484-
onPreviewCardsActivityResult.launch(getPreviewIntent(intentData.currentIndex, intentData.previewerIdsFile))
1484+
onPreviewCardsActivityResult.launch(getPreviewIntent(intentData.currentIndex, intentData.idsFile))
14851485
}
14861486
}
14871487

14881488
private fun getPreviewIntent(
14891489
index: Int,
1490-
previewerIdsFile: PreviewerIdsFile,
1491-
): Intent = PreviewerDestination(index, previewerIdsFile).toIntent(this)
1490+
idsFile: IdsFile,
1491+
): Intent = PreviewerDestination(index, idsFile).toIntent(this)
14921492

14931493
private fun rescheduleSelectedCards() {
14941494
if (!viewModel.hasSelectedAnyRows()) {
@@ -1993,8 +1993,8 @@ suspend fun searchForRows(
19931993

19941994
class PreviewerDestination(
19951995
val currentIndex: Int,
1996-
val previewerIdsFile: PreviewerIdsFile,
1996+
val idsFile: IdsFile,
19971997
)
19981998

19991999
@CheckResult
2000-
fun PreviewerDestination.toIntent(context: Context) = PreviewerFragment.getIntent(context, previewerIdsFile, currentIndex)
2000+
fun PreviewerDestination.toIntent(context: Context) = PreviewerFragment.getIntent(context, idsFile, currentIndex)

AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -888,11 +888,11 @@ class CardBrowserViewModel(
888888
suspend fun queryPreviewIntentData(): PreviewerDestination {
889889
// If in NOTES mode, we show one Card per Note, as this matches Anki Desktop
890890
return if (selectedRowCount() > 1) {
891-
PreviewerDestination(currentIndex = 0, PreviewerIdsFile(cacheDir, queryAllSelectedCardIds()))
891+
PreviewerDestination(currentIndex = 0, IdsFile(cacheDir, queryAllSelectedCardIds()))
892892
} else {
893893
// Preview all cards, starting from the one that is currently selected
894894
val startIndex = indexOfFirstCheckedCard() ?: 0
895-
PreviewerDestination(startIndex, PreviewerIdsFile(cacheDir, queryOneCardIdPerNote()))
895+
PreviewerDestination(startIndex, IdsFile(cacheDir, queryOneCardIdPerNote()))
896896
}
897897
}
898898

@@ -1154,26 +1154,28 @@ enum class SaveSearchResult {
11541154
}
11551155

11561156
/**
1157-
* Temporary file containing the IDs of the cards to be displayed at the previewer
1157+
* Temporary file containing cards or note IDs to be passed in a Bundle.
1158+
*
1159+
* It avoids [android.os.TransactionTooLargeException] when passing a big amount of data.
11581160
*/
1159-
class PreviewerIdsFile(
1161+
class IdsFile(
11601162
path: String,
11611163
) : File(path),
11621164
Parcelable {
11631165
/**
11641166
* @param directory parent directory of the file. Generally it should be the cache directory
1165-
* @param cardIds ids of the cards to be displayed
1167+
* @param ids ids to store
11661168
*/
1167-
constructor(directory: File, cardIds: List<CardId>) : this(createTempFile("previewerIds", ".tmp", directory).path) {
1169+
constructor(directory: File, ids: List<Long>) : this(createTempFile("ids", ".tmp", directory).path) {
11681170
DataOutputStream(FileOutputStream(this)).use { outputStream ->
1169-
outputStream.writeInt(cardIds.size)
1170-
for (id in cardIds) {
1171+
outputStream.writeInt(ids.size)
1172+
for (id in ids) {
11711173
outputStream.writeLong(id)
11721174
}
11731175
}
11741176
}
11751177

1176-
fun getCardIds(): List<Long> =
1178+
fun getIds(): List<Long> =
11771179
DataInputStream(FileInputStream(this)).use { inputStream ->
11781180
val size = inputStream.readInt()
11791181
List(size) { inputStream.readLong() }
@@ -1192,10 +1194,10 @@ class PreviewerIdsFile(
11921194
@JvmField
11931195
@Suppress("unused")
11941196
val CREATOR =
1195-
object : Parcelable.Creator<PreviewerIdsFile> {
1196-
override fun createFromParcel(source: Parcel?): PreviewerIdsFile = PreviewerIdsFile(source!!.readString()!!)
1197+
object : Parcelable.Creator<IdsFile> {
1198+
override fun createFromParcel(source: Parcel?): IdsFile = IdsFile(source!!.readString()!!)
11971199

1198-
override fun newArray(size: Int): Array<PreviewerIdsFile> = arrayOf()
1200+
override fun newArray(size: Int): Array<IdsFile> = arrayOf()
11991201
}
12001202
}
12011203
}

AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerFragment.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import com.google.android.material.textview.MaterialTextView
3838
import com.ichi2.anki.DispatchKeyEventListener
3939
import com.ichi2.anki.Flag
4040
import com.ichi2.anki.R
41-
import com.ichi2.anki.browser.PreviewerIdsFile
41+
import com.ichi2.anki.browser.IdsFile
4242
import com.ichi2.anki.cardviewer.CardMediaPlayer
4343
import com.ichi2.anki.reviewer.BindingProcessor
4444
import com.ichi2.anki.reviewer.MappableBinding
@@ -58,12 +58,12 @@ class PreviewerFragment :
5858
DispatchKeyEventListener,
5959
BindingProcessor<MappableBinding, PreviewerAction> {
6060
override val viewModel: PreviewerViewModel by viewModels {
61-
val previewerIdsFile =
62-
requireNotNull(BundleCompat.getParcelable(requireArguments(), CARD_IDS_FILE_ARG, PreviewerIdsFile::class.java)) {
61+
val idsFile =
62+
requireNotNull(BundleCompat.getParcelable(requireArguments(), CARD_IDS_FILE_ARG, IdsFile::class.java)) {
6363
"$CARD_IDS_FILE_ARG is required"
6464
}
6565
val currentIndex = requireArguments().getInt(CURRENT_INDEX_ARG, 0)
66-
PreviewerViewModel.factory(previewerIdsFile, currentIndex, CardMediaPlayer())
66+
PreviewerViewModel.factory(idsFile, currentIndex, CardMediaPlayer())
6767
}
6868
override val webView: WebView
6969
get() = requireView().findViewById(R.id.webview)
@@ -276,18 +276,18 @@ class PreviewerFragment :
276276
/** Index of the card to be first displayed among the IDs provided by [CARD_IDS_FILE_ARG] */
277277
const val CURRENT_INDEX_ARG = "currentIndex"
278278

279-
/** Argument key to a [PreviewerIdsFile] with the IDs of the cards to be displayed */
279+
/** Argument key to a [IdsFile] with the IDs of the cards to be displayed */
280280
const val CARD_IDS_FILE_ARG = "cardIdsFile"
281281

282282
fun getIntent(
283283
context: Context,
284-
previewerIdsFile: PreviewerIdsFile,
284+
idsFile: IdsFile,
285285
currentIndex: Int,
286286
): Intent {
287287
val arguments =
288288
bundleOf(
289289
CURRENT_INDEX_ARG to currentIndex,
290-
CARD_IDS_FILE_ARG to previewerIdsFile,
290+
CARD_IDS_FILE_ARG to idsFile,
291291
)
292292
return CardViewerActivity.getIntent(context, PreviewerFragment::class, arguments)
293293
}

AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerViewModel.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import anki.collection.OpChanges
2222
import com.ichi2.anki.CollectionManager.withCol
2323
import com.ichi2.anki.Flag
2424
import com.ichi2.anki.asyncIO
25-
import com.ichi2.anki.browser.PreviewerIdsFile
25+
import com.ichi2.anki.browser.IdsFile
2626
import com.ichi2.anki.cardviewer.CardMediaPlayer
2727
import com.ichi2.anki.cardviewer.SingleCardSide
2828
import com.ichi2.anki.launchCatchingIO
@@ -45,7 +45,7 @@ import kotlinx.coroutines.flow.update
4545
import timber.log.Timber
4646

4747
class PreviewerViewModel(
48-
previewerIdsFile: PreviewerIdsFile,
48+
idsFile: IdsFile,
4949
firstIndex: Int,
5050
cardMediaPlayer: CardMediaPlayer,
5151
) : CardViewerViewModel(cardMediaPlayer),
@@ -54,7 +54,7 @@ class PreviewerViewModel(
5454
val backSideOnly = MutableStateFlow(false)
5555
val isMarked = MutableStateFlow(false)
5656
val flag: MutableStateFlow<Flag> = MutableStateFlow(Flag.NONE)
57-
private val selectedCardIds: List<Long> = previewerIdsFile.getCardIds()
57+
private val selectedCardIds: List<Long> = idsFile.getIds()
5858
val isBackButtonEnabled =
5959
combine(currentIndex, showingAnswer, backSideOnly) { index, showingAnswer, isBackSideOnly ->
6060
index != 0 || (showingAnswer && !isBackSideOnly)
@@ -266,13 +266,13 @@ class PreviewerViewModel(
266266

267267
companion object {
268268
fun factory(
269-
previewerIdsFile: PreviewerIdsFile,
269+
idsFile: IdsFile,
270270
currentIndex: Int,
271271
cardMediaPlayer: CardMediaPlayer,
272272
): ViewModelProvider.Factory =
273273
viewModelFactory {
274274
initializer {
275-
PreviewerViewModel(previewerIdsFile, currentIndex, cardMediaPlayer)
275+
PreviewerViewModel(idsFile, currentIndex, cardMediaPlayer)
276276
}
277277
}
278278
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ class CardBrowserTest : RobolectricTest() {
525525
assertThat("before: index", previewIntent.currentIndex, equalTo(0))
526526
assertThat(
527527
"before: cards",
528-
previewIntent.previewerIdsFile.getCardIds(),
528+
previewIntent.idsFile.getIds(),
529529
equalTo(listOf(cid1, cid2)),
530530
)
531531

@@ -537,7 +537,7 @@ class CardBrowserTest : RobolectricTest() {
537537
assertThat("after: index", intentAfterReverse.currentIndex, equalTo(0))
538538
assertThat(
539539
"after: cards",
540-
intentAfterReverse.previewerIdsFile.getCardIds(),
540+
intentAfterReverse.idsFile.getIds(),
541541
equalTo(listOf(cid2, cid1)),
542542
)
543543
}

AnkiDroid/src/test/java/com/ichi2/anki/browser/CardBrowserViewModelTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ class CardBrowserViewModelTest : JvmTest() {
769769
val data = queryPreviewIntentData()
770770
assertThat(data.currentIndex, equalTo(0))
771771

772-
data.previewerIdsFile.getCardIds().also { actualCardIds ->
772+
data.idsFile.getIds().also { actualCardIds ->
773773
assertThat("previewing a note previews cards", actualCardIds, hasSize(5))
774774

775775
val firstCardIds =
@@ -793,7 +793,7 @@ class CardBrowserViewModelTest : JvmTest() {
793793
runViewModelTest(notes = 2) {
794794
val data = queryPreviewIntentData()
795795
assertThat(data.currentIndex, equalTo(0))
796-
assertThat(data.previewerIdsFile.getCardIds(), hasSize(2))
796+
assertThat(data.idsFile.getIds(), hasSize(2))
797797
}
798798

799799
@Test
@@ -802,7 +802,7 @@ class CardBrowserViewModelTest : JvmTest() {
802802
selectRowsWithPositions(0).also {
803803
val data = queryPreviewIntentData()
804804
assertThat(data.currentIndex, equalTo(0))
805-
assertThat(data.previewerIdsFile.getCardIds(), hasSize(2))
805+
assertThat(data.idsFile.getIds(), hasSize(2))
806806
}
807807

808808
selectNone()
@@ -811,7 +811,7 @@ class CardBrowserViewModelTest : JvmTest() {
811811
selectRowsWithPositions(1).also {
812812
val data = queryPreviewIntentData()
813813
assertThat(data.currentIndex, equalTo(1))
814-
assertThat(data.previewerIdsFile.getCardIds(), hasSize(2))
814+
assertThat(data.idsFile.getIds(), hasSize(2))
815815
}
816816
}
817817

AnkiDroid/src/test/java/com/ichi2/anki/previewer/PreviewerFragmentTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import androidx.test.core.app.ActivityScenario
2121
import androidx.test.espresso.Espresso
2222
import androidx.test.ext.junit.runners.AndroidJUnit4
2323
import com.ichi2.anki.RobolectricTest
24-
import com.ichi2.anki.browser.PreviewerIdsFile
24+
import com.ichi2.anki.browser.IdsFile
2525
import com.ichi2.testutils.createTransientDirectory
2626
import org.hamcrest.MatcherAssert.assertThat
2727
import org.junit.Test
@@ -36,7 +36,7 @@ class PreviewerFragmentTest : RobolectricTest() {
3636
val intent =
3737
PreviewerFragment.getIntent(
3838
targetContext,
39-
previewerIdsFile = PreviewerIdsFile(createTransientDirectory(), note.cardIds(col)),
39+
idsFile = IdsFile(createTransientDirectory(), note.cardIds(col)),
4040
currentIndex = 0,
4141
)
4242

0 commit comments

Comments
 (0)