diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/dashboard/delegate/DashboardSelectorDelegate.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/dashboard/delegate/DashboardSelectorDelegate.kt index 6e6cef9a4..8d1db4cdb 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/dashboard/delegate/DashboardSelectorDelegate.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/features/dashboard/delegate/DashboardSelectorDelegate.kt @@ -33,16 +33,16 @@ class DashboardSelectorDelegate( if (dashboards.isEmpty()) { DashboardsStateUiModel.Empty } else { + val sortedDashboards = dashboards.sortedBy { it } + DashboardsStateUiModel.WithContent( - dashboards = dashboards.map { toUi(it) }, - selected = - toUi( - selected ?: run { - dashboards.first().also { - selectCurrentDeviceDashboardUseCase(it) - } - }, - ), + dashboards = sortedDashboards.map { it.toUi() }, + selected = selected?.toUi() ?: run { + sortedDashboards.first().let { + selectCurrentDeviceDashboardUseCase(it) + it.toUi() + } + }, ) } }.flowOn(dispatcherProvider.viewModel) @@ -52,8 +52,8 @@ class DashboardSelectorDelegate( DashboardsStateUiModel.Loading, ) - fun toUi(dashboardId: DashboardId) = DeviceDashboardUiModel( - id = dashboardId, + fun DashboardId.toUi() = DeviceDashboardUiModel( + id = this, ) fun onDashboardSelected(dashboardId: DashboardId) { diff --git a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/datasource/DeviceDashboardsDataSource.kt b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/datasource/DeviceDashboardsDataSource.kt index 81d811547..623e72e91 100644 --- a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/datasource/DeviceDashboardsDataSource.kt +++ b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/datasource/DeviceDashboardsDataSource.kt @@ -7,11 +7,13 @@ import kotlinx.coroutines.flow.Flow interface DeviceDashboardsDataSource { - fun observeSelectedDeviceDashboard(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow + fun observeSelectedDeviceDashboard( + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): Flow fun selectDeviceDashboard( - deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, ) fun deleteDashboard( @@ -19,9 +21,13 @@ interface DeviceDashboardsDataSource { deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel ) - fun observeDashboardArrangement(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow + fun observeDashboardArrangement( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): Flow fun selectDashboardArrangement( + dashboardId: DashboardId, deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, arrangement: DashboardArrangementDomainModel, ) diff --git a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/repository/DashboardRepositoryImpl.kt b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/repository/DashboardRepositoryImpl.kt index 7ea059348..d65c3a5ca 100644 --- a/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/repository/DashboardRepositoryImpl.kt +++ b/FloconDesktop/data/core/src/commonMain/kotlin/io/github/openflocon/data/core/dashboard/repository/DashboardRepositoryImpl.kt @@ -114,18 +114,20 @@ class DashboardRepositoryImpl( } override suspend fun selectDeviceDashboard( - deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, - dashboardId: DashboardId + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel ) { withContext(dispatcherProvider.data) { deviceDashboardsDataSource.selectDeviceDashboard( - deviceIdAndPackageName = deviceIdAndPackageName, dashboardId = dashboardId, + deviceIdAndPackageName = deviceIdAndPackageName, ) } } - override fun observeSelectedDeviceDashboard(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow = deviceDashboardsDataSource.observeSelectedDeviceDashboard( + override fun observeSelectedDeviceDashboard( + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): Flow = deviceDashboardsDataSource.observeSelectedDeviceDashboard( deviceIdAndPackageName = deviceIdAndPackageName, ).flowOn(dispatcherProvider.data) @@ -133,16 +135,22 @@ class DashboardRepositoryImpl( deviceIdAndPackageName = deviceIdAndPackageName, ).flowOn(dispatcherProvider.data) - override fun observeDashboardArrangement(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow = deviceDashboardsDataSource.observeDashboardArrangement( + override fun observeDashboardArrangement( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): Flow = deviceDashboardsDataSource.observeDashboardArrangement( + dashboardId = dashboardId, deviceIdAndPackageName = deviceIdAndPackageName, ).flowOn(dispatcherProvider.data) override suspend fun selectDashboardArrangement( + dashboardId: DashboardId, deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, arrangement: DashboardArrangementDomainModel ) { withContext(dispatcherProvider.data) { deviceDashboardsDataSource.selectDashboardArrangement( + dashboardId = dashboardId, deviceIdAndPackageName = deviceIdAndPackageName, arrangement = arrangement, ) diff --git a/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/dashboard/datasource/DeviceDashboardsDataSourceInMemory.kt b/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/dashboard/datasource/DeviceDashboardsDataSourceInMemory.kt index 000be6eaf..d15a62924 100644 --- a/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/dashboard/datasource/DeviceDashboardsDataSourceInMemory.kt +++ b/FloconDesktop/data/local/src/commonMain/kotlin/io/github/openflocon/data/local/dashboard/datasource/DeviceDashboardsDataSourceInMemory.kt @@ -11,37 +11,71 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update class DeviceDashboardsDataSourceInMemory : DeviceDashboardsDataSource { - private val selectedDeviceDashboards = MutableStateFlow>(emptyMap()) - private val selectedDashboardArrangements = MutableStateFlow>(emptyMap()) + private val selectedDeviceDashboards = MutableStateFlow>(emptyMap()) + private val selectedDashboardArrangements = MutableStateFlow>(emptyMap()) - override fun observeSelectedDeviceDashboard(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow = selectedDeviceDashboards - .map { it[deviceIdAndPackageName] } + override fun observeSelectedDeviceDashboard( + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): Flow = selectedDeviceDashboards + .map { + val dashboardKey = getSelectedDashboardKey(deviceIdAndPackageName) + it[dashboardKey] + } .distinctUntilChanged() - override fun selectDeviceDashboard(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, dashboardId: DashboardId) { + override fun selectDeviceDashboard( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ) { + val dashboardKey = getSelectedDashboardKey(deviceIdAndPackageName) selectedDeviceDashboards.update { - it + (deviceIdAndPackageName to dashboardId) + it + (dashboardKey to dashboardId) } } - override fun deleteDashboard(dashboardId: DashboardId, deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel) { + override fun deleteDashboard( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ) { + val dashboardKey = getSelectedDashboardKey(deviceIdAndPackageName) selectedDeviceDashboards.update { - if (it[deviceIdAndPackageName] == dashboardId) { - it - deviceIdAndPackageName + if (it[dashboardKey] == dashboardId) { + it - dashboardKey } else it } } - override fun observeDashboardArrangement(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow = selectedDashboardArrangements - .map { it[deviceIdAndPackageName] ?: DashboardArrangementDomainModel.Adaptive } + override fun observeDashboardArrangement( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): Flow = selectedDashboardArrangements + .map { + val dashboardArrangementKey = getDashboardArrangementKey(dashboardId, deviceIdAndPackageName) + it[dashboardArrangementKey] ?: DashboardArrangementDomainModel.Adaptive + } .distinctUntilChanged() override fun selectDashboardArrangement( + dashboardId: DashboardId, deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, arrangement: DashboardArrangementDomainModel ) { + val dashboardArrangementKey = getDashboardArrangementKey(dashboardId, deviceIdAndPackageName) selectedDashboardArrangements.update { - it + (deviceIdAndPackageName to arrangement) + it + (dashboardArrangementKey to arrangement) } } + + private fun getSelectedDashboardKey( + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): String { + return deviceIdAndPackageName.packageName + } + + private fun getDashboardArrangementKey( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): String { + return "${deviceIdAndPackageName.packageName}_$dashboardId" + } } diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/repository/DashboardRepository.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/repository/DashboardRepository.kt index 87ef927b2..a24a650af 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/repository/DashboardRepository.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/repository/DashboardRepository.kt @@ -9,12 +9,20 @@ import kotlinx.coroutines.flow.Flow interface DashboardRepository { fun observeDashboard(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, dashboardId: DashboardId): Flow - suspend fun selectDeviceDashboard(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, dashboardId: DashboardId) + suspend fun selectDeviceDashboard(dashboardId: DashboardId, deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel) fun observeSelectedDeviceDashboard(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow fun observeDeviceDashboards(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow> - fun observeDashboardArrangement(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel): Flow - suspend fun selectDashboardArrangement(deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, arrangement: DashboardArrangementDomainModel) + fun observeDashboardArrangement( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel + ): Flow + + suspend fun selectDashboardArrangement( + dashboardId: DashboardId, + deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, + arrangement: DashboardArrangementDomainModel + ) suspend fun sendClickEvent( deviceIdAndPackageName: DeviceIdAndPackageNameDomainModel, diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/ObserveDashboardArrangementUseCase.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/ObserveDashboardArrangementUseCase.kt index 7cc85b10f..6612586bb 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/ObserveDashboardArrangementUseCase.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/ObserveDashboardArrangementUseCase.kt @@ -15,9 +15,17 @@ class ObserveDashboardArrangementUseCase( if (model == null) { flowOf(DashboardArrangementDomainModel.Adaptive) } else { - dashboardRepository.observeDashboardArrangement( - deviceIdAndPackageName = model, - ) + dashboardRepository.observeSelectedDeviceDashboard(deviceIdAndPackageName = model) + .flatMapLatest { dashboardId -> + if (dashboardId == null) { + flowOf(DashboardArrangementDomainModel.Adaptive) + } else { + dashboardRepository.observeDashboardArrangement( + dashboardId = dashboardId, + deviceIdAndPackageName = model, + ) + } + } } } } diff --git a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/SelectDashboardArrangementUseCase.kt b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/SelectDashboardArrangementUseCase.kt index 6205ccee5..d9ca25ec6 100644 --- a/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/SelectDashboardArrangementUseCase.kt +++ b/FloconDesktop/domain/src/commonMain/kotlin/io/github/openflocon/domain/dashboard/usecase/SelectDashboardArrangementUseCase.kt @@ -7,11 +7,14 @@ import io.github.openflocon.domain.device.usecase.GetCurrentDeviceIdAndPackageNa class SelectDashboardArrangementUseCase( private val dashboardRepository: DashboardRepository, private val getCurrentDeviceIdAndPackageNameUseCase: GetCurrentDeviceIdAndPackageNameUseCase, + private val getCurrentDeviceSelectedDashboardUseCase: GetCurrentDeviceSelectedDashboardUseCase, ) { suspend operator fun invoke(arrangement: DashboardArrangementDomainModel) { val current = getCurrentDeviceIdAndPackageNameUseCase() ?: return + val currentSelectedDashboard = getCurrentDeviceSelectedDashboardUseCase() ?: return dashboardRepository.selectDashboardArrangement( + dashboardId = currentSelectedDashboard, deviceIdAndPackageName = current, arrangement = arrangement, )