diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt index e2ead1e43..b57823771 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt @@ -128,6 +128,7 @@ class GroupActivity : DatabaseLockActivity(), searchState.searchParameters.searchQuery = query mGroupViewModel.loadSearchGroup(mDatabase, searchState.searchParameters, + mCurrentGroupState?.groupId, searchState.firstVisibleItem) } } @@ -146,6 +147,7 @@ class GroupActivity : DatabaseLockActivity(), searchState.searchParameters = searchParameters mGroupViewModel.loadSearchGroup(mDatabase, searchState.searchParameters, + mCurrentGroupState?.groupId, searchState.firstVisibleItem) } } @@ -452,6 +454,7 @@ class GroupActivity : DatabaseLockActivity(), finishNodeAction() mGroupViewModel.loadSearchGroup(mDatabase, searchState.searchParameters, + mCurrentGroupState?.groupId, searchState.firstVisibleItem ) } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 303a663d9..00abb32c5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -789,9 +789,10 @@ class Database { } fun createVirtualGroupFromSearch(searchParameters: SearchParameters, + fromGroup: NodeId<*>? = null, max: Int = Integer.MAX_VALUE): Group? { return mSearchHelper?.createVirtualGroupWithSearchResult(this, - searchParameters, max) + searchParameters, fromGroup, max) } fun createVirtualGroupFromSearchInfo(searchInfoString: String, @@ -810,7 +811,7 @@ class Database { searchInTags = false searchInTemplates = false searchInRecycleBin = false - }, max) + }, null, max) } val tagPool: Tags diff --git a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt index 4e9a40bb3..9228c65ce 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt @@ -24,6 +24,7 @@ import com.kunzisoft.keepass.database.action.node.NodeHandler import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Entry import com.kunzisoft.keepass.database.element.Group +import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.model.EntryInfo import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_FIELD @@ -37,6 +38,7 @@ class SearchHelper { fun createVirtualGroupWithSearchResult(database: Database, searchParameters: SearchParameters, + fromGroup: NodeId<*>? = null, max: Int): Group? { val searchGroup = database.createGroup(virtual = true) @@ -44,7 +46,13 @@ class SearchHelper { // Search all entries incrementEntry = 0 - database.rootGroup?.doForEachChild( + + val startGroup = if (searchParameters.searchInCurrentGroup && fromGroup != null) { + database.getGroupById(fromGroup) ?: database.rootGroup + } else { + database.rootGroup + } + startGroup?.doForEachChild( object : NodeHandler() { override fun operate(node: Entry): Boolean { if (incrementEntry >= max) @@ -202,7 +210,6 @@ class SearchHelper { // TODO Search settings var regularExpression = false var removeAccents = true <- Too much time, to study - var searchOnlyInCurrentGroup = false */ return stringToCheck.isNotEmpty() && stringToCheck.contains( diff --git a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt index fa5347b4b..883c76b69 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt @@ -28,6 +28,8 @@ import android.os.Parcelable class SearchParameters() : Parcelable{ var searchQuery: String = "" + var searchInCurrentGroup = false + var caseSensitive = false var excludeExpired = false @@ -46,6 +48,7 @@ class SearchParameters() : Parcelable{ constructor(parcel: Parcel) : this() { searchQuery = parcel.readString() ?: searchQuery + searchInCurrentGroup = parcel.readByte() != 0.toByte() caseSensitive = parcel.readByte() != 0.toByte() excludeExpired = parcel.readByte() != 0.toByte() searchInTitles = parcel.readByte() != 0.toByte() @@ -63,6 +66,7 @@ class SearchParameters() : Parcelable{ override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(searchQuery) + parcel.writeByte(if (searchInCurrentGroup) 1 else 0) parcel.writeByte(if (caseSensitive) 1 else 0) parcel.writeByte(if (excludeExpired) 1 else 0) parcel.writeByte(if (searchInTitles) 1 else 0) diff --git a/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt b/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt index f1e595e2c..a931f75ef 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/SearchFiltersView.kt @@ -21,6 +21,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, private var searchAdvanceFiltersContainer: ViewGroup private var searchExpandButton: ImageView private var searchNumbers: TextView + private var searchCurrentGroup: CompoundButton private var searchCaseSensitive: CompoundButton private var searchExpires: CompoundButton private var searchTitle: CompoundButton @@ -37,6 +38,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, var searchParameters = SearchParameters() get() { return field.apply { + this.searchInCurrentGroup = searchCurrentGroup.isChecked this.caseSensitive = searchCaseSensitive.isChecked this.excludeExpired = !(searchExpires.isChecked) this.searchInTitles = searchTitle.isChecked @@ -55,6 +57,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, field = value val tempListener = onParametersChangeListener onParametersChangeListener = null + searchCurrentGroup.isChecked = value.searchInCurrentGroup searchCaseSensitive.isChecked = value.caseSensitive searchExpires.isChecked = !value.excludeExpired searchTitle.isChecked = value.searchInTitles @@ -80,6 +83,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, searchAdvanceFiltersContainer = findViewById(R.id.search_advance_filters) searchExpandButton = findViewById(R.id.search_expand) searchNumbers = findViewById(R.id.search_numbers) + searchCurrentGroup = findViewById(R.id.search_chip_current_group) searchCaseSensitive = findViewById(R.id.search_chip_case_sensitive) searchExpires = findViewById(R.id.search_chip_expires) searchTitle = findViewById(R.id.search_chip_title) @@ -105,6 +109,10 @@ class SearchFiltersView @JvmOverloads constructor(context: Context, } } + searchCurrentGroup.setOnCheckedChangeListener { _, isChecked -> + searchParameters.searchInCurrentGroup = isChecked + onParametersChangeListener?.invoke(searchParameters) + } searchCaseSensitive.setOnCheckedChangeListener { _, isChecked -> searchParameters.caseSensitive = isChecked onParametersChangeListener?.invoke(searchParameters) diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/GroupViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/GroupViewModel.kt index 36c39a5aa..ccc67bcdb 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/GroupViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/GroupViewModel.kt @@ -69,11 +69,13 @@ class GroupViewModel: ViewModel() { fun loadSearchGroup(database: Database?, searchParameters: SearchParameters, + fromGroup: NodeId<*>?, showFromPosition: Int?) { IOActionTask( { database?.createVirtualGroupFromSearch( searchParameters, + fromGroup, SearchHelper.MAX_SEARCH_ENTRY ) }, diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d9cdafb43..1c67f6521 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -34,6 +34,6 @@ 0dp 1 160dp - 260dp + 280dp 260 \ No newline at end of file