Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.core.graphics.toColorInt
import androidx.fragment.app.Fragment
import androidx.lifecycle.asLiveData
import androidx.lifecycle.lifecycleScope
import androidx.work.WorkManager
import com.simprints.core.DispatcherIO
Expand Down Expand Up @@ -60,7 +61,7 @@ internal class DebugFragment : Fragment(R.layout.fragment_debug) {
super.onViewCreated(view, savedInstanceState)
applySystemBarInsets(view)

eventSyncManager.getLastSyncState().observe(viewLifecycleOwner) { state ->
eventSyncManager.getLastSyncState().asLiveData().observe(viewLifecycleOwner) { state ->
val states =
(state.downSyncWorkersInfo.map { it.state } + state.upSyncWorkersInfo.map { it.state })
val message =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.simprints.feature.dashboard.logout

import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asFlow
import androidx.lifecycle.asLiveData
import androidx.lifecycle.liveData
import androidx.lifecycle.viewModelScope
Expand Down Expand Up @@ -39,7 +38,7 @@ internal class LogoutSyncViewModel @Inject constructor(
.asLiveData(viewModelScope.coroutineContext)

val isLogoutWithoutSyncVisibleLiveData: LiveData<Boolean> = combine(
eventSyncManager.getLastSyncState(useDefaultValue = true).asFlow(),
eventSyncManager.getLastSyncState(useDefaultValue = true),
syncOrchestrator.observeImageSyncStatus(),
) { eventSyncState, imageSyncStatus ->
!eventSyncState.isSyncCompleted() || imageSyncStatus.isSyncing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.simprints.feature.dashboard.settings.syncinfo
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asFlow
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.simprints.core.DispatcherIO
Expand Down Expand Up @@ -59,7 +58,7 @@ internal class SyncInfoViewModel @Inject constructor(
eventSyncManager
.getLastSyncState(
useDefaultValue = true, // otherwise value not guaranteed
).asFlow()
)
private val imageSyncStatusFlow =
syncOrchestrator.observeImageSyncStatus()

Expand Down Expand Up @@ -187,7 +186,7 @@ internal class SyncInfoViewModel @Inject constructor(

private fun startInitialSyncIfRequired() {
viewModelScope.launch {
val isRunning = eventSyncManager.getLastSyncState().value?.isSyncRunning() ?: false
val isRunning = eventSyncManager.getLastSyncState().firstOrNull()?.isSyncRunning() ?: false
val lastUpdate = eventSyncManager.getLastSyncTime()

val isForceEventSync = when {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.simprints.feature.dashboard.settings.syncinfo.usecase

import androidx.lifecycle.asFlow
import com.simprints.core.DispatcherBG
import com.simprints.core.lifecycle.AppForegroundStateTracker
import com.simprints.core.tools.extentions.onChange
Expand Down Expand Up @@ -58,13 +57,12 @@ internal class ObserveSyncInfoUseCase @Inject constructor(
) {
private val eventSyncStateFlow = eventSyncManager
.getLastSyncState(useDefaultValue = true) // otherwise value not guaranteed
.asFlow()

private val imageSyncStatusFlow = syncOrchestrator.observeImageSyncStatus()

// Since we are not using distinctUntilChanged any emission from combined flows will trigger the main flow as well
private fun combinedRefreshSignals() = combine(
connectivityTracker.observeIsConnected().asFlow(),
connectivityTracker.observeIsConnected(),
appForegroundStateTracker.observeAppInForeground().filter { it }, // only when going to foreground
ticker.observeTicks(1.minutes),
) { isOnline, _, _ -> isOnline }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.simprints.feature.dashboard.logout

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.LiveData
import androidx.lifecycle.asFlow
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.*
import com.simprints.feature.dashboard.logout.usecase.LogoutUseCase
import com.simprints.infra.authstore.AuthStore
import com.simprints.infra.config.store.models.ProjectConfiguration
Expand All @@ -15,13 +13,8 @@ import com.simprints.infra.sync.ImageSyncStatus
import com.simprints.infra.sync.SyncOrchestrator
import com.simprints.testtools.common.coroutines.TestCoroutineRule
import com.simprints.testtools.common.livedata.getOrAwaitValue
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.*
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
import io.mockk.mockkStatic
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
Expand Down Expand Up @@ -152,10 +145,8 @@ internal class LogoutSyncViewModelTest {
imageSyncStatus: ImageSyncStatus,
projectConfig: ProjectConfiguration,
) {
mockkStatic("androidx.lifecycle.FlowLiveDataConversions")
val eventSyncLiveData = mockk<LiveData<EventSyncState>>(relaxed = true)
every { eventSyncLiveData.asFlow() } returns flowOf(eventSyncState)
every { eventSyncManager.getLastSyncState(useDefaultValue = true) } returns eventSyncLiveData
val eventSyncFlow = flowOf(eventSyncState)
every { eventSyncManager.getLastSyncState(useDefaultValue = true) } returns eventSyncFlow
every { syncOrchestrator.observeImageSyncStatus() } returns flowOf(imageSyncStatus)
every { configManager.observeProjectConfiguration() } returns flowOf(projectConfig)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import com.simprints.feature.dashboard.logout.usecase.LogoutUseCase
import com.simprints.feature.dashboard.settings.syncinfo.usecase.ObserveSyncInfoUseCase
import com.simprints.feature.login.LoginResult
import com.simprints.infra.authstore.AuthStore
import com.simprints.infra.authstore.exceptions.RemoteDbNotSignedInException
import com.simprints.infra.config.store.models.DeviceConfiguration
import com.simprints.infra.config.store.models.GeneralConfiguration
import com.simprints.infra.config.store.models.Project
Expand Down Expand Up @@ -125,10 +124,10 @@ class SyncInfoViewModelTest {
coEvery { configManager.getDeviceConfiguration() } returns mockDeviceConfiguration
coEvery { configManager.getProject() } returns mockProject

val eventSyncLiveData = MutableLiveData(mockEventSyncState)
every { eventSyncManager.getLastSyncState() } returns eventSyncLiveData
every { eventSyncManager.getLastSyncState(any()) } returns eventSyncLiveData
every { eventSyncLiveData.asFlow() } returns flowOf(mockEventSyncState)
val eventSyncFlow = flowOf(mockEventSyncState)
every { eventSyncManager.getLastSyncState() } returns eventSyncFlow
every { eventSyncManager.getLastSyncState(any()) } returns eventSyncFlow

coEvery { eventSyncManager.getLastSyncTime() } returns TEST_TIMESTAMP
coEvery { eventSyncManager.countEventsToUpload(any()) } returns flowOf(0)
coEvery { eventSyncManager.countEventsToDownload() } returns DownSyncCounts(0, isLowerBound = false)
Expand Down Expand Up @@ -235,8 +234,8 @@ class SyncInfoViewModelTest {
every { progress } returns null
every { lastUpdateTimeMillis } returns 0
}
every { eventSyncManager.getLastSyncState(any()) } returns MutableLiveData(mockCompletedEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns MutableStateFlow(mockNotSyncingImageStatus)
every { eventSyncManager.getLastSyncState(any()) } returns flowOf(mockCompletedEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns flowOf(mockNotSyncingImageStatus)
createViewModel()
viewModel.isPreLogoutUpSync = true

Expand All @@ -261,8 +260,8 @@ class SyncInfoViewModelTest {
every { progress } returns null
every { lastUpdateTimeMillis } returns 0
}
every { eventSyncManager.getLastSyncState(any()) } returns MutableLiveData(mockCompletedEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns MutableStateFlow(mockNotSyncingImageStatus)
every { eventSyncManager.getLastSyncState(any()) } returns flowOf(mockCompletedEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns flowOf(mockNotSyncingImageStatus)
createViewModel()
viewModel.isPreLogoutUpSync = true

Expand Down Expand Up @@ -308,8 +307,8 @@ class SyncInfoViewModelTest {
every { progress } returns null
every { lastUpdateTimeMillis } returns 0
}
every { eventSyncManager.getLastSyncState(any()) } returns MutableLiveData(mockCompletedEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns MutableStateFlow(mockNotSyncingImageStatus)
every { eventSyncManager.getLastSyncState(any()) } returns flowOf(mockCompletedEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns flowOf(mockNotSyncingImageStatus)
createViewModel()
viewModel.isPreLogoutUpSync = false

Expand All @@ -334,7 +333,7 @@ class SyncInfoViewModelTest {
every { progress } returns null
every { lastUpdateTimeMillis } returns 0
}
every { eventSyncManager.getLastSyncState(any()) } returns MutableLiveData(mockInProgressEventSyncState)
every { eventSyncManager.getLastSyncState(any()) } returns flowOf(mockInProgressEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns MutableStateFlow(mockNotSyncingImageStatus)
createViewModel()
viewModel.isPreLogoutUpSync = true
Expand All @@ -359,7 +358,7 @@ class SyncInfoViewModelTest {
every { progress } returns Pair(1, 2)
every { lastUpdateTimeMillis } returns null
}
every { eventSyncManager.getLastSyncState(any()) } returns MutableLiveData(mockCompletedEventSyncState)
every { eventSyncManager.getLastSyncState(any()) } returns flowOf(mockCompletedEventSyncState)
every { syncOrchestrator.observeImageSyncStatus() } returns MutableStateFlow(mockSyncingImageStatus)
createViewModel()
viewModel.isPreLogoutUpSync = true
Expand Down Expand Up @@ -562,7 +561,7 @@ class SyncInfoViewModelTest {
val mockInProgressEventSyncState = mockk<EventSyncState>(relaxed = true) {
every { isSyncInProgress() } returns true
}
every { eventSyncManager.getLastSyncState(any()) } returns MutableLiveData(mockInProgressEventSyncState)
every { eventSyncManager.getLastSyncState(any()) } returns flowOf(mockInProgressEventSyncState)
createViewModel()

val values = viewModel.syncInfoLiveData.getOrAwaitValues(number = 1) {
Expand Down Expand Up @@ -668,7 +667,7 @@ class SyncInfoViewModelTest {
val mockIdleEventSyncState = mockk<EventSyncState>(relaxed = true) {
every { isSyncRunning() } returns false
}
every { eventSyncManager.getLastSyncState() } returns MutableLiveData(mockIdleEventSyncState)
every { eventSyncManager.getLastSyncState() } returns flowOf(mockIdleEventSyncState)
coEvery { eventSyncManager.getLastSyncTime() } returns null
createViewModel()

Expand All @@ -683,7 +682,7 @@ class SyncInfoViewModelTest {
val mockIdleEventSyncState = mockk<EventSyncState>(relaxed = true) {
every { isSyncRunning() } returns false
}
every { eventSyncManager.getLastSyncState() } returns MutableLiveData(mockIdleEventSyncState)
every { eventSyncManager.getLastSyncState() } returns flowOf(mockIdleEventSyncState)
coEvery { eventSyncManager.getLastSyncTime() } returns oldTimestamp
every { timeHelper.msBetweenNowAndTime(oldTimestamp) } returns 600000L // 10 minutes
createViewModel()
Expand All @@ -699,7 +698,7 @@ class SyncInfoViewModelTest {
val mockIdleEventSyncState = mockk<EventSyncState>(relaxed = true) {
every { isSyncRunning() } returns false
}
every { eventSyncManager.getLastSyncState() } returns MutableLiveData(mockIdleEventSyncState)
every { eventSyncManager.getLastSyncState() } returns flowOf(mockIdleEventSyncState)
coEvery { eventSyncManager.getLastSyncTime() } returns recentTimestamp
every { timeHelper.msBetweenNowAndTime(recentTimestamp) } returns 60000L // 1 minute
createViewModel()
Expand All @@ -714,7 +713,7 @@ class SyncInfoViewModelTest {
val mockRunningSyncState = mockk<EventSyncState>(relaxed = true) {
every { isSyncRunning() } returns true
}
every { eventSyncManager.getLastSyncState() } returns MutableLiveData(mockRunningSyncState)
every { eventSyncManager.getLastSyncState() } returns flowOf(mockRunningSyncState)
coEvery { eventSyncManager.getLastSyncTime() } returns null
createViewModel()

Expand All @@ -729,7 +728,7 @@ class SyncInfoViewModelTest {
val mockIdleEventSyncState = mockk<EventSyncState>(relaxed = true) {
every { isSyncRunning() } returns false
}
every { eventSyncManager.getLastSyncState() } returns MutableLiveData(mockIdleEventSyncState)
every { eventSyncManager.getLastSyncState() } returns flowOf(mockIdleEventSyncState)
coEvery { eventSyncManager.getLastSyncTime() } returns recentTimestamp
every { timeHelper.msBetweenNowAndTime(recentTimestamp) } returns 60000L // 1 minute
createViewModel()
Expand Down
Loading