Refactor favorites and searchable database

This commit is contained in:
MM20
2023-04-10 22:44:05 +02:00
parent 582c94b6af
commit ed70097c38
49 changed files with 1238 additions and 501 deletions
+2 -1
View File
@@ -132,7 +132,7 @@ dependencies {
implementation(project(":core:crashreporter"))
implementation(project(":data:currencies"))
implementation(project(":data:customattrs"))
implementation(project(":data:favorites"))
implementation(project(":data:searchable"))
implementation(project(":data:files"))
implementation(project(":libs:g-services"))
implementation(project(":core:i18n"))
@@ -157,6 +157,7 @@ dependencies {
implementation(project(":data:search-actions"))
implementation(project(":services:global-actions"))
implementation(project(":services:widgets"))
implementation(project(":services:favorites"))
// Uncomment this if you want annoying notifications in your debug builds yelling at you how terrible your code is
//debugImplementation(libs.leakcanary)
@@ -13,7 +13,7 @@ import de.mm20.launcher2.calculator.calculatorModule
import de.mm20.launcher2.calendar.calendarModule
import de.mm20.launcher2.contacts.contactsModule
import de.mm20.launcher2.data.customattrs.customAttrsModule
import de.mm20.launcher2.favorites.favoritesModule
import de.mm20.launcher2.searchable.searchableModule
import de.mm20.launcher2.files.filesModule
import de.mm20.launcher2.icons.iconsModule
import de.mm20.launcher2.music.musicModule
@@ -29,6 +29,7 @@ import de.mm20.launcher2.notifications.notificationsModule
import de.mm20.launcher2.permissions.permissionsModule
import de.mm20.launcher2.preferences.preferencesModule
import de.mm20.launcher2.searchactions.searchActionsModule
import de.mm20.launcher2.services.favorites.favoritesModule
import de.mm20.launcher2.services.tags.servicesTagsModule
import de.mm20.launcher2.services.widgets.widgetsServiceModule
import de.mm20.launcher2.weather.weatherModule
@@ -67,6 +68,7 @@ class LauncherApplication : Application(), CoroutineScope, ImageLoaderFactory {
customAttrsModule,
databaseModule,
favoritesModule,
searchableModule,
filesModule,
globalActionsModule,
iconsModule,
@@ -1,23 +1,21 @@
package de.mm20.launcher2.activity
import android.app.Activity
import android.content.Context
import android.content.pm.LauncherApps
import android.os.Bundle
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.search.data.AppShortcut
import de.mm20.launcher2.search.data.LauncherShortcut
import de.mm20.launcher2.services.favorites.FavoritesService
import org.koin.android.ext.android.inject
class AddItemActivity : Activity() {
val favoritesRepository: FavoritesRepository by inject()
private val favoritesService: FavoritesService by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val shortcut = AppShortcut.fromPinRequestIntent(this, intent)
if (shortcut != null) {
favoritesRepository.pinItem(shortcut)
favoritesService.pinItem(shortcut)
}
finish()
}
+2 -1
View File
@@ -133,7 +133,7 @@ dependencies {
implementation(project(":data:calculator"))
implementation(project(":data:files"))
implementation(project(":data:widgets"))
implementation(project(":data:favorites"))
implementation(project(":data:searchable"))
implementation(project(":data:wikipedia"))
implementation(project(":services:badges"))
implementation(project(":core:crashreporter"))
@@ -151,4 +151,5 @@ dependencies {
implementation(project(":data:search-actions"))
implementation(project(":services:global-actions"))
implementation(project(":services:widgets"))
implementation(project(":services:favorites"))
}
@@ -4,10 +4,11 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.data.customattrs.CustomAttributesRepository
import de.mm20.launcher2.data.customattrs.utils.withCustomLabels
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.search.data.Tag
import de.mm20.launcher2.services.favorites.FavoritesService
import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.WidgetRepository
import kotlinx.coroutines.flow.*
@@ -16,7 +17,7 @@ import org.koin.core.component.inject
abstract class FavoritesVM : ViewModel(), KoinComponent {
private val favoritesRepository: FavoritesRepository by inject()
private val favoritesService: FavoritesService by inject()
internal val widgetRepository: WidgetRepository by inject()
private val customAttributesRepository: CustomAttributesRepository by inject()
internal val dataStore: LauncherDataStore by inject()
@@ -26,7 +27,7 @@ abstract class FavoritesVM : ViewModel(), KoinComponent {
val showEditButton = dataStore.data.map { it.favorites.editButton }
abstract val tagsExpanded: Flow<Boolean>
val pinnedTags = favoritesRepository.getFavorites(
val pinnedTags = favoritesService.getFavorites(
includeTypes = listOf("tag"),
manuallySorted = true,
automaticallySorted = true,
@@ -55,7 +56,7 @@ abstract class FavoritesVM : ViewModel(), KoinComponent {
val includeFrequentlyUsed = it[2] as Boolean
val frequentlyUsedRows = it[3] as Int
val pinned = favoritesRepository.getFavorites(
val pinned = favoritesService.getFavorites(
excludeTypes = if (excludeCalendar) listOf("calendar", "tag") else listOf("tag"),
manuallySorted = true,
automaticallySorted = true,
@@ -63,7 +64,7 @@ abstract class FavoritesVM : ViewModel(), KoinComponent {
)
if (includeFrequentlyUsed) {
emitAll(pinned.flatMapLatest { pinned ->
favoritesRepository.getFavorites(
favoritesService.getFavorites(
excludeTypes = if (excludeCalendar) listOf("calendar", "tag") else listOf("tag"),
frequentlyUsed = true,
limit = frequentlyUsedRows * columns - pinned.size % columns,
@@ -2,7 +2,6 @@ package de.mm20.launcher2.ui.launcher
import android.app.Activity
import android.content.Context
import android.graphics.Rect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
@@ -11,7 +10,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.globalactions.GlobalActionsService
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
@@ -38,7 +37,7 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
private val dataStore: LauncherDataStore by inject()
private val globalActionsService: GlobalActionsService by inject()
private val permissionsManager: PermissionsManager by inject()
private val favoritesRepository: FavoritesRepository by inject()
private val searchableRepository: SearchableRepository by inject()
private var isSystemInDarkMode = MutableStateFlow(false)
@@ -137,7 +136,7 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
swipeDownAppKey,
longPressAppKey,
doubleTapAppKey
).let { favoritesRepository.getFromKeys(it) }
).let { searchableRepository.getByKeys(it) }
GestureState(
swipeLeftAction = swipeLeftAction,
@@ -5,8 +5,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.favorites.SavedSearchableRankInfo
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.LauncherDataStore
@@ -24,6 +23,7 @@ import de.mm20.launcher2.search.data.UnitConverter
import de.mm20.launcher2.search.data.Website
import de.mm20.launcher2.search.data.Wikipedia
import de.mm20.launcher2.searchactions.actions.SearchAction
import de.mm20.launcher2.services.favorites.FavoritesService
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -42,7 +42,8 @@ import org.koin.core.component.inject
class SearchVM : ViewModel(), KoinComponent {
private val favoritesRepository: FavoritesRepository by inject()
private val favoritesService: FavoritesService by inject()
private val searchableRepository: SearchableRepository by inject()
private val permissionsManager: PermissionsManager by inject()
private val dataStore: LauncherDataStore by inject()
@@ -71,8 +72,10 @@ class SearchVM : ViewModel(), KoinComponent {
val favoritesEnabled = dataStore.data.map { it.favorites.enabled }
val hideFavorites = mutableStateOf(false)
private val hiddenItemKeys = favoritesRepository
.getHiddenItemKeys()
private val hiddenItemKeys = searchableRepository
.getKeys(
hidden = true,
)
.shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)
val bestMatch = mutableStateOf<Searchable?>(null)
@@ -85,7 +88,7 @@ class SearchVM : ViewModel(), KoinComponent {
val bestMatch = bestMatch.value
if (bestMatch is SavableSearchable) {
bestMatch.launch(context, null)
favoritesRepository.incrementLaunchCounter(bestMatch)
favoritesService.reportLaunch(bestMatch)
return
} else if (bestMatch is SearchAction) {
bestMatch.start(context)
@@ -144,11 +147,11 @@ class SearchVM : ViewModel(), KoinComponent {
val keys = resultsList.mapNotNull { (it as? SavableSearchable)?.key }
when (settings.resultOrdering.ordering) {
Ordering.LaunchCount -> favoritesRepository.sortByRelevance(
Ordering.LaunchCount -> searchableRepository.sortByRelevance(
keys
).first()
Ordering.Weighted -> favoritesRepository.sortByWeight(
Ordering.Weighted -> searchableRepository.sortByWeight(
keys
).first()
@@ -120,15 +120,15 @@ class AppItemVM(
}
fun isShortcutPinned(shortcut: AppShortcut): Flow<Boolean> {
return favoritesRepository.isPinned(shortcut)
return searchableRepository.isPinned(shortcut)
}
fun pinShortcut(shortcut: AppShortcut) {
favoritesRepository.pinItem(shortcut)
favoritesService.pinItem(shortcut)
}
fun unpinShortcut(shortcut: AppShortcut) {
favoritesRepository.unpinItem(shortcut)
favoritesService.unpinItem(shortcut)
}
fun launchShortcut(context: Context, shortcut: AppShortcut) {
@@ -6,44 +6,42 @@ import androidx.compose.ui.geometry.Rect
import androidx.core.app.ActivityOptionsCompat
import de.mm20.launcher2.badges.BadgeRepository
import de.mm20.launcher2.data.customattrs.CustomAttributesRepository
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.icons.IconRepository
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.ktx.isAtLeastApiLevel
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.preferences.Settings
import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.search.data.AppShortcut
import de.mm20.launcher2.search.data.LauncherApp
import de.mm20.launcher2.services.favorites.FavoritesService
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
abstract class SearchableItemVM(
private val searchable: SavableSearchable
) : KoinComponent {
protected val favoritesRepository: FavoritesRepository by inject()
protected val favoritesService: FavoritesService by inject()
protected val searchableRepository: SearchableRepository by inject()
protected val badgeRepository: BadgeRepository by inject()
protected val iconRepository: IconRepository by inject()
protected val customAttributesRepository: CustomAttributesRepository by inject()
val isPinned = favoritesRepository.isPinned(searchable)
val isPinned = searchableRepository.isPinned(searchable)
fun pin() {
favoritesRepository.pinItem(searchable)
favoritesService.pinItem(searchable)
}
fun unpin() {
favoritesRepository.unpinItem(searchable)
favoritesService.unpinItem(searchable)
}
val isHidden = favoritesRepository.isHidden(searchable)
val isHidden = searchableRepository.isHidden(searchable)
fun hide() {
favoritesRepository.hideItem(searchable)
searchableRepository.upsert(searchable, hidden = true, pinned = false)
}
fun unhide() {
favoritesRepository.unhideItem(searchable)
searchableRepository.update(searchable, hidden = false)
}
val badge = badgeRepository.getBadge(searchable)
@@ -71,10 +69,10 @@ abstract class SearchableItemVM(
}
val bundle = options.toBundle()
if (searchable.launch(context, bundle)) {
favoritesRepository.incrementLaunchCounter(searchable)
favoritesService.reportLaunch(searchable)
return true
} else if (searchable is LauncherApp || searchable is AppShortcut) {
favoritesRepository.remove(searchable)
searchableRepository.delete(searchable)
}
return false
}
@@ -4,7 +4,6 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import android.util.Log
import de.mm20.launcher2.appshortcuts.AppShortcutRepository
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.search.data.AppShortcut
@@ -37,6 +36,6 @@ class ShortcutItemVM(private val shortcut: AppShortcut) : SearchableItemVM(short
fun deleteShortcut() {
if (!canDelete) return
if (shortcut is LauncherShortcut) shortcutRepository.removePinnedShortcut(shortcut)
favoritesRepository.unpinItem(shortcut)
searchableRepository.delete(shortcut)
}
}
@@ -13,7 +13,7 @@ import de.mm20.launcher2.appshortcuts.AppShortcutRepository
import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeRepository
import de.mm20.launcher2.data.customattrs.CustomAttributesRepository
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.icons.IconRepository
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.ktx.normalize
@@ -24,6 +24,7 @@ import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.search.data.AppShortcut
import de.mm20.launcher2.search.Searchable
import de.mm20.launcher2.search.data.Tag
import de.mm20.launcher2.services.favorites.FavoritesService
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow
@@ -34,7 +35,7 @@ import org.koin.core.component.inject
class EditFavoritesSheetVM : ViewModel(), KoinComponent {
private val repository: FavoritesRepository by inject()
private val favoritesService: FavoritesService by inject()
private val shortcutRepository: AppShortcutRepository by inject()
private val iconRepository: IconRepository by inject()
private val badgeRepository: BadgeRepository by inject()
@@ -58,19 +59,19 @@ class EditFavoritesSheetVM : ViewModel(), KoinComponent {
suspend fun reload(showLoadingIndicator: Boolean = true) {
loading.value = showLoadingIndicator
manuallySorted = mutableListOf()
manuallySorted = repository.getFavorites(
manuallySorted = favoritesService.getFavorites(
manuallySorted = true,
excludeTypes = listOf("tag"),
).first().toMutableList()
automaticallySorted = repository.getFavorites(
automaticallySorted = favoritesService.getFavorites(
automaticallySorted = true,
excludeTypes = listOf("tag"),
).first().toMutableList()
frequentlyUsed = repository.getFavorites(
frequentlyUsed = favoritesService.getFavorites(
frequentlyUsed = true,
excludeTypes = listOf("tag"),
).first().toMutableList()
val pinnedTags = repository.getFavorites(
val pinnedTags = favoritesService.getFavorites(
includeTypes = listOf("tag"),
manuallySorted = true,
automaticallySorted = true,
@@ -169,7 +170,7 @@ class EditFavoritesSheetVM : ViewModel(), KoinComponent {
}
private fun save() {
repository.updateFavorites(
favoritesService.updateFavorites(
manuallySorted = buildList {
pinnedTags.value?.let { addAll(it) }
addAll(manuallySorted)
@@ -236,7 +237,7 @@ class EditFavoritesSheetVM : ViewModel(), KoinComponent {
val item =
gridItems.find { it is FavoritesSheetGridItem.Favorite && it.item.key == key } as FavoritesSheetGridItem.Favorite?
if (item != null) {
repository.removeFromFavorites(item.item)
favoritesService.reset(item.item)
automaticallySorted.removeAll { it.key == item.item.key }
|| manuallySorted.removeAll { it.key == item.item.key }
|| frequentlyUsed.removeAll { it.key == item.item.key }
@@ -310,9 +311,9 @@ class EditFavoritesSheetVM : ViewModel(), KoinComponent {
|| frequentlyUsed.removeAll { it.key == item.item.key }
buildItemList()
customAttributesRepository.addTag(item.item, tag)
repository.unpinItem(item.item)
favoritesService.unpinItem(item.item)
viewModelScope.launch {
frequentlyUsed = repository.getFavorites(
frequentlyUsed = favoritesService.getFavorites(
frequentlyUsed = true,
excludeTypes = listOf("tag"),
).first().toMutableList()
@@ -10,12 +10,13 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.calendar.CalendarRepository
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.search.data.CalendarEvent
import de.mm20.launcher2.services.favorites.FavoritesService
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.map
import org.koin.core.component.KoinComponent
@@ -31,11 +32,12 @@ class CalendarWidgetVM : ViewModel(), KoinComponent {
private val dataStore: LauncherDataStore by inject()
private val calendarRepository: CalendarRepository by inject()
private val favoritesRepository: FavoritesRepository by inject()
private val favoritesService: FavoritesService by inject()
private val searchableRepository: SearchableRepository by inject()
val calendarEvents = MutableLiveData<List<CalendarEvent>>(emptyList())
val pinnedCalendarEvents =
favoritesRepository.getFavorites(
favoritesService.getFavorites(
includeTypes = listOf(CalendarEvent.Domain),
automaticallySorted = true,
manuallySorted = true,
@@ -158,7 +160,10 @@ class CalendarWidgetVM : ViewModel(), KoinComponent {
excludeAllDayEvents = settings.hideAlldayEvents,
excludeCalendars = settings.excludeCalendarsList
).collectLatest { events ->
favoritesRepository.getHiddenCalendarEventKeys().collectLatest { hidden ->
searchableRepository.getKeys(
includeTypes = listOf(CalendarEvent.Domain),
hidden = true,
).collectLatest { hidden ->
upcomingEvents = events.filter { !hidden.contains(it.key) }
}
}
@@ -5,16 +5,16 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.preferences.Settings.ClockWidgetSettings.ClockWidgetLayout
import de.mm20.launcher2.services.favorites.FavoritesService
import de.mm20.launcher2.ui.launcher.search.common.grid.SearchResultGrid
import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.WidgetRepository
@@ -26,7 +26,7 @@ import org.koin.core.component.inject
class FavoritesPartProvider : PartProvider, KoinComponent {
private val favoritesRepository: FavoritesRepository by inject()
private val favoritesService: FavoritesService by inject()
private val widgetRepository: WidgetRepository by inject()
private val dataStore: LauncherDataStore by inject()
@@ -47,7 +47,7 @@ class FavoritesPartProvider : PartProvider, KoinComponent {
)
val favorites by remember(columns, excludeCalendar, layout) {
favoritesRepository.getFavorites(
favoritesService.getFavorites(
excludeTypes = if (excludeCalendar) listOf("calendar", "tag") else listOf("tag"),
manuallySorted = true,
automaticallySorted = true,
@@ -1,19 +1,17 @@
package de.mm20.launcher2.ui.settings.debug
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.data.customattrs.CustomAttributesRepository
import de.mm20.launcher2.favorites.FavoritesRepository
import kotlinx.coroutines.launch
import de.mm20.launcher2.searchable.SearchableRepository
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class DebugSettingsScreenVM: ViewModel(), KoinComponent {
private val favoritesRepository: FavoritesRepository by inject()
private val searchableRepository: SearchableRepository by inject()
private val customAttributesRepository: CustomAttributesRepository by inject()
suspend fun cleanUpDatabase(): Int {
var removed = favoritesRepository.cleanupDatabase()
var removed = searchableRepository.cleanupDatabase()
removed += customAttributesRepository.cleanupDatabase()
return removed
}
@@ -4,7 +4,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.icons.IconRepository
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.permissions.PermissionGroup
@@ -14,10 +14,8 @@ import de.mm20.launcher2.preferences.Settings.GestureSettings.GestureAction
import de.mm20.launcher2.search.SavableSearchable
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.WhileSubscribed
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
@@ -26,7 +24,7 @@ import org.koin.core.component.inject
class GestureSettingsScreenVM : ViewModel(), KoinComponent {
private val dataStore: LauncherDataStore by inject()
private val permissionsManager: PermissionsManager by inject()
private val favoritesRepository: FavoritesRepository by inject()
private val searchableRepository: SearchableRepository by inject()
private val iconRepository: IconRepository by inject()
val hasPermission = permissionsManager.hasPermission(PermissionGroup.Accessibility).asLiveData()
@@ -86,13 +84,13 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
val swipeLeftApp: Flow<SavableSearchable?> = dataStore.data.map { it.gestures.swipeLeftApp }
.map {
if (it.isEmpty()) null else favoritesRepository.getFromKeys(listOf(it)).firstOrNull()
if (it.isEmpty()) null else searchableRepository.getByKeys(listOf(it)).firstOrNull()
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(stopTimeoutMillis = 10000), null)
fun setSwipeLeftApp(searchable: SavableSearchable?) {
viewModelScope.launch {
searchable?.let { favoritesRepository.save(it) }
searchable?.let { searchableRepository.insert(it) }
dataStore.updateData {
it.toBuilder()
.setGestures(it.gestures.toBuilder()
@@ -106,13 +104,13 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
val swipeRightApp: Flow<SavableSearchable?> = dataStore.data.map { it.gestures.swipeRightApp }
.map {
if (it.isEmpty()) null else favoritesRepository.getFromKeys(listOf(it)).firstOrNull()
if (it.isEmpty()) null else searchableRepository.getByKeys(listOf(it)).firstOrNull()
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(stopTimeoutMillis = 10000), null)
fun setSwipeRightApp(searchable: SavableSearchable?) {
viewModelScope.launch {
searchable?.let { favoritesRepository.save(it) }
searchable?.let { searchableRepository.insert(it) }
dataStore.updateData {
it.toBuilder()
.setGestures(it.gestures.toBuilder()
@@ -126,13 +124,13 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
val swipeDownApp: Flow<SavableSearchable?> = dataStore.data.map { it.gestures.swipeDownApp }
.map {
if (it.isEmpty()) null else favoritesRepository.getFromKeys(listOf(it)).firstOrNull()
if (it.isEmpty()) null else searchableRepository.getByKeys(listOf(it)).firstOrNull()
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(stopTimeoutMillis = 10000), null)
fun setSwipeDownApp(searchable: SavableSearchable?) {
viewModelScope.launch {
searchable?.let { favoritesRepository.save(it) }
searchable?.let { searchableRepository.insert(it) }
dataStore.updateData {
it.toBuilder()
.setGestures(it.gestures.toBuilder()
@@ -146,13 +144,13 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
val longPressApp: Flow<SavableSearchable?> = dataStore.data.map { it.gestures.longPressApp }
.map {
if (it.isEmpty()) null else favoritesRepository.getFromKeys(listOf(it)).firstOrNull()
if (it.isEmpty()) null else searchableRepository.getByKeys(listOf(it)).firstOrNull()
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(stopTimeoutMillis = 10000), null)
fun setLongPressApp(searchable: SavableSearchable?) {
viewModelScope.launch {
searchable?.let { favoritesRepository.save(it) }
searchable?.let { searchableRepository.insert(it) }
dataStore.updateData {
it.toBuilder()
.setGestures(it.gestures.toBuilder()
@@ -166,13 +164,13 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
val doubleTapApp: Flow<SavableSearchable?> = dataStore.data.map { it.gestures.doubleTapApp }
.map {
if (it.isEmpty()) null else favoritesRepository.getFromKeys(listOf(it)).firstOrNull()
if (it.isEmpty()) null else searchableRepository.getByKeys(listOf(it)).firstOrNull()
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(stopTimeoutMillis = 10000), null)
fun setDoubleTapApp(searchable: SavableSearchable?) {
viewModelScope.launch {
searchable?.let { favoritesRepository.save(it) }
searchable?.let { searchableRepository.insert(it) }
dataStore.updateData {
it.toBuilder()
.setGestures(it.gestures.toBuilder()
@@ -10,7 +10,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.liveData
import de.mm20.launcher2.applications.AppRepository
import de.mm20.launcher2.favorites.FavoritesRepository
import de.mm20.launcher2.searchable.SearchableRepository
import de.mm20.launcher2.icons.IconRepository
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.ktx.isAtLeastApiLevel
@@ -26,26 +26,26 @@ import org.koin.core.component.inject
class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent {
private val appRepository: AppRepository by inject()
private val favoritesRepository: FavoritesRepository by inject()
private val searchableRepository: SearchableRepository by inject()
private val iconRepository: IconRepository by inject()
val allApps = appRepository.getAllInstalledApps().map {
withContext(Dispatchers.Default) { it.sorted() }
}.asLiveData()
val hiddenItems: LiveData<List<SavableSearchable>> = liveData {
val hidden = favoritesRepository.getHiddenItems().first().filter { it !is LauncherApp }.sorted()
val hidden = searchableRepository.get(hidden = true).first().filter { it !is LauncherApp }.sorted()
emit(hidden)
}
fun isHidden(searchable: SavableSearchable): Flow<Boolean> {
return favoritesRepository.isHidden(searchable)
return searchableRepository.isHidden(searchable)
}
fun setHidden(searchable: SavableSearchable, hidden: Boolean) {
if(hidden) {
favoritesRepository.hideItem(searchable)
searchableRepository.upsert(searchable, hidden = true, pinned = false)
} else {
favoritesRepository.unhideItem(searchable)
searchableRepository.update(searchable, hidden = false)
}
}