Refactor favorites and searchable database
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+12
-14
@@ -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
|
||||
}
|
||||
|
||||
+1
-2
@@ -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()
|
||||
|
||||
+9
-4
@@ -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) }
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -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
|
||||
}
|
||||
|
||||
+12
-14
@@ -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()
|
||||
|
||||
+6
-6
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user