From 6397feffff0233134e55bb27922105a8c6d52a32 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Mon, 19 Apr 2021 11:11:07 +0200 Subject: [PATCH] Better search backup group implementation --- .../database/element/database/DatabaseKDB.kt | 14 ++----------- .../element/group/GroupVersionedInterface.kt | 21 ++++++++++++++++++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt index 36a3aa046..349d0002d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt @@ -178,19 +178,9 @@ class DatabaseKDB : DatabaseVersioned() { * Retrieve backup group with his name */ private fun retrieveBackup(): GroupKDB? { - var backupGroup: GroupKDB? = null - val groupHandler = object: NodeHandler() { - override fun operate(node: GroupKDB): Boolean { - return if (node.title.equals(BACKUP_FOLDER_TITLE, ignoreCase = true)) { - backupGroup = node - false - } else { - true - } - } + return rootGroup?.searchChildGroup { + it.title.equals(BACKUP_FOLDER_TITLE, ignoreCase = true) } - rootGroup?.doForEachChild(null, groupHandler) - return backupGroup } /** diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt index df245220d..5eac3138d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt @@ -62,8 +62,27 @@ interface GroupVersionedInterface, return false } if (doActionForChild) - group.doForEachChild(entryHandler, groupHandler) + group.doForEachChild(entryHandler, groupHandler, stopIterationWhenGroupHandlerOperateFalse) } return true } + + fun searchChildGroup(criteria: (group: Group) -> Boolean): Group? { + return searchChildGroup(this, criteria) + } + + private fun searchChildGroup(rootGroup: GroupVersionedInterface, + criteria: (group: Group) -> Boolean): Group? { + for (childGroup in rootGroup.getChildGroups()) { + if (criteria.invoke(childGroup)) { + return childGroup + } else { + val subGroup = searchChildGroup(childGroup, criteria) + if (subGroup != null) { + return subGroup + } + } + } + return null + } }