diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt index c445d74af5d3245e4f930df4652e7273e2a48997..000fe2d76e1b111bf76556a31a8fa8f874bcbec0 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/AccountProvider.kt @@ -31,7 +31,6 @@ import de.chaosdorf.meteroid.model.PinnedUserRepository import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.ServerRepository import de.chaosdorf.meteroid.model.UserRepository -import kotlinx.coroutines.flow.combine import javax.inject.Inject class AccountProvider @Inject constructor( @@ -39,12 +38,12 @@ class AccountProvider @Inject constructor( private val userRepository: UserRepository, private val pinnedUserRepository: PinnedUserRepository, ) { - fun accountFlow(serverId: ServerId, userId: UserId) = combine( - serverRepository.getFlow(serverId), - userRepository.getFlow(serverId, userId), - pinnedUserRepository.isPinnedFlow(serverId, userId) - ) { server, user, pinned -> - if (server == null || user == null) null + suspend fun account(serverId: ServerId, userId: UserId): AccountInfo? { + val server = serverRepository.get(serverId) + val user = userRepository.get(serverId, userId) + val pinned = pinnedUserRepository.isPinned(serverId, userId) + + return if (server == null || user == null) null else AccountInfo(server, user, pinned) } diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt index 1a3cbf3c80f3150f9d7182a9ca4496c0a504867d..6f8563e8b12c8340dc6a3be6f7bf19aa165df0e6 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/sync/SyncManager.kt @@ -79,6 +79,10 @@ class SyncManager @Inject constructor( suspend fun purchase(account: AccountInfo, drink: Drink) { val api = factory.newInstance(account.server.url) try { + Log.i( + "SyncManager", + "Syncing purchase of ${drink.drinkId}/${drink.drinkId} for ${account.user.name}/${account.user.userId}" + ) api.purchase(account.user.userId, drink.drinkId) sync(account.server, account.user, incremental = true) } catch (e: Exception) { diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt index 470a91e7c9173ad630f12bbd52ea7bd1ecf673d8..59f2d5328a027b50372397e19e50a6ee3cd795eb 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/drinks/DrinkListViewModel.kt @@ -31,7 +31,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.DrinkRepository -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.SyncManager @@ -46,16 +45,13 @@ import javax.inject.Inject @HiltViewModel class DrinkListViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, - accountProvider: AccountProvider, + private val accountProvider: AccountProvider, private val syncManager: SyncManager, drinkRepository: DrinkRepository, ) : ViewModel() { private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - val filters: StateFlow<Set<Filter>> = savedStateHandle.getStateFlow("filters", setOf(Filter.Active)) @@ -76,8 +72,8 @@ class DrinkListViewModel @Inject constructor( } fun purchase(item: Drink, onBack: () -> Unit) { - account.value?.let { account -> - viewModelScope.launch { + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> syncManager.purchase(account, item) if (!account.pinned) { onBack() @@ -87,17 +83,13 @@ class DrinkListViewModel @Inject constructor( } fun sync() { - account.value?.let { account -> - viewModelScope.launch { + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> syncManager.sync(account.server, account.user, incremental = true) } } } - suspend fun checkOffline(server: Server?): Boolean = - if (server == null) true - else syncManager.checkOffline(server) - enum class Filter { CaffeineFree, Active; diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt index cd405b270814e68e4cfdf65039584e485b691b3b..105d5dba05df8f6f5dbe4b0b3da21a5e8481fd86 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/money/MoneyListViewModel.kt @@ -31,12 +31,9 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.R -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.sync.AccountProvider import de.chaosdorf.meteroid.sync.SyncManager -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import java.math.BigDecimal import javax.inject.Inject @@ -60,14 +57,11 @@ class MoneyListViewModel @Inject constructor( private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - val money: List<MonetaryAmount> = MonetaryAmount.entries fun deposit(item: MonetaryAmount, onBack: () -> Unit) { - account.value?.let { account -> - viewModelScope.launch { + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> syncManager.deposit(account, item.amount) if (!account.pinned) { onBack() @@ -75,14 +69,4 @@ class MoneyListViewModel @Inject constructor( } } } - - fun togglePin() { - viewModelScope.launch { - accountProvider.togglePin(serverId, userId) - } - } - - suspend fun checkOffline(server: Server?): Boolean = - if (server == null) true - else syncManager.checkOffline(server) } diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt index d3efc7826b6ffb465fb89029d9d5484e9a692698..493608633005e53b33f297aeac661d5a46a696ca 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/transactions/PurchaseViewModel.kt @@ -30,7 +30,6 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.model.DrinkRepository -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.TransactionRepository import de.chaosdorf.meteroid.sync.AccountProvider @@ -48,7 +47,7 @@ import kotlin.time.Duration.Companion.minutes @HiltViewModel class TransactionViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - accountProvider: AccountProvider, + private val accountProvider: AccountProvider, private val syncManager: SyncManager, repository: TransactionRepository, drinkRepository: DrinkRepository @@ -56,9 +55,6 @@ class TransactionViewModel @Inject constructor( private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - val transactions: StateFlow<List<TransactionInfo>> = combine( repository.getAllFlow(serverId, userId), drinkRepository.getAllFlow(serverId) ) { transactions, drinks -> @@ -73,15 +69,12 @@ class TransactionViewModel @Inject constructor( }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) fun sync() { - account.value?.let { (server, user) -> - viewModelScope.launch { - syncManager.sync(server, user, incremental = true) + viewModelScope.launch { + accountProvider.account(serverId, userId)?.let { account -> + syncManager.sync(account.server, account.user, incremental = true) } } } - - suspend fun checkOffline(server: Server?): Boolean = if (server == null) true - else syncManager.checkOffline(server) } fun List<TransactionInfo>.mergeAdjecentDeposits(): List<TransactionInfo> { diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt index 712b16c4fd368efdc3b3183a57a76cf9f94c6ab8..a3fceec55d9ea40e15dd6c7ec9435e1d5c13589b 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/wrapped/WrappedViewModel.kt @@ -32,12 +32,9 @@ import de.chaosdorf.mete.model.DrinkId import de.chaosdorf.mete.model.UserId import de.chaosdorf.meteroid.model.Drink import de.chaosdorf.meteroid.model.DrinkRepository -import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.ServerId import de.chaosdorf.meteroid.model.Transaction import de.chaosdorf.meteroid.model.TransactionRepository -import de.chaosdorf.meteroid.sync.AccountProvider -import de.chaosdorf.meteroid.sync.SyncManager import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine @@ -53,17 +50,12 @@ import javax.inject.Inject @HiltViewModel class WrappedViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - accountProvider: AccountProvider, - private val syncManager: SyncManager, repository: TransactionRepository, drinkRepository: DrinkRepository, ) : ViewModel() { private val serverId = ServerId(checkNotNull(savedStateHandle["server"])) private val userId = UserId(checkNotNull(savedStateHandle["user"])) - val account = accountProvider.accountFlow(serverId, userId) - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) - private fun List<Transaction>.filterAudits(year: Int): List<Transaction> { val yearBegin = LocalDateTime(year, Month.JANUARY, 1, 0, 0, 0) .toInstant(TimeZone.UTC) @@ -88,8 +80,4 @@ class WrappedViewModel @Inject constructor( val content = transactions.filterAudits(now.year) factories.mapNotNull { it.create(content, drinkMap) } }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList()) - - suspend fun checkOffline(server: Server?): Boolean = - if (server == null) true - else syncManager.checkOffline(server) }