From 30bde6285d847d4be7caa07429a08ea15ba63c01 Mon Sep 17 00:00:00 2001 From: MrSluffy Date: Thu, 23 Jan 2025 09:22:29 +0800 Subject: [PATCH] enh : Exclude apps already in other folders from container list --- .../app/lawnchair/data/folder/model/FolderViewModel.kt | 10 ++++++++++ .../src/app/lawnchair/data/folder/service/FolderDao.kt | 4 ++++ .../app/lawnchair/data/folder/service/FolderService.kt | 9 +++++++++ .../components/folder/AppListToFolderPreferences.kt | 7 ++++++- 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lawnchair/src/app/lawnchair/data/folder/model/FolderViewModel.kt b/lawnchair/src/app/lawnchair/data/folder/model/FolderViewModel.kt index bc230ee85d..5d630a324b 100644 --- a/lawnchair/src/app/lawnchair/data/folder/model/FolderViewModel.kt +++ b/lawnchair/src/app/lawnchair/data/folder/model/FolderViewModel.kt @@ -31,6 +31,9 @@ class FolderViewModel(context: Context) : ViewModel() { private val _foldersMutable = MutableLiveData>() val foldersMutable: LiveData> = _foldersMutable + private val _items = MutableStateFlow>(setOf()) + val items: StateFlow> = _items.asStateFlow() + private val _folderInfo = MutableStateFlow(null) val folderInfo = _folderInfo.asStateFlow() private var tempTitle: String = "" @@ -54,6 +57,13 @@ class FolderViewModel(context: Context) : ViewModel() { } } + fun setItems(id: Int) { + viewModelScope.launch { + val items = repository.getItems(id) + _items.value = items + } + } + fun updateCurrentTitle(title: String) { if (action.value == Action.EDIT) { tempTitle = title diff --git a/lawnchair/src/app/lawnchair/data/folder/service/FolderDao.kt b/lawnchair/src/app/lawnchair/data/folder/service/FolderDao.kt index 968ab1c183..d1bff0c67d 100644 --- a/lawnchair/src/app/lawnchair/data/folder/service/FolderDao.kt +++ b/lawnchair/src/app/lawnchair/data/folder/service/FolderDao.kt @@ -25,6 +25,10 @@ interface FolderDao { @Transaction suspend fun getFolderWithItems(folderId: Int): FolderWithItems? + @Query("SELECT * FROM FolderItems WHERE folderId IS NOT :folderId") + @Transaction + suspend fun getItems(folderId: Int): List + @Query("SELECT * FROM Folders") fun getAllFolders(): Flow> diff --git a/lawnchair/src/app/lawnchair/data/folder/service/FolderService.kt b/lawnchair/src/app/lawnchair/data/folder/service/FolderService.kt index 849b2242b2..ae5bba5f8a 100644 --- a/lawnchair/src/app/lawnchair/data/folder/service/FolderService.kt +++ b/lawnchair/src/app/lawnchair/data/folder/service/FolderService.kt @@ -76,6 +76,15 @@ class FolderService(val context: Context) : SafeCloseable { return null } + suspend fun getItems(id: Int): Set = withContext(Dispatchers.IO) { + return@withContext try { + folderDao.getItems(id).mapNotNull { it.componentKey }.toSet() + } catch (e: Exception) { + Log.e("FolderService", "Failed to get all items", e) + setOf() + } + } + suspend fun getAllFolders(): List = withContext(Dispatchers.IO) { try { val folderEntities = folderDao.getAllFolders().firstOrNull() ?: emptyList() diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/folder/AppListToFolderPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/folder/AppListToFolderPreferences.kt index ce4bf2d22e..9de29b91c6 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/folder/AppListToFolderPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/folder/AppListToFolderPreferences.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import app.lawnchair.LawnchairLauncher +import app.lawnchair.data.Converters import app.lawnchair.data.factory.ViewModelFactory import app.lawnchair.data.folder.model.FolderViewModel import app.lawnchair.launcher @@ -62,6 +63,7 @@ fun AppListToFolderPreferences( val loading = folderInfo == null val selectedAppsState = remember { mutableStateOf(setOf()) } + val dbItems = viewModel.items.collectAsState() LaunchedEffect(folderInfoId) { viewModel.setFolderInfo(folderInfoId, false) @@ -70,9 +72,12 @@ fun AppListToFolderPreferences( LaunchedEffect(folderInfo) { val folderContents = folderInfo?.contents?.toMutableSet() ?: mutableSetOf() selectedAppsState.value = folderContents + viewModel.setItems(folderInfoId) } - val apps = launcher.mAppsView.appsStore.apps.toList() + val apps = launcher.mAppsView.appsStore.apps + .toList() + .filterNot { app -> dbItems.value.contains(Converters().fromComponentKey(app.componentKey)) } .sortedBySelection(selectedAppsState.value) val state = rememberLazyListState()