Search through subdomains as parameter #584

This commit is contained in:
J-Jamet
2020-06-10 20:40:01 +02:00
parent ab0cd4152a
commit d0da4f03a6
10 changed files with 55 additions and 13 deletions

View File

@@ -23,9 +23,7 @@ import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.database.search.SearchHelper
@@ -49,9 +47,8 @@ class EntrySelectionLauncherActivity : AppCompatActivity() {
if ("text/plain" == intent.type) { if ("text/plain" == intent.type) {
// Retrieve web domain // Retrieve web domain
intent.getStringExtra(Intent.EXTRA_TEXT)?.let { intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
sharedWebDomain = Uri.parse(it).authority sharedWebDomain = Uri.parse(it).host
} }
} }
} }
else -> {} else -> {}

View File

@@ -63,6 +63,7 @@ import com.kunzisoft.keepass.database.element.node.Type
import com.kunzisoft.keepass.education.GroupActivityEducation import com.kunzisoft.keepass.education.GroupActivityEducation
import com.kunzisoft.keepass.icons.assignDatabaseIcon import com.kunzisoft.keepass.icons.assignDatabaseIcon
import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.model.getSearchString
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_COPY_NODES_TASK import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_COPY_NODES_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_CREATE_GROUP_TASK import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_CREATE_GROUP_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_DELETE_NODES_TASK import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_DELETE_NODES_TASK
@@ -308,7 +309,7 @@ class GroupActivity : LockingActivity(),
if (searchInfo != null) { if (searchInfo != null) {
intent.action = Intent.ACTION_SEARCH intent.action = Intent.ACTION_SEARCH
intent.removeExtra(KEY_SEARCH_INFO) intent.removeExtra(KEY_SEARCH_INFO)
intent.putExtra(SearchManager.QUERY, searchInfo.toString()) intent.putExtra(SearchManager.QUERY, searchInfo.getSearchString(this))
return true return true
} }
return false return false

View File

