enh : Exclude apps already in other folders from container list

This commit is contained in:
MrSluffy
2025-01-23 09:22:29 +08:00
parent 792d7ed29a
commit 30bde6285d
4 changed files with 29 additions and 1 deletions

View File

@@ -31,6 +31,9 @@ class FolderViewModel(context: Context) : ViewModel() {
private val _foldersMutable = MutableLiveData<List<FolderInfo>>()
val foldersMutable: LiveData<List<FolderInfo>> = _foldersMutable
private val _items = MutableStateFlow<Set<String>>(setOf())
val items: StateFlow<Set<String>> = _items.asStateFlow()
private val _folderInfo = MutableStateFlow<FolderInfo?>(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

View File

@@ -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<FolderItemEntity>
@Query("SELECT * FROM Folders")
fun getAllFolders(): Flow<List<FolderInfoEntity>>

View File

@@ -76,6 +76,15 @@ class FolderService(val context: Context) : SafeCloseable {
return null
}
suspend fun getItems(id: Int): Set<String> = 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<FolderInfo> = withContext(Dispatchers.IO) {
try {
val folderEntities = folderDao.getAllFolders().firstOrNull() ?: emptyList()

View File

@@ -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<ItemInfo>()) }
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()