diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt
index 6ea936af1..ccae18280 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/EntrySelectionLauncherActivity.kt
@@ -23,9 +23,7 @@ import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
-import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
-import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.search.SearchHelper
@@ -49,9 +47,8 @@ class EntrySelectionLauncherActivity : AppCompatActivity() {
if ("text/plain" == intent.type) {
// Retrieve web domain
intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
- sharedWebDomain = Uri.parse(it).authority
+ sharedWebDomain = Uri.parse(it).host
}
-
}
}
else -> {}
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 50dd998f8..7952b8474 100644
--- a/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/activities/GroupActivity.kt
@@ -63,6 +63,7 @@ import com.kunzisoft.keepass.database.element.node.Type
import com.kunzisoft.keepass.education.GroupActivityEducation
import com.kunzisoft.keepass.icons.assignDatabaseIcon
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_CREATE_GROUP_TASK
import com.kunzisoft.keepass.notifications.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_DELETE_NODES_TASK
@@ -308,7 +309,7 @@ class GroupActivity : LockingActivity(),
if (searchInfo != null) {
intent.action = Intent.ACTION_SEARCH
intent.removeExtra(KEY_SEARCH_INFO)
- intent.putExtra(SearchManager.QUERY, searchInfo.toString())
+ intent.putExtra(SearchManager.QUERY, searchInfo.getSearchString(this))
return true
}
return false
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 18357c23b..70f32c332 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
@@ -404,11 +404,9 @@ class Database {
return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchQuery, SearchParameters(), max)
}
- fun createVirtualGroupFromSearch(searchInfo: SearchInfo,
- max: Int = Integer.MAX_VALUE): Group? {
- if (searchInfo.containsOnlyNullValues())
- return null
- return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchInfo.toString(), SearchParameters().apply {
+ fun createVirtualGroupFromSearchInfo(searchInfoString: String,
+ max: Int = Integer.MAX_VALUE): Group? {
+ return mSearchHelper?.createVirtualGroupWithSearchResult(this, searchInfoString, SearchParameters().apply {
searchInTitles = false
searchInUserNames = false
searchInPasswords = false
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 9e94ab4e2..dc57f168f 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
@@ -28,6 +28,7 @@ import com.kunzisoft.keepass.database.search.iterator.EntrySearchStringIteratorK
import com.kunzisoft.keepass.database.search.iterator.EntrySearchStringIteratorKDBX
import com.kunzisoft.keepass.model.EntryInfo
import com.kunzisoft.keepass.model.SearchInfo
+import com.kunzisoft.keepass.model.getSearchString
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.timeout.TimeoutHelper
@@ -48,9 +49,13 @@ class SearchHelper(private val isOmitBackup: Boolean) {
if (database.loaded && TimeoutHelper.checkTime(context)) {
var searchWithoutUI = false
if (PreferencesUtil.isAutofillAutoSearchEnable(context)
- && searchInfo != null) {
+ && searchInfo != null
+ && !searchInfo.containsOnlyNullValues()) {
// 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) {
searchWithoutUI = true
onItemsFound.invoke(
diff --git a/app/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt b/app/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt
index e9b21f7b8..707ee97f3 100644
--- a/app/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt
@@ -1,9 +1,12 @@
package com.kunzisoft.keepass.model
+import android.content.Context
import android.content.res.Resources
import android.os.Parcel
import android.os.Parcelable
+import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.utils.ObjectNameResource
+import com.kunzisoft.keepass.utils.UriUtil
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
+ ?: ""
}
\ No newline at end of file
diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt
index 9b0773e77..995c56551 100644
--- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt
@@ -97,6 +97,12 @@ object PreferencesUtil {
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 {
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
return prefs.getBoolean(context.getString(R.string.list_entries_show_username_key),
diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt
index 14b17346c..fa0a24625 100644
--- a/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt
+++ b/app/src/main/java/com/kunzisoft/keepass/utils/UriUtil.kt
@@ -86,6 +86,19 @@ object UriUtil {
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 {
return Uri.decode(uri) ?: ""
}
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index 136661d38..10b67434b 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -67,6 +67,8 @@
true
auto_focus_search_key
false
+ subdomain_search_key
+ false
app_timeout_key
lock_database_screen_off_key
true
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5de49cfa1..a4f82df2d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -202,6 +202,8 @@
Omits \"Backup\" and \"Recycle bin\" groups from search results
Quick search
Request a search when opening a database
+ Subdomain search
+ Search web domains with subdomains constraints
Creating new database…
Working…
Protection
diff --git a/app/src/main/res/xml/preferences_application.xml b/app/src/main/res/xml/preferences_application.xml
index ed4599483..9c140c562 100644
--- a/app/src/main/res/xml/preferences_application.xml
+++ b/app/src/main/res/xml/preferences_application.xml
@@ -59,7 +59,11 @@
android:title="@string/auto_focus_search_title"
android:summary="@string/auto_focus_search_summary"
android:defaultValue="@bool/auto_focus_search_default"/>
-
+