@@ -404,11 +404,9 @@ class Database {
return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchQuery, SearchParameters(), max) return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchQuery, SearchParameters(), max)
} }
fun createVirtualGroupFromSearch(searchInfo: SearchInfo, fun createVirtualGroupFromSearchInfo(searchInfoString: String,
max: Int = Integer.MAX_VALUE): Group? { max: Int = Integer.MAX_VALUE): Group? {
if (searchInfo.containsOnlyNullValues()) return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchInfoString, SearchParameters().apply {
return null
return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchInfo.toString(), SearchParameters().apply {
searchInTitles = false searchInTitles = false
searchInUserNames = false searchInUserNames = false
searchInPasswords = false searchInPasswords = false

View File

@@ -28,6 +28,7 @@ import com.kunzisoft.keepass.database.search.iterator.EntrySearchStringIteratorK
import com.kunzisoft.keepass.database.search.iterator.EntrySearchStringIteratorKDBX import com.kunzisoft.keepass.database.search.iterator.EntrySearchStringIteratorKDBX
import com.kunzisoft.keepass.model.EntryInfo import com.kunzisoft.keepass.model.EntryInfo
import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.model.getSearchString
import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.timeout.TimeoutHelper
@@ -48,9 +49,13 @@ class SearchHelper(private val isOmitBackup: Boolean) {
if (database.loaded && TimeoutHelper.checkTime(context)) { if (database.loaded && TimeoutHelper.checkTime(context)) {
var searchWithoutUI = false var searchWithoutUI = false
if (PreferencesUtil.isAutofillAutoSearchEnable(context) if (PreferencesUtil.isAutofillAutoSearchEnable(context)
&& searchInfo != null) { && searchInfo != null
&& !searchInfo.containsOnlyNullValues()) {
// If search provide results // If search provide results
database.createVirtualGroupFromSearch(searchInfo, SearchHelper.MAX_SEARCH_ENTRY)?.let { searchGroup -> database.createVirtualGroupFromSearchInfo(
searchInfo.getSearchString(context),
MAX_SEARCH_ENTRY
)?.let { searchGroup ->
if (searchGroup.getNumberOfChildEntries() > 0) { if (searchGroup.getNumberOfChildEntries() > 0) {
searchWithoutUI = true searchWithoutUI = true
onItemsFound.invoke( onItemsFound.invoke(

View File

@@ -1,9 +1,12 @@
package com.kunzisoft.keepass.model package com.kunzisoft.keepass.model
import android.content.Context
import android.content.res.Resources import android.content.res.Resources
import android.os.Parcel import android.os.Parcel
import android.os.Parcelable import android.os.Parcelable
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.utils.ObjectNameResource import com.kunzisoft.keepass.utils.ObjectNameResource
import com.kunzisoft.keepass.utils.UriUtil
class SearchInfo : ObjectNameResource, Parcelable { class SearchInfo : ObjectNameResource, Parcelable {
@@ -88,4 +91,15 @@ class SearchInfo : ObjectNameResource, Parcelable {
} }
} }
} }
}
fun SearchInfo.getSearchString(context: Context): String {
return run {
if (!PreferencesUtil.searchSubdomains(context))
UriUtil.getWebDomainWithoutSubDomain(webDomain)
else
webDomain
}
?: applicationId
?: ""
} }

View File

@@ -97,6 +97,12 @@ object PreferencesUtil {
context.resources.getBoolean(R.bool.auto_focus_search_default)) context.resources.getBoolean(R.bool.auto_focus_search_default))
} }
fun searchSubdomains(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.subdomain_search_key),
context.resources.getBoolean(R.bool.subdomain_search_default))
}
fun showUsernamesListEntries(context: Context): Boolean { fun showUsernamesListEntries(context: Context): Boolean {
val prefs = PreferenceManager.getDefaultSharedPreferences(context) val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.list_entries_show_username_key), return prefs.getBoolean(context.getString(R.string.list_entries_show_username_key),

View File

@@ -86,6 +86,19 @@ object UriUtil {
null null
} }
fun getWebDomainWithoutSubDomain(webDomain: String?): String? {
webDomain?.split(".")?.let { domainArray ->
if (domainArray.isEmpty()) {
return ""
}
if (domainArray.size == 1) {
return domainArray[0];
}
return domainArray[domainArray.size - 2] + "." + domainArray[domainArray.size - 1]
}
return null
}
fun decode(uri: String?): String { fun decode(uri: String?): String {
return Uri.decode(uri) ?: "" return Uri.decode(uri) ?: ""
} }

View File

@@ -67,6 +67,8 @@
<bool name="omit_backup_search_default" translatable="false">true</bool> <bool name="omit_backup_search_default" translatable="false">true</bool>
<string name="auto_focus_search_key" translatable="false">auto_focus_search_key</string> <string name="auto_focus_search_key" translatable="false">auto_focus_search_key</string>
<bool name="auto_focus_search_default" translatable="false">false</bool> <bool name="auto_focus_search_default" translatable="false">false</bool>
<string name="subdomain_search_key" translatable="false">subdomain_search_key</string>
<bool name="subdomain_search_default" translatable="false">false</bool>
<string name="app_timeout_key" translatable="false">app_timeout_key</string> <string name="app_timeout_key" translatable="false">app_timeout_key</string>
<string name="lock_database_screen_off_key" translatable="false">lock_database_screen_off_key</string> <string name="lock_database_screen_off_key" translatable="false">lock_database_screen_off_key</string>
<bool name="lock_database_screen_off_default" translatable="false">true</bool> <bool name="lock_database_screen_off_default" translatable="false">true</bool>

View File

@@ -202,6 +202,8 @@
<string name="omit_backup_search_summary">Omits \"Backup\" and \"Recycle bin\" groups from search results</string> <string name="omit_backup_search_summary">Omits \"Backup\" and \"Recycle bin\" groups from search results</string>
<string name="auto_focus_search_title">Quick search</string> <string name="auto_focus_search_title">Quick search</string>
<string name="auto_focus_search_summary">Request a search when opening a database</string> <string name="auto_focus_search_summary">Request a search when opening a database</string>
<string name="subdomain_search_title">Subdomain search</string>
<string name="subdomain_search_summary">Search web domains with subdomains constraints</string>
<string name="progress_create">Creating new database…</string> <string name="progress_create">Creating new database…</string>
<string name="progress_title">Working…</string> <string name="progress_title">Working…</string>
<string name="protection">Protection</string> <string name="protection">Protection</string>

View File

@@ -59,7 +59,11 @@
android:title="@string/auto_focus_search_title" android:title="@string/auto_focus_search_title"
android:summary="@string/auto_focus_search_summary" android:summary="@string/auto_focus_search_summary"
android:defaultValue="@bool/auto_focus_search_default"/> android:defaultValue="@bool/auto_focus_search_default"/>
<SwitchPreference
android:key="@string/subdomain_search_key"
android:title="@string/subdomain_search_title"
android:summary="@string/subdomain_search_summary"
android:defaultValue="@bool/subdomain_search_default"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory