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:
@@ -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
|
||||
)
|
||||
Reference in New Issue
Block a user