aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt
diff options
context:
space:
mode:
authorGigahawk <jasperchan515@gmail.com>2020-02-19 22:19:09 -0800
committerGitHub <noreply@github.com>2020-02-20 11:49:09 +0530
commit9255583f2d0e5cfb7a88ee54ceb4f5284d41cbfa (patch)
tree2ff407f6dfab39254d2a79561f0520a21351893a /app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt
parentbcdc43b1f1d4dbfbf3014a084c0b0c0ee5aa8207 (diff)
downloadHardenedPass-9255583f2d0e5cfb7a88ee54ceb4f5284d41cbfa.tar.gz
HardenedPass-9255583f2d0e5cfb7a88ee54ceb4f5284d41cbfa.zip
Better UI flow (#630)
* Filter against entire pathname when searching * Add option to directly open search dialog on start * Replace basic search filter with fuzzy search * Update CHANGELOG Signed-off-by: Harsh Shandilya <me@msfjarvis.dev> * Open search in onResume, force search icon to always show * Add option to always search from root directory Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt31
1 files changed, 28 insertions, 3 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt
index dc3331d2..ad01000c 100644
--- a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt
@@ -24,7 +24,6 @@ import com.zeapo.pwdstore.utils.PasswordRepository.Companion.getPasswords
import com.zeapo.pwdstore.utils.PasswordRepository.Companion.getRepositoryDirectory
import com.zeapo.pwdstore.utils.PasswordRepository.PasswordSortOrder.Companion.getSortOrder
import java.io.File
-import java.util.Locale
import java.util.Stack
import me.zhanghai.android.fastscroll.FastScrollerBuilder
@@ -157,11 +156,37 @@ class PasswordFragment : Fragment() {
if (filter.isEmpty()) {
refreshAdapter()
} else {
- recursiveFilter(filter, if (pathStack.isEmpty()) null else pathStack.peek())
+ recursiveFilter(
+ filter,
+ if (pathStack.isEmpty() ||
+ settings.getBoolean("search_from_root", false))
+ null
+ else pathStack.peek())
}
}
/**
+ * fuzzy matches the filter against the given string
+ *
+ * based on https://www.forrestthewoods.com/blog/reverse_engineering_sublime_texts_fuzzy_match/
+ *
+ * @param filter the filter to apply
+ * @param str the string to filter against
+ *
+ * @return true if the filter fuzzymatches the string
+ */
+ private fun fuzzyMatch(filter: String, str: String): Boolean {
+ var i = 0
+ var j = 0
+ while (i < filter.length && j < str.length) {
+ if (filter[i].isWhitespace() || filter[i].toLowerCase() == str[j].toLowerCase())
+ i++
+ j++
+ }
+ return i == filter.length
+ }
+
+ /**
* recursively filters a directory and extract all the matching items
*
* @param filter the filter to apply
@@ -177,7 +202,7 @@ class PasswordFragment : Fragment() {
if (item.type == PasswordItem.TYPE_CATEGORY && rec) {
recursiveFilter(filter, item.file)
}
- val matches = item.toString().toLowerCase(Locale.ROOT).contains(filter.toLowerCase(Locale.ROOT))
+ val matches = fuzzyMatch(filter, item.longName)
val inAdapter = recyclerAdapter.values.contains(item)
if (matches && !inAdapter) {
recyclerAdapter.add(item)