Skip to content
Open
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 @@ -35,7 +35,7 @@ import org.greenstand.android.TreeTracker.R
import org.greenstand.android.TreeTracker.activities.TreeTrackerActivity
import org.greenstand.android.TreeTracker.analytics.ExceptionDataCollector
import org.greenstand.android.TreeTracker.dashboard.TreesToSyncHelper
import org.greenstand.android.TreeTracker.database.TreeTrackerDAO
import org.greenstand.android.TreeTracker.database.dao.TreeDAO
import org.greenstand.android.TreeTracker.usecases.SyncDataUseCase
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
Expand All @@ -48,7 +48,7 @@ class TreeSyncWorker(
private val exceptionDataCollector: ExceptionDataCollector by inject()
private val syncDataBundleUseCase: SyncDataUseCase by inject()
private val syncNotificationManager: SyncNotificationManager by inject()
private val dao: TreeTrackerDAO by inject()
private val treeDao: TreeDAO by inject()
private val treesToSyncHelper: TreesToSyncHelper by inject()

override suspend fun doWork(): Result {
Expand All @@ -63,7 +63,7 @@ class TreeSyncWorker(
delay(750)
val remaining =
withContext(Dispatchers.IO) {
dao.getNonUploadedLegacyTreeCaptureImageCount() + dao.getNonUploadedTreeImageCount()
treeDao.getNonUploadedLegacyTreeCaptureImageCount() + treeDao.getNonUploadedTreeImageCount()
}
val uploaded = (totalTreesToSync - remaining).coerceAtLeast(0)
val contentText = applicationContext.getString(R.string.uploading_trees) + " ($uploaded/$totalTreesToSync)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import org.greenstand.android.TreeTracker.R
import org.greenstand.android.TreeTracker.analytics.Analytics
import org.greenstand.android.TreeTracker.background.NotificationConstants
import org.greenstand.android.TreeTracker.background.TreeSyncWorker
import org.greenstand.android.TreeTracker.database.TreeTrackerDAO
import org.greenstand.android.TreeTracker.database.dao.TreeDAO
import org.greenstand.android.TreeTracker.models.FeatureFlags
import org.greenstand.android.TreeTracker.models.location.LocationDataCapturer
import org.greenstand.android.TreeTracker.models.messages.MessagesRepo
Expand Down Expand Up @@ -74,7 +74,7 @@ sealed class DashboardAction : Action {
}

class DashboardViewModel(
private val dao: TreeTrackerDAO,
private val treeDao: TreeDAO,
private val workManager: WorkManager,
private val analytics: Analytics,
@Suppress("unused") private val treesToSyncHelper: TreesToSyncHelper,
Expand Down Expand Up @@ -179,10 +179,10 @@ class DashboardViewModel(
private fun observeTreeCounts() {
viewModelScope.launch {
combine(
dao.getUploadedLegacyTreeImageCountFlow(),
dao.getUploadedTreeImageCountFlow(),
dao.getNonUploadedLegacyTreeCaptureImageCountFlow(),
dao.getNonUploadedTreeImageCountFlow(),
treeDao.getUploadedLegacyTreeImageCountFlow(),
treeDao.getUploadedTreeImageCountFlow(),
treeDao.getNonUploadedLegacyTreeCaptureImageCountFlow(),
treeDao.getNonUploadedTreeImageCountFlow(),
) { uploadedLegacy, uploadedNew, nonUploadedLegacy, nonUploadedNew ->
val synced = uploadedLegacy + uploadedNew
val remaining = nonUploadedLegacy + nonUploadedNew
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ val appModule =

factory { UploadImageUseCase(get()) }

factory { UploadLocationDataUseCase(get(), get()) }
factory { UploadLocationDataUseCase(get(), get(), get()) }

factory { CreateTreeUseCase(get(), get(), get()) }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeout
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.greenstand.android.TreeTracker.database.TreeTrackerDAO
import org.greenstand.android.TreeTracker.database.dao.LocationDAO
import org.greenstand.android.TreeTracker.database.entity.LocationEntity
import org.greenstand.android.TreeTracker.models.ConvergenceConfiguration
import org.greenstand.android.TreeTracker.models.ConvergenceStatus
Expand All @@ -42,7 +42,7 @@ import kotlin.properties.Delegates

class LocationDataCapturer(
private val locationUpdateManager: LocationUpdateManager,
private val treeTrackerDAO: TreeTrackerDAO,
private val locationDao: LocationDAO,
private val convergenceConfiguration: ConvergenceConfiguration,
private val json: Json,
private val sessionTracker: SessionTracker,
Expand Down Expand Up @@ -138,7 +138,7 @@ class LocationDataCapturer(
)
val jsonValue = json.encodeToString(locationData)
Timber.d("Inserting new location data $jsonValue")
treeTrackerDAO.insertLocationData(
locationDao.insertLocationData(
LocationEntity(
locationDataJson = jsonValue,
sessionId = currentSessionId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import kotlinx.coroutines.cancel
import kotlinx.coroutines.isActive
import kotlinx.coroutines.tasks.await
import kotlinx.coroutines.withContext
import org.greenstand.android.TreeTracker.database.TreeTrackerDAO
import org.greenstand.android.TreeTracker.database.dao.TreeDAO
import org.greenstand.android.TreeTracker.models.DeviceConfigUploader
import org.greenstand.android.TreeTracker.models.PlanterUploader
import org.greenstand.android.TreeTracker.models.SessionUploader
Expand All @@ -35,7 +35,7 @@ import kotlin.coroutines.coroutineContext
class SyncDataUseCase(
private val treeUploader: TreeUploader,
private val uploadLocationDataUseCase: UploadLocationDataUseCase,
private val dao: TreeTrackerDAO,
private val treeDao: TreeDAO,
private val planterUploader: PlanterUploader,
private val sessionUploader: SessionUploader,
private val deviceConfigUploader: DeviceConfigUploader,
Expand Down Expand Up @@ -73,13 +73,13 @@ class SyncDataUseCase(

treeUpload(
syncStep = SyncStep.LEGACY_TREES,
onGetTreeIds = { dao.getAllTreeCaptureIdsToUpload() },
onGetTreeIds = { treeDao.getAllTreeCaptureIdsToUpload() },
onUpload = { treeUploader.uploadLegacyTrees(it, instanceId) },
)

treeUpload(
syncStep = SyncStep.TREES,
onGetTreeIds = { dao.getAllTreeIdsToUpload() },
onGetTreeIds = { treeDao.getAllTreeIdsToUpload() },
onUpload = { treeUploader.uploadTrees(it) },
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ import org.greenstand.android.TreeTracker.api.ObjectStorageClient
import org.greenstand.android.TreeTracker.api.models.requests.LocationRequest
import org.greenstand.android.TreeTracker.api.models.requests.TracksRequest
import org.greenstand.android.TreeTracker.api.models.requests.UploadBundle
import org.greenstand.android.TreeTracker.database.TreeTrackerDAO
import org.greenstand.android.TreeTracker.database.dao.LocationDAO
import org.greenstand.android.TreeTracker.database.dao.SessionDAO
import org.greenstand.android.TreeTracker.models.LocationData
import org.greenstand.android.TreeTracker.utilities.md5
import timber.log.Timber

class UploadLocationDataUseCase(
private val dao: TreeTrackerDAO,
private val locationDAO: LocationDAO,
private val sessionDao: SessionDAO,
private val json: Json,
) : UseCase<Unit, Boolean>() {
private val storageClient = ObjectStorageClient.instance()
Expand All @@ -40,7 +42,7 @@ class UploadLocationDataUseCase(
Timber.d("Processing tree location data")
withContext(Dispatchers.IO) {
// V2
val locationEntities = dao.getLocationData()
val locationEntities = locationDAO.getLocationData()
val sessionIdToLocations = locationEntities.groupBy { it.sessionId }
val sessionIdToLocationRequests =
sessionIdToLocations
Expand All @@ -59,7 +61,7 @@ class UploadLocationDataUseCase(
return@map sessionId to locationRequests
}

val sessionEntities = sessionIdToLocations.map { dao.getSessionById(it.key) }
val sessionEntities = sessionIdToLocations.map { sessionDao.getSessionById(it.key) }
val trackRequests =
sessionIdToLocationRequests.map { (sessionId, locationList) ->
TracksRequest(
Expand All @@ -79,8 +81,8 @@ class UploadLocationDataUseCase(
"${dataBundle.md5()}_tracks",
)

dao.updateLocationDataUploadStatus(locationEntities.map { it.id }, true)
dao.purgeUploadedLocations()
locationDAO.updateLocationDataUploadStatus(locationEntities.map { it.id }, true)
locationDAO.purgeUploadedLocations()

Timber.tag("Location Upload").d("Completed uploading ${locationEntities.size} V2 GPS locations")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import org.greenstand.android.TreeTracker.MainCoroutineRule
import org.greenstand.android.TreeTracker.analytics.Analytics
import org.greenstand.android.TreeTracker.database.TreeTrackerDAO
import org.greenstand.android.TreeTracker.database.dao.TreeDAO
import org.greenstand.android.TreeTracker.models.location.LocationDataCapturer
import org.greenstand.android.TreeTracker.models.messages.MessagesRepo
import org.greenstand.android.TreeTracker.models.organization.OrgRepo
Expand All @@ -59,7 +59,7 @@ class DashboardViewModelTest {
var mainCoroutineRule = MainCoroutineRule()

@MockK(relaxed = true)
private lateinit var dao: TreeTrackerDAO
private lateinit var treeDao: TreeDAO

@MockK(relaxed = true)
private lateinit var workManager: WorkManager
Expand Down Expand Up @@ -87,10 +87,10 @@ class DashboardViewModelTest {
fun setup() {
MockKAnnotations.init(this)
coEvery { analytics.syncButtonTapped(any(), any(), any()) } just Runs
every { dao.getUploadedLegacyTreeImageCountFlow() } returns flowOf(3)
every { dao.getUploadedTreeImageCountFlow() } returns flowOf(5)
every { dao.getNonUploadedLegacyTreeCaptureImageCountFlow() } returns flowOf(2)
every { dao.getNonUploadedTreeImageCountFlow() } returns flowOf(4)
every { treeDao.getUploadedLegacyTreeImageCountFlow() } returns flowOf(3)
every { treeDao.getUploadedTreeImageCountFlow() } returns flowOf(5)
every { treeDao.getNonUploadedLegacyTreeCaptureImageCountFlow() } returns flowOf(2)
every { treeDao.getNonUploadedTreeImageCountFlow() } returns flowOf(4)
coEvery { checkForInternetUseCase.execute(Unit) } returns true
coEvery { messagesRepo.syncMessages() } just Runs
coEvery { treesToSyncHelper.getTreeCountToSync() } returns 6
Expand All @@ -99,7 +99,7 @@ class DashboardViewModelTest {
every { workManager.enqueueUniqueWork(any(), any(), any<OneTimeWorkRequest>()) } returns mockk()
testSubject =
DashboardViewModel(
dao = dao,
treeDao = treeDao,
workManager = workManager,
analytics = analytics,
treesToSyncHelper = treesToSyncHelper,
Expand Down Expand Up @@ -148,14 +148,14 @@ class DashboardViewModelTest {
fun `observeTreeCounts reacts to Flow changes`() =
runTest {
val nonUploadedFlow = MutableStateFlow(4)
every { dao.getUploadedLegacyTreeImageCountFlow() } returns flowOf(3)
every { dao.getUploadedTreeImageCountFlow() } returns flowOf(5)
every { dao.getNonUploadedLegacyTreeCaptureImageCountFlow() } returns flowOf(2)
every { dao.getNonUploadedTreeImageCountFlow() } returns nonUploadedFlow
every { treeDao.getUploadedLegacyTreeImageCountFlow() } returns flowOf(3)
every { treeDao.getUploadedTreeImageCountFlow() } returns flowOf(5)
every { treeDao.getNonUploadedLegacyTreeCaptureImageCountFlow() } returns flowOf(2)
every { treeDao.getNonUploadedTreeImageCountFlow() } returns nonUploadedFlow

val vm =
DashboardViewModel(
dao = dao,
treeDao = treeDao,
workManager = workManager,
analytics = analytics,
treesToSyncHelper = treesToSyncHelper,
Expand All @@ -178,14 +178,14 @@ class DashboardViewModelTest {
@Test
fun `showTreeSyncReminderDialog is true when remaining trees reach threshold`() =
runTest {
every { dao.getUploadedLegacyTreeImageCountFlow() } returns flowOf(0)
every { dao.getUploadedTreeImageCountFlow() } returns flowOf(0)
every { dao.getNonUploadedLegacyTreeCaptureImageCountFlow() } returns flowOf(1000)
every { dao.getNonUploadedTreeImageCountFlow() } returns flowOf(1000)
every { treeDao.getUploadedLegacyTreeImageCountFlow() } returns flowOf(0)
every { treeDao.getUploadedTreeImageCountFlow() } returns flowOf(0)
every { treeDao.getNonUploadedLegacyTreeCaptureImageCountFlow() } returns flowOf(1000)
every { treeDao.getNonUploadedTreeImageCountFlow() } returns flowOf(1000)

val vm =
DashboardViewModel(
dao = dao,
treeDao = treeDao,
workManager = workManager,
analytics = analytics,
treesToSyncHelper = treesToSyncHelper,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.test.runTest
import kotlinx.datetime.Instant
import kotlinx.serialization.json.Json
import org.greenstand.android.TreeTracker.database.TreeTrackerDAO
import org.greenstand.android.TreeTracker.database.dao.LocationDAO
import org.greenstand.android.TreeTracker.models.ConvergenceConfiguration
import org.greenstand.android.TreeTracker.models.LocationDataConfig
import org.greenstand.android.TreeTracker.models.SessionTracker
Expand Down Expand Up @@ -64,7 +64,7 @@ class LocationDataCapturerTest {
private lateinit var preferences: Preferences

@MockK(relaxed = true)
private lateinit var treeTrackerDAO: TreeTrackerDAO
private lateinit var locationDao: LocationDAO

@MockK(relaxed = true)
private lateinit var sessionTracker: SessionTracker
Expand All @@ -80,7 +80,7 @@ class LocationDataCapturerTest {
locationDataCapturer =
LocationDataCapturer(
locationUpdateManager,
treeTrackerDAO,
locationDao,
convergenceConfiguration,
Json {
explicitNulls = true
Expand Down Expand Up @@ -110,7 +110,7 @@ class LocationDataCapturerTest {
every { locationUpdateManager.locationUpdateLiveData } returns locationsLiveData
every { sessionTracker.currentSessionId } returns 1L
every { timeProvider.currentTime() } returns Instant.fromEpochMilliseconds(1000)
coEvery { treeTrackerDAO.insertLocationData(any()) } coAnswers {
coEvery { locationDao.insertLocationData(any()) } coAnswers {
delay(500)
insertCompleted.countDown()
1L
Expand Down
Loading