Skip to content

Commit 4d8e810

Browse files
committed
refactor(deck-picker): instantiating context menus
Extract the logic from the DeckPicker - the menus should be responsible for querying their required data suspend factory methods are a better abstraction `bundleOf()` will be deprecated, so remove a few instances `withCol { decks.select(deckId) }` remains as this is a Deck Picker concern - this shows the visual change of the deck when long-pressed Assisted-by: Claude Opus 4.6
1 parent 738ec21 commit 4d8e810

3 files changed

Lines changed: 46 additions & 51 deletions

File tree

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

Lines changed: 10 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -448,49 +448,25 @@ open class DeckPicker :
448448
}
449449
}
450450

451-
private fun showDeckPickerContextMenu(deckId: DeckId) {
451+
private fun showDeckPickerContextMenu(deckId: DeckId) =
452452
launchCatchingTask {
453-
val (deckName, isDynamic, hasBuriedInDeck) =
454-
withCol {
455-
decks.select(deckId)
456-
Triple(
457-
decks.name(deckId),
458-
decks.isFiltered(deckId),
459-
sched.haveBuried(),
460-
)
461-
}
453+
withCol { decks.select(deckId) }
454+
val menu = DeckPickerContextMenu.newInstance(deckId)
462455
CardBrowser.clearLastDeckId()
463456
updateDeckList()
464-
showDialogFragment(
465-
DeckPickerContextMenu.newInstance(
466-
id = deckId,
467-
name = deckName,
468-
isDynamic = isDynamic,
469-
hasBuriedInDeck = hasBuriedInDeck,
470-
),
471-
)
457+
showDialogFragment(menu)
472458
}
473-
}
474459

475460
private fun showDeckPickerRightClickContextMenu(
476461
deckId: DeckId,
477462
x: Float,
478463
y: Float,
479-
) {
480-
launchCatchingTask {
481-
val (isDynamic, hasBuriedInDeck) =
482-
withCol {
483-
decks.select(deckId)
484-
Pair(
485-
decks.isFiltered(deckId),
486-
sched.haveBuried(),
487-
)
488-
}
489-
updateDeckList()
490-
val menuContentProvider = DeckPickerMenuContentProvider(deckId, isDynamic, hasBuriedInDeck, this@DeckPicker)
491-
mouseContextMenuHandler = MouseContextMenuHandler(deckPickerBinding.deckPickerContent, menuContentProvider)
492-
mouseContextMenuHandler.showContextMenu(deckPickerBinding.decks, x, y)
493-
}
464+
) = launchCatchingTask {
465+
withCol { decks.select(deckId) }
466+
val menuContentProvider = DeckPickerMenuContentProvider.newInstance(deckId, this@DeckPicker)
467+
updateDeckList()
468+
mouseContextMenuHandler = MouseContextMenuHandler(deckPickerBinding.deckPickerContent, menuContentProvider)
469+
mouseContextMenuHandler.showContextMenu(deckPickerBinding.decks, x, y)
494470
}
495471

496472
// ----------------------------------------------------------------------------

AnkiDroid/src/main/java/com/ichi2/anki/contextmenu/DeckPickerMenuContentProvider.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.ichi2.anki.contextmenu
1818

1919
import android.view.Menu
2020
import android.view.MenuItem
21+
import com.ichi2.anki.CollectionManager.withCol
2122
import com.ichi2.anki.DeckPicker
2223
import com.ichi2.anki.dialogs.DeckPickerContextMenu
2324
import com.ichi2.anki.dialogs.DeckPickerContextMenuResult
@@ -61,6 +62,23 @@ class DeckPickerMenuContentProvider(
6162
private fun createOptionsList(): List<DeckPickerContextMenu.DeckPickerContextMenuOption> = createOptionsList(isDynamic, hasBuriedInDeck)
6263

6364
companion object {
65+
/**
66+
* Builds a [DeckPickerMenuContentProvider] for [deckId], reading the dynamic /
67+
* has-buried flags from the collection.
68+
*/
69+
suspend fun newInstance(
70+
deckId: DeckId,
71+
deckPicker: DeckPicker,
72+
): DeckPickerMenuContentProvider =
73+
withCol {
74+
DeckPickerMenuContentProvider(
75+
id = deckId,
76+
isDynamic = decks.isFiltered(deckId),
77+
hasBuriedInDeck = sched.haveBuried(),
78+
deckPicker = deckPicker,
79+
)
80+
}
81+
6482
fun createOptionsList(
6583
isDynamic: Boolean,
6684
hasBuriedInDeck: Boolean,

AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ import android.os.Bundle
2020
import androidx.annotation.StringRes
2121
import androidx.annotation.VisibleForTesting
2222
import androidx.appcompat.app.AlertDialog
23-
import androidx.core.os.bundleOf
2423
import androidx.fragment.app.FragmentActivity
2524
import androidx.fragment.app.FragmentManager
25+
import com.ichi2.anki.CollectionManager.withCol
2626
import com.ichi2.anki.R
2727
import com.ichi2.anki.analytics.AnalyticsDialogFragment
2828
import com.ichi2.anki.compat.CompatHelper.Companion.getSerializableCompat
@@ -81,6 +81,23 @@ class DeckPickerContextMenu : AnalyticsDialogFragment() {
8181
}
8282

8383
companion object {
84+
/**
85+
* Builds a [DeckPickerContextMenu] for [deckId], reading the deck's name and
86+
* the dynamic / has-buried flags from the collection.
87+
*/
88+
suspend fun newInstance(deckId: DeckId): DeckPickerContextMenu =
89+
withCol {
90+
DeckPickerContextMenu().apply {
91+
arguments =
92+
Bundle().apply {
93+
putLong(ARG_DECK_ID, deckId)
94+
putString(ARG_DECK_NAME, decks.name(deckId))
95+
putBoolean(ARG_DECK_IS_DYN, decks.isFiltered(deckId))
96+
putBoolean(ARG_DECK_HAS_BURIED_IN_DECK, sched.haveBuried())
97+
}
98+
}
99+
}
100+
84101
@VisibleForTesting
85102
const val ARG_DECK_ID = "arg_deck_id"
86103

@@ -92,22 +109,6 @@ class DeckPickerContextMenu : AnalyticsDialogFragment() {
92109

93110
@VisibleForTesting
94111
const val ARG_DECK_HAS_BURIED_IN_DECK = "arg_deck_has_buried_in_deck"
95-
96-
fun newInstance(
97-
id: DeckId,
98-
name: String,
99-
isDynamic: Boolean,
100-
hasBuriedInDeck: Boolean,
101-
): DeckPickerContextMenu =
102-
DeckPickerContextMenu().apply {
103-
arguments =
104-
bundleOf(
105-
ARG_DECK_ID to id,
106-
ARG_DECK_NAME to name,
107-
ARG_DECK_IS_DYN to isDynamic,
108-
ARG_DECK_HAS_BURIED_IN_DECK to hasBuriedInDeck,
109-
)
110-
}
111112
}
112113
}
113114

0 commit comments

Comments
 (0)