diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/PasswordFragment.kt | 31 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/PasswordStore.kt | 8 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt | 2 | ||||
-rw-r--r-- | app/src/main/res/menu/main_menu.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/values/strings.xml | 4 | ||||
-rw-r--r-- | app/src/main/res/xml/preference.xml | 10 |
6 files changed, 52 insertions, 5 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) diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.kt b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.kt index 137f4bea..14d039ce 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.kt +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.kt @@ -142,6 +142,11 @@ class PasswordStore : AppCompatActivity() { } else { checkLocalRepository() } + if (settings.getBoolean("search_on_start", false) && ::searchItem.isInitialized) { + if (!searchItem.isActionViewExpanded) { + searchItem.expandActionView() + } + } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { @@ -183,6 +188,9 @@ class PasswordStore : AppCompatActivity() { return true } }) + if (settings.getBoolean("search_on_start", false)) { + searchItem.expandActionView() + } return super.onCreateOptionsMenu(menu) } diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt index 06608671..8030d976 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.kt @@ -174,7 +174,7 @@ open class PasswordRepository protected constructor() { /** * Gets the password items in the root directory * - * @return a list of passwords in the root direcotyr + * @return a list of passwords in the root directory */ @JvmStatic fun getPasswords(rootDir: File, sortOrder: PasswordSortOrder): ArrayList<PasswordItem> { diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index 85a2219f..2e126d33 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -6,7 +6,7 @@ <item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/ic_search_white_24dp" - pwstore:showAsAction="ifRoom|collapseActionView" + pwstore:showAsAction="always|collapseActionView" pwstore:actionViewClass="androidx.appcompat.widget.SearchView" /> <!--<item android:id="@+id/menu_add_category"--> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1827ac9..ae8ec622 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -281,4 +281,8 @@ <string name="pref_show_hidden_summary">Include hidden directories in the password list</string> <string name="title_create_folder">Create folder</string> <string name="button_create">Create</string> + <string name="pref_search_on_start">Open search on start</string> + <string name="pref_search_on_start_hint">Open search bar when app is launched</string> + <string name="pref_search_from_root">Always search from root</string> + <string name="pref_search_from_root_hint">Search from root of store regardless of currently open directory</string> </resources> diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index be6b49d6..dfbb44a4 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -82,6 +82,16 @@ android:key="filter_recursively" android:summary="@string/pref_recursive_filter_hint" android:title="@string/pref_recursive_filter" /> + <androidx.preference.CheckBoxPreference + android:defaultValue="false" + android:key="search_on_start" + android:summary="@string/pref_search_on_start_hint" + android:title="@string/pref_search_on_start" /> + <androidx.preference.CheckBoxPreference + android:defaultValue="false" + android:key="search_from_root" + android:summary="@string/pref_search_from_root_hint" + android:title="@string/pref_search_from_root" /> <androidx.preference.ListPreference android:title="@string/pref_sort_order_title" android:defaultValue="FOLDER_FIRST" |