Search: reorder results by launchCount (#267)

* add app search result ordering by launchCount

* add reordering for other domains

* add preference in settings

* bruh moment

- database optimizaiton
- fixing obvious fallacy while reordering

* no reordering on empty queries && reordering early return

* avoiding deserialization

* listpreference

* search settings screen icons & categories

* regrouping

* early-return tweak

* Change ranking algorithm

* Pepega

* Prioritize launchCount over pinned for relevance sorting

---------

Co-authored-by: MM20 <15646950+MM2-0@users.noreply.github.com>
This commit is contained in:
Christoph
2023-02-28 20:45:25 +01:00
committed by GitHub
co-authored by MM20
parent 600e319c99
commit 0b2aa716ec
12 changed files with 158 additions and 32 deletions
@@ -51,6 +51,13 @@ interface FavoritesRepository {
fun getHiddenItems(): Flow<List<SavableSearchable>>
fun getHiddenItemKeys(): Flow<List<String>>
/**
* Returns the given keys sorted by relevance.
* The first item in the list is the most relevant.
* Unknown keys will not be included in the result.
*/
fun sortByRelevance(keys: List<String>): Flow<List<String>>
/**
* Remove this item from the Searchable database
*/
@@ -107,6 +114,7 @@ internal class FavoritesRepositoryImpl(
frequentlyUsed = frequentlyUsed,
limit = limit
)
includeTypes != null && excludeTypes == null -> {
dao.getFavoritesWithTypes(
includeTypes = includeTypes,
@@ -116,6 +124,7 @@ internal class FavoritesRepositoryImpl(
limit = limit
)
}
excludeTypes != null && includeTypes == null -> {
dao.getFavoritesWithoutTypes(
excludeTypes = excludeTypes,
@@ -125,6 +134,7 @@ internal class FavoritesRepositoryImpl(
limit = limit
)
}
else -> throw IllegalArgumentException("You can either use includeTypes or excludeTypes, not both")
}
return entities.map {
@@ -137,13 +147,13 @@ internal class FavoritesRepositoryImpl(
}
override fun isPinned(searchable: SavableSearchable): Flow<Boolean> {
return AppDatabase.getInstance(context).searchDao().isPinned(searchable.key)
return database.searchDao().isPinned(searchable.key)
}
override fun pinItem(searchable: SavableSearchable) {
scope.launch {
withContext(Dispatchers.IO) {
val dao = AppDatabase.getInstance(context).searchDao()
val dao = database.searchDao()
val databaseItem = dao.getFavorite(searchable.key)
val savedSearchable = SavedSearchable(
key = searchable.key,
@@ -160,19 +170,19 @@ internal class FavoritesRepositoryImpl(
override fun unpinItem(searchable: SavableSearchable) {
scope.launch {
withContext(Dispatchers.IO) {
AppDatabase.getInstance(context).searchDao().unpinFavorite(searchable.key)
database.searchDao().unpinFavorite(searchable.key)
}
}
}
override fun isHidden(searchable: SavableSearchable): Flow<Boolean> {
return AppDatabase.getInstance(context).searchDao().isHidden(searchable.key)
return database.searchDao().isHidden(searchable.key)
}
override fun hideItem(searchable: SavableSearchable) {
scope.launch {
withContext(Dispatchers.IO) {
val dao = AppDatabase.getInstance(context).searchDao()
val dao = database.searchDao()
val databaseItem = dao.getFavorite(searchable.key)
val savedSearchable = SavedSearchable(
key = searchable.key,
@@ -189,7 +199,7 @@ internal class FavoritesRepositoryImpl(
override fun unhideItem(searchable: SavableSearchable) {
scope.launch {
withContext(Dispatchers.IO) {
AppDatabase.getInstance(context).searchDao().unhideItem(searchable.key)
database.searchDao().unhideItem(searchable.key)
}
}
}
@@ -199,7 +209,7 @@ internal class FavoritesRepositoryImpl(
withContext(Dispatchers.IO) {
val item = SavedSearchable(searchable.key, searchable, 0, 0, false)
item.toDatabaseEntity()?.let {
AppDatabase.getInstance(context).searchDao()
database.searchDao()
.incrementLaunchCount(it)
}
}
@@ -286,6 +296,9 @@ internal class FavoritesRepositoryImpl(
}
}
override fun sortByRelevance(keys: List<String>): Flow<List<String>> {
return database.searchDao().sortByRelevance(keys)
}
private fun fromDatabaseEntity(entity: SavedSearchableEntity): SavedSearchable {
val deserializer: SearchableDeserializer =
@@ -0,0 +1,7 @@
package de.mm20.launcher2.favorites
data class SavedSearchableRankInfo(
val key: String,
val type: String,
var launchCount: Int
)