0
0
mirror of https://github.com/ankidroid/Anki-Android.git synced 2024-09-20 12:02:16 +02:00

Fix expand state not updating in V16

This regressed in 9644f5724c

+ Fix incorrect private find() implementation in CardContentProvider, and
move into shared file.

Closes #11999
This commit is contained in:
Damien Elmes 2022-08-11 09:36:06 +10:00 committed by Mike Hardy
parent cfb21276ad
commit c69f273496
3 changed files with 26 additions and 10 deletions

View File

@ -99,7 +99,9 @@ import com.ichi2.libanki.*
import com.ichi2.libanki.Collection.CheckDatabaseResult
import com.ichi2.libanki.importer.AnkiPackageImporter
import com.ichi2.libanki.sched.AbstractDeckTreeNode
import com.ichi2.libanki.sched.DeckDueTreeNode
import com.ichi2.libanki.sched.TreeNode
import com.ichi2.libanki.sched.findInDeckTree
import com.ichi2.libanki.sync.CustomSyncServerUrlException
import com.ichi2.libanki.sync.Syncer.ConnectionResultType
import com.ichi2.libanki.utils.TimeManager
@ -1016,9 +1018,16 @@ open class DeckPicker :
}
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
@RustCleanup("make mDueTree a concrete DeckDueTreeNode")
@Suppress("UNCHECKED_CAST")
fun toggleDeckExpand(did: DeckId) {
if (!col.decks.children(did).isEmpty()) {
// update DB
col.decks.collapse(did)
// update stored state
findInDeckTree(mDueTree!! as List<TreeNode<DeckDueTreeNode>>, did)?.run {
collapsed = !collapsed
}
renderPage()
dismissAllDialogFragments()
}

View File

@ -38,6 +38,7 @@ import com.ichi2.libanki.exception.EmptyMediaException
import com.ichi2.libanki.sched.AbstractSched
import com.ichi2.libanki.sched.DeckDueTreeNode
import com.ichi2.libanki.sched.TreeNode
import com.ichi2.libanki.sched.findInDeckTree
import com.ichi2.libanki.utils.TimeManager
import com.ichi2.utils.FileUtil.internalizeUri
import com.ichi2.utils.JSONArray
@ -390,16 +391,7 @@ class CardContentProvider : ContentProvider() {
val rv = MatrixCursor(columns, 1)
val allDecks = col.sched.deckDueTree()
val desiredDeckId = uri.pathSegments[1].toLong()
fun find(nodeList: List<TreeNode<DeckDueTreeNode>>, id: Long): DeckDueTreeNode? {
for (node in nodeList) {
if (node.value.did == id) {
return node.value
}
return find(node.children, id)
}
return null
}
find(allDecks, desiredDeckId)?.let {
findInDeckTree(allDecks, desiredDeckId)?.let {
addDeckToCursor(it.did, it.fullDeckName, getDeckCountsFromDueTreeNode(it), rv, col, columns)
}
rv

View File

@ -117,3 +117,18 @@ class DeckDueTreeNode(
return revCount > 0 || newCount > 0 || lrnCount > 0
}
}
/** Locate node with a given deck ID in a list of nodes.
*
* This could be converted into a method if AnkiDroid returned a top-level
* node instead of a list of nodes.
*/
fun findInDeckTree(nodes: List<TreeNode<DeckDueTreeNode>>, deckId: Long): DeckDueTreeNode? {
for (node in nodes) {
if (node.value.did == deckId) {
return node.value
}
return findInDeckTree(node.children, deckId) ?: continue
}
return null
}