Skip to content

Commit b4a1400

Browse files
lukstbitdavid-allison
authored andcommitted
Remove unused DeckSpinnerSelection class
This commit also consolidates the previous multiple declared ALL_DECKS_ID(from DeckSpinnerSelection and DeckSelectionDialog) into a single top level constant.
1 parent 4f8b4d8 commit b4a1400

File tree

7 files changed

+26
-184
lines changed

7 files changed

+26
-184
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ open class CardBrowser :
595595
registerReceiver()
596596

597597
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
598-
updateAppBarInfo(viewModel.deckId ?: DeckSpinnerSelection.ALL_DECKS_ID)
598+
updateAppBarInfo(viewModel.deckId ?: ALL_DECKS_ID)
599599
}
600600

601601
override fun onKeyUp(
@@ -1288,7 +1288,7 @@ open class CardBrowser :
12881288
try {
12891289
when (val deckId = viewModel.lastDeckId) {
12901290
null -> getString(R.string.card_browser_unknown_deck_name)
1291-
DeckSpinnerSelection.ALL_DECKS_ID -> getString(R.string.card_browser_all_decks)
1291+
ALL_DECKS_ID -> getString(R.string.card_browser_all_decks)
12921292
else -> getColUnsafe.decks.name(deckId)
12931293
}
12941294
} catch (e: Exception) {
@@ -1357,7 +1357,7 @@ open class CardBrowser :
13571357
launchCatchingTask {
13581358
val deckName =
13591359
when (deckId) {
1360-
DeckSpinnerSelection.ALL_DECKS_ID -> getString(R.string.card_browser_all_decks)
1360+
ALL_DECKS_ID -> getString(R.string.card_browser_all_decks)
13611361
else -> withCol { decks.getLegacy(deckId)?.name }
13621362
}
13631363
findViewById<TextView>(R.id.deck_name)?.text = deckName

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

Lines changed: 9 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -15,180 +15,23 @@
1515
*/
1616
package com.ichi2.anki
1717

18-
import android.view.MotionEvent
19-
import android.view.View
20-
import android.widget.Spinner
21-
import androidx.appcompat.app.AppCompatActivity
2218
import androidx.fragment.app.Fragment
2319
import com.ichi2.anki.CollectionManager.withCol
24-
import com.ichi2.anki.common.utils.annotation.KotlinCleanup
2520
import com.ichi2.anki.dialogs.DeckSelectionDialog
26-
import com.ichi2.anki.dialogs.DeckSelectionDialog.DeckCreationListener
27-
import com.ichi2.anki.libanki.Collection
2821
import com.ichi2.anki.libanki.DeckId
29-
import com.ichi2.anki.libanki.DeckNameId
3022
import com.ichi2.anki.model.SelectableDeck
31-
import com.ichi2.anki.model.SelectableDeck.Companion.fromCollection
32-
import com.ichi2.anki.utils.showDialogFragmentImpl
33-
import com.ichi2.anki.widgets.DeckDropDownAdapter
34-
import com.ichi2.utils.FragmentManagerSupplier
35-
import com.ichi2.utils.asFragmentManagerSupplier
36-
import timber.log.Timber
23+
24+
// TODO left for this class:
25+
// - extract the TextView used as the deck name into own layout for easier reuse(note:
26+
// NoteEditorFragment usage looks slightly different)
27+
// - remove duplication in *.startDeckSelection() methods code
28+
// - rename(probably DeckSelection.kt or DeckSelectionUtil.kt) and move this class to a more
29+
// suitable package(probably com.ichi2.anki.utils)
3730

3831
/**
39-
* Handles expansion of a [Spinner], allowing a press to display a [DeckSelectionDialog]
40-
* Responsible for filtering the decks to display in the [DeckSelectionDialog]
41-
*
42-
* Populates the spinner with data, and handles display of the selected deck within the spinner control
43-
*
44-
* @param spinner
45-
* The spinner displayed in the activity.
46-
* Empty at construction. After initialization, it contains in this order:
47-
* 1. "All decks" if [showAllDecks] is true
48-
* 2. All decks from [dropDownDecks].
49-
* @param showAllDecks Whether the deck selection should allow "All Decks" as an option
50-
* @param alwaysShowDefault If true, never hide the default deck. If false, match [DeckPicker]'s logic
51-
* @param showFilteredDecks whether to show filtered decks
32+
* [DeckId] constant to represent "All decks" in screens that need it(ex. browser).
5233
*/
53-
@KotlinCleanup(
54-
"this class is a mess: showAllDecks, AND the adapter seems overly complicated as " +
55-
"only the selected item is visible",
56-
)
57-
class DeckSpinnerSelection(
58-
private val context: AppCompatActivity,
59-
private val spinner: Spinner,
60-
private val showAllDecks: Boolean,
61-
private val alwaysShowDefault: Boolean,
62-
private val showFilteredDecks: Boolean,
63-
private val fragmentManagerSupplier: FragmentManagerSupplier = context.asFragmentManagerSupplier(),
64-
) {
65-
private var deckDropDownAdapter: DeckDropDownAdapter? = null
66-
67-
// This should be deckDropDownAdapter.decks
68-
// but this class also handles initializeNoteEditorDeckSpinner, so this can't happen yet
69-
private var dropDownDecks: MutableList<DeckNameId>? = null
70-
71-
/** @return All decks. */
72-
private fun computeDropDownDecks(
73-
col: Collection,
74-
includeFiltered: Boolean,
75-
): List<DeckNameId> = col.decks.allNamesAndIds(includeFiltered = includeFiltered)
76-
77-
private fun setSpinnerListener() {
78-
spinner.setOnTouchListener { _: View?, motionEvent: MotionEvent ->
79-
if (motionEvent.action == MotionEvent.ACTION_UP) {
80-
context.launchCatchingTask { displayDeckSelectionDialog() }
81-
}
82-
true
83-
}
84-
setSpinnerVisibility(View.VISIBLE)
85-
}
86-
87-
/**
88-
* Move the selected deck in the spinner to [deckId].
89-
* Timber if [deckId] is not an id of a known deck.
90-
* @param deckId The ID of the deck to select
91-
*/
92-
fun updateDeckPosition(deckId: DeckId) {
93-
// TODO: This doesn't handle ALL_DECKS
94-
val position = dropDownDecks?.map { it.id }?.indexOf(deckId) ?: -1
95-
if (position != -1) {
96-
spinner.setSelection(position)
97-
} else {
98-
Timber.w("updateDeckPosition() error :: deckId=%d, position=%d", deckId, position)
99-
}
100-
}
101-
102-
fun notifyDataSetChanged() {
103-
deckDropDownAdapter!!.notifyDataSetChanged()
104-
}
105-
106-
fun setEnabledActionBarSpinner(enabled: Boolean) {
107-
spinner.isEnabled = enabled
108-
}
109-
110-
fun setSpinnerVisibility(view: Int) {
111-
spinner.visibility = view
112-
}
113-
114-
/**
115-
* Iterates the drop down decks, and selects the one matching the given id.
116-
* @param deckId The deck id to be selected.
117-
* @param setAsCurrentDeck If true, deckId will be set as the current deck id of Collection
118-
* (this means the deck selected here will continue to appear in any future Activity whose
119-
* display data is loaded from Collection's current deck). If false, deckId will not be set as
120-
* the current deck id of Collection.
121-
* @return True if selection succeeded.
122-
*/
123-
suspend fun selectDeckById(
124-
deckId: DeckId,
125-
setAsCurrentDeck: Boolean,
126-
): Boolean =
127-
if (deckId == ALL_DECKS_ID || this.dropDownDecks == null) {
128-
selectAllDecks()
129-
} else {
130-
selectDeck(deckId, setAsCurrentDeck)
131-
}
132-
133-
/**
134-
* select in the spinner deck with id
135-
* @param deckId The deck id to search (not ALL_DECKS_ID)
136-
* @param setAsCurrentDeck whether this deck should be selected in the collection (if it exists)
137-
* @return whether it was found
138-
*/
139-
private suspend fun selectDeck(
140-
deckId: DeckId,
141-
setAsCurrentDeck: Boolean,
142-
): Boolean {
143-
val deck = this.dropDownDecks?.withIndex()?.firstOrNull { it.value.id == deckId } ?: return false
144-
val position = if (showAllDecks) deck.index + 1 else deck.index
145-
spinner.setSelection(position)
146-
if (setAsCurrentDeck) {
147-
withCol { decks.select(deckId) }
148-
}
149-
return true
150-
}
151-
152-
/**
153-
* Select all decks. Must be called only if [showAllDecks].
154-
* @return whether selection was a success.
155-
*/
156-
fun selectAllDecks(): Boolean {
157-
if (!showAllDecks) {
158-
CrashReportService.sendExceptionReport(
159-
"selectAllDecks was called while `showAllDecks is false`",
160-
"DeckSpinnerSelection:selectAllDecks",
161-
)
162-
return false
163-
}
164-
spinner.setSelection(0)
165-
return true
166-
}
167-
168-
/**
169-
* Displays a [DeckSelectionDialog]
170-
*/
171-
suspend fun displayDeckSelectionDialog() {
172-
val decks: MutableList<SelectableDeck> = fromCollection(includeFiltered = showFilteredDecks).toMutableList()
173-
if (showAllDecks) {
174-
decks.add(SelectableDeck.AllDecks)
175-
}
176-
val dialog = DeckSelectionDialog.newInstance(context.getString(R.string.search_deck), null, false, decks)
177-
// TODO: retain state after onDestroy
178-
dialog.deckCreationListener = DeckCreationListener { onDeckAdded(it) }
179-
showDialogFragmentImpl(fragmentManagerSupplier.getFragmentManager(), dialog)
180-
}
181-
182-
private fun onDeckAdded(deck: DeckNameId) {
183-
Timber.d("added deck %s to spinner", deck)
184-
deckDropDownAdapter?.addDeck(deck)
185-
dropDownDecks?.add(deck)
186-
}
187-
188-
companion object {
189-
const val ALL_DECKS_ID = 0L
190-
}
191-
}
34+
const val ALL_DECKS_ID = 0L
19235

19336
/**
19437
* Displays a [DeckSelectionDialog] for the user to select a deck, with the list of displayed decks

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ import anki.collection.OpChangesWithCount
3434
import anki.config.ConfigKey
3535
import anki.search.BrowserColumns
3636
import anki.search.BrowserRow
37+
import com.ichi2.anki.ALL_DECKS_ID
3738
import com.ichi2.anki.AnkiDroidApp
3839
import com.ichi2.anki.CollectionManager
3940
import com.ichi2.anki.CollectionManager.TR
4041
import com.ichi2.anki.CollectionManager.withCol
4142
import com.ichi2.anki.CrashReportService
42-
import com.ichi2.anki.DeckSpinnerSelection.Companion.ALL_DECKS_ID
4343
import com.ichi2.anki.Flag
4444
import com.ichi2.anki.PreviewerDestination
4545
import com.ichi2.anki.browser.CardBrowserViewModel.ChangeMultiSelectMode.MultiSelectCause

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import androidx.recyclerview.widget.DividerItemDecoration
3636
import androidx.recyclerview.widget.LinearLayoutManager
3737
import androidx.recyclerview.widget.RecyclerView
3838
import anki.decks.deckTreeNode
39+
import com.ichi2.anki.ALL_DECKS_ID
3940
import com.ichi2.anki.CollectionManager.withCol
4041
import com.ichi2.anki.OnContextAndLongClickListener.Companion.setOnContextAndLongClickListener
4142
import com.ichi2.anki.R
@@ -436,7 +437,6 @@ open class DeckSelectionDialog : AnalyticsDialogFragment() {
436437
}
437438

438439
companion object {
439-
const val ALL_DECKS_ID = 0L
440440
private const val SUMMARY_MESSAGE = "summaryMessage"
441441
private const val TITLE = "title"
442442
private const val KEEP_RESTORE_DEFAULT_BUTTON = "keepRestoreDefaultButton"

AnkiDroid/src/main/java/com/ichi2/anki/export/ExportDialogFragment.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ import anki.import_export.ExportLimit
3838
import anki.import_export.exportLimit
3939
import anki.notes.noteIds
4040
import com.google.android.material.progressindicator.CircularProgressIndicator
41+
import com.ichi2.anki.ALL_DECKS_ID
4142
import com.ichi2.anki.CollectionManager
4243
import com.ichi2.anki.CollectionManager.withCol
43-
import com.ichi2.anki.DeckSpinnerSelection
4444
import com.ichi2.anki.R
4545
import com.ichi2.anki.common.annotations.NeedsTest
4646
import com.ichi2.anki.common.time.TimeManager
@@ -153,7 +153,7 @@ class ExportDialogFragment : DialogFragment() {
153153
mutableListOf(
154154
DeckNameId(
155155
requireActivity().getString(R.string.card_browser_all_decks),
156-
DeckSpinnerSelection.ALL_DECKS_ID,
156+
ALL_DECKS_ID,
157157
),
158158
)
159159
allDecks.addAll(withCol { decks.allNamesAndIds(false) })
@@ -420,7 +420,7 @@ class ExportDialogFragment : DialogFragment() {
420420
val deckNameId =
421421
(deckSelector.adapter as DeckDisplayAdapter)
422422
.getItem(deckSelector.selectedItemPosition)
423-
if (deckNameId.id == DeckSpinnerSelection.ALL_DECKS_ID) {
423+
if (deckNameId.id == ALL_DECKS_ID) {
424424
exportLimit { this.wholeCollection = Empty.getDefaultInstance() }
425425
} else {
426426
exportLimit { this.deckId = deckNameId.id }

AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialog.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ import com.google.android.material.button.MaterialButton
3939
import com.google.android.material.textfield.TextInputLayout
4040
import com.google.android.material.timepicker.MaterialTimePicker
4141
import com.google.android.material.timepicker.TimeFormat
42+
import com.ichi2.anki.ALL_DECKS_ID
4243
import com.ichi2.anki.CollectionManager.withCol
43-
import com.ichi2.anki.DeckSpinnerSelection
4444
import com.ichi2.anki.R
4545
import com.ichi2.anki.dialogs.ConfirmationDialog
4646
import com.ichi2.anki.isDefaultDeckEmpty
@@ -148,7 +148,7 @@ class AddEditReminderDialog : DialogFragment() {
148148
val selectedDeckId: DeckId =
149149
when (selectedDeck) {
150150
is SelectableDeck.Deck -> selectedDeck.deckId
151-
is SelectableDeck.AllDecks -> DeckSpinnerSelection.ALL_DECKS_ID
151+
is SelectableDeck.AllDecks -> ALL_DECKS_ID
152152
else -> Consts.DEFAULT_DECK_ID
153153
}
154154
viewModel.setDeckSelected(selectedDeckId)
@@ -205,14 +205,14 @@ class AddEditReminderDialog : DialogFragment() {
205205
private suspend fun getValidDeckSelection(): Pair<DeckId, String> {
206206
suspend fun getFallbackSelection(): Pair<DeckId, String> =
207207
if (isDefaultDeckEmpty()) {
208-
Pair(DeckSpinnerSelection.ALL_DECKS_ID, getString(R.string.card_browser_all_decks))
208+
Pair(ALL_DECKS_ID, getString(R.string.card_browser_all_decks))
209209
} else {
210210
Pair(Consts.DEFAULT_DECK_ID, withCol { decks.name(Consts.DEFAULT_DECK_ID) })
211211
}
212212

213213
val currentlySelectedDeckID = viewModel.deckSelected.value
214214
return when (currentlySelectedDeckID) {
215-
DeckSpinnerSelection.ALL_DECKS_ID -> Pair(DeckSpinnerSelection.ALL_DECKS_ID, getString(R.string.card_browser_all_decks))
215+
ALL_DECKS_ID -> Pair(ALL_DECKS_ID, getString(R.string.card_browser_all_decks))
216216
Consts.DEFAULT_DECK_ID -> getFallbackSelection()
217217
null -> getFallbackSelection()
218218
else -> {

AnkiDroid/src/main/java/com/ichi2/anki/reviewreminders/AddEditReminderDialogViewModel.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import androidx.lifecycle.LiveData
2020
import androidx.lifecycle.MutableLiveData
2121
import androidx.lifecycle.SavedStateHandle
2222
import androidx.lifecycle.ViewModel
23-
import com.ichi2.anki.DeckSpinnerSelection
23+
import com.ichi2.anki.ALL_DECKS_ID
2424
import com.ichi2.anki.libanki.Consts
2525
import com.ichi2.anki.libanki.DeckId
2626
import timber.log.Timber
@@ -62,22 +62,21 @@ class AddEditReminderDialogViewModel(
6262
when (dialogMode) {
6363
is AddEditReminderDialog.DialogMode.Add -> {
6464
when (dialogMode.schedulerScope) {
65-
is ReviewReminderScope.Global -> DeckSpinnerSelection.ALL_DECKS_ID
65+
is ReviewReminderScope.Global -> ALL_DECKS_ID
6666
is ReviewReminderScope.DeckSpecific -> dialogMode.schedulerScope.did
6767
}
6868
}
6969
is AddEditReminderDialog.DialogMode.Edit -> {
7070
when (dialogMode.reminderToBeEdited.scope) {
71-
is ReviewReminderScope.Global -> DeckSpinnerSelection.ALL_DECKS_ID
71+
is ReviewReminderScope.Global -> ALL_DECKS_ID
7272
is ReviewReminderScope.DeckSpecific -> dialogMode.reminderToBeEdited.scope.did
7373
}
7474
}
7575
},
7676
)
7777

7878
/**
79-
* [com.ichi2.anki.DeckSpinnerSelection.ALL_DECKS_ID] is used to represent All Decks
80-
* (i.e. [ReviewReminderScope.Global]) being selected.
79+
* [ALL_DECKS_ID] is used to represent All Decks (i.e. [ReviewReminderScope.Global]) being selected.
8180
*/
8281
val deckSelected: LiveData<DeckId> = _deckSelected
8382

@@ -126,7 +125,7 @@ class AddEditReminderDialogViewModel(
126125
),
127126
scope =
128127
when (deckSelected.value) {
129-
DeckSpinnerSelection.ALL_DECKS_ID -> ReviewReminderScope.Global
128+
ALL_DECKS_ID -> ReviewReminderScope.Global
130129
else ->
131130
ReviewReminderScope.DeckSpecific(
132131
did = deckSelected.value ?: Consts.DEFAULT_DECK_ID,

0 commit comments

Comments
 (0)