Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package com.ichi2.anki.browser.search

import com.ichi2.anki.Flag
import com.ichi2.anki.libanki.DeckNameId
import com.ichi2.anki.libanki.NoteTypeId
import com.ichi2.anki.libanki.NoteTypeNameID
import com.ichi2.anki.libanki.NotetypeJson

/**
Expand All @@ -27,11 +27,11 @@ import com.ichi2.anki.libanki.NotetypeJson
* As a UI model: the display names of the filters are provided, as well as IDs
*/
data class SearchFilters(
val decks: List<DeckNameId> = emptyList(),
val flags: List<Flag> = emptyList(),
val tags: List<String> = emptyList(),
val noteTypes: List<NoteTypeNameId> = emptyList(),
val cardStates: List<CardState> = emptyList(),
val decks: List<DeckNameId>,
val flags: List<Flag>,
val tags: List<String>,
val noteTypes: List<NoteTypeNameID>,
val cardStates: List<CardState>,
) {
/**
* A list of filters which are using non-default values
Expand All @@ -40,15 +40,28 @@ data class SearchFilters(
*/
val activeFilters by lazy { listOf(decks, flags, tags, noteTypes, cardStates).filter { it.isNotEmpty() } }

data class NoteTypeNameId(
val name: String,
val id: NoteTypeId,
) {
companion object {
fun fromNoteTypeJson(noteTypeJson: NotetypeJson) = NoteTypeNameId(noteTypeJson.name, noteTypeJson.id)
}
}
companion object {
/** An instance of [SearchFilters] with no [active filters][SearchFilters.activeFilters] */
val EMPTY = partial()

// support extensions on the type
companion object
/**
* Creates a [SearchFilters] instance, providing only a subset of filters
*/
// exists so the primary constructor calls break if a parameter is added
fun partial(
decks: List<DeckNameId> = emptyList(),
flags: List<Flag> = emptyList(),
tags: List<String> = emptyList(),
noteTypes: List<NoteTypeNameID> = emptyList(),
cardStates: List<CardState> = emptyList(),
) = SearchFilters(
decks = decks,
flags = flags,
tags = tags,
noteTypes = noteTypes,
cardStates = cardStates,
)
}
}

fun NoteTypeNameID.Companion.fromNoteTypeJson(noteTypeJson: NotetypeJson) = NoteTypeNameID(noteTypeJson.name, noteTypeJson.id)
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import com.ichi2.anki.libanki.SearchJoiner
*/
data class SearchRequest(
val query: String,
val filters: SearchFilters = SearchFilters(),
val filters: SearchFilters = SearchFilters.EMPTY,
) {
/**
* Syntactic sugar for using [copy], to modify [filters]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ import org.junit.Test
class SearchFiltersTest {
@Test
fun `activeFilters is empty by default`() {
val filters = SearchFilters()
val filters = SearchFilters.EMPTY
assertThat(filters.activeFilters, empty())
}

@Test
fun `activeFilters is non-empty if a filter is set`() {
val filters = SearchFilters(decks = listOf(DeckNameId("Default", 1)))
val filters = SearchFilters.partial(decks = listOf(DeckNameId("Default", 1)))
assertThat(filters.activeFilters, not(empty()))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ package com.ichi2.anki.browser.search
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.Flag
import com.ichi2.anki.browser.SearchHistory.SearchHistoryEntry
import com.ichi2.anki.browser.search.SearchFilters.NoteTypeNameId
import com.ichi2.anki.libanki.DeckNameId
import com.ichi2.anki.libanki.NoteTypeNameID
import com.ichi2.anki.libanki.exception.InvalidSearchException
import com.ichi2.anki.libanki.testutils.AnkiTest
import com.ichi2.testutils.EmptyApplication
Expand Down Expand Up @@ -50,7 +50,7 @@ class SearchRequestTest : JvmTest() {

@Test
fun `search string generation - filter only`() {
val entry = SearchRequest(query = "", filters = SearchFilters(decks = col.decks.allNamesAndIds()))
val entry = SearchRequest(query = "", filters = SearchFilters.partial(decks = col.decks.allNamesAndIds()))
assertThat(entry.toValidSearchString(), equalTo("deck:Default"))
}

Expand Down Expand Up @@ -88,7 +88,7 @@ class SearchRequestTest : JvmTest() {
decks = listOf(DeckNameId("Default", 1), DeckNameId("Custom", 2)),
flags = listOf(Flag.RED, Flag.BLUE),
tags = listOf("Hello::World", "tag"),
noteTypes = listOf(SearchFilters.NoteTypeNameId("Basic", 3), SearchFilters.NoteTypeNameId("Advanced", 4)),
noteTypes = listOf(NoteTypeNameID("Basic", 3), NoteTypeNameID("Advanced", 4)),
cardStates =
listOf(
CardState.New,
Expand Down Expand Up @@ -116,7 +116,7 @@ class SearchRequestTest : JvmTest() {
listOf(
col.notetypes.basic,
col.notetypes.cloze,
).map(NoteTypeNameId::fromNoteTypeJson),
).map { NoteTypeNameID.fromNoteTypeJson(it) },
)
}
}
Expand Down
5 changes: 4 additions & 1 deletion libanki/src/main/java/com/ichi2/anki/libanki/Notetypes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,10 @@ import timber.log.Timber
class NoteTypeNameID(
val name: String,
val id: NoteTypeId,
)
) {
// support extension
companion object
}

class Notetypes(
val col: Collection,
Expand Down
Loading