Search in current group

This commit is contained in:
J-Jamet
2022-02-02 18:32:43 +01:00
parent aa34d78052
commit d4f7258ed1
7 changed files with 30 additions and 5 deletions

View File

@@ -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
)
}

View File

@@ -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

View File

@@ -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<Entry>() {
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(

View File

@@ -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)

View File

@@ -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)

View File

@@ -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
)
},

View File

@@ -34,6 +34,6 @@
<dimen name="hidden_lock_button_size">0dp</dimen>
<dimen name="content_percent">1</dimen>
<dimen name="toolbar_parallax_height">160dp</dimen>
<dimen name="advanced_search_height">260dp</dimen>
<dimen name="advanced_search_height">280dp</dimen>
<integer name="animation_duration">260</integer>
</resources>