From 0ebb3abe2059d0e2ef99f514d5b7f29d987b98ba Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Thu, 26 Oct 2023 22:15:53 +0530 Subject: [PATCH] Use coroutine instead of Rx when fetching offlineArea from local db (#2016) --- .../local/room/dao/OfflineAreaDao.kt | 3 +-- .../local/room/stores/RoomOfflineAreaStore.kt | 5 ++--- .../local/stores/LocalOfflineAreaStore.kt | 3 +-- .../repository/OfflineAreaRepository.kt | 20 +++++++++++-------- .../viewer/OfflineAreaViewerViewModel.kt | 3 +-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ground/src/main/java/com/google/android/ground/persistence/local/room/dao/OfflineAreaDao.kt b/ground/src/main/java/com/google/android/ground/persistence/local/room/dao/OfflineAreaDao.kt index 2a573996b8..4bba578acb 100644 --- a/ground/src/main/java/com/google/android/ground/persistence/local/room/dao/OfflineAreaDao.kt +++ b/ground/src/main/java/com/google/android/ground/persistence/local/room/dao/OfflineAreaDao.kt @@ -19,7 +19,6 @@ import androidx.room.Dao import androidx.room.Query import com.google.android.ground.persistence.local.room.entity.OfflineAreaEntity import io.reactivex.Flowable -import io.reactivex.Maybe /** Provides read/write operations for writing [OfflineAreaEntity] to the local db. */ @Dao @@ -27,7 +26,7 @@ interface OfflineAreaDao : BaseDao { @Query("SELECT * FROM offline_area") fun findAllOnceAndStream(): Flowable> @Query("SELECT * FROM offline_area WHERE id = :id") - fun findById(id: String): Maybe + suspend fun findById(id: String): OfflineAreaEntity? @Query("DELETE FROM offline_area WHERE id = :id") suspend fun deleteById(id: String) } diff --git a/ground/src/main/java/com/google/android/ground/persistence/local/room/stores/RoomOfflineAreaStore.kt b/ground/src/main/java/com/google/android/ground/persistence/local/room/stores/RoomOfflineAreaStore.kt index 0e6b003d35..712fa057f4 100644 --- a/ground/src/main/java/com/google/android/ground/persistence/local/room/stores/RoomOfflineAreaStore.kt +++ b/ground/src/main/java/com/google/android/ground/persistence/local/room/stores/RoomOfflineAreaStore.kt @@ -24,7 +24,6 @@ import com.google.android.ground.persistence.local.room.entity.OfflineAreaEntity import com.google.android.ground.persistence.local.stores.LocalOfflineAreaStore import com.google.android.ground.rx.Schedulers import io.reactivex.Flowable -import io.reactivex.Single import javax.inject.Inject import javax.inject.Singleton @@ -42,8 +41,8 @@ class RoomOfflineAreaStore @Inject internal constructor() : LocalOfflineAreaStor .map { areas: List -> areas.map { it.toModelObject() } } .subscribeOn(schedulers.io()) - override fun getOfflineAreaById(id: String): Single = - offlineAreaDao.findById(id).map { it.toModelObject() }.toSingle().subscribeOn(schedulers.io()) + override suspend fun getOfflineAreaById(id: String): OfflineArea? = + offlineAreaDao.findById(id)?.toModelObject() override suspend fun deleteOfflineArea(offlineAreaId: String) = offlineAreaDao.deleteById(offlineAreaId) diff --git a/ground/src/main/java/com/google/android/ground/persistence/local/stores/LocalOfflineAreaStore.kt b/ground/src/main/java/com/google/android/ground/persistence/local/stores/LocalOfflineAreaStore.kt index 52aed0ffcc..3cc120a815 100644 --- a/ground/src/main/java/com/google/android/ground/persistence/local/stores/LocalOfflineAreaStore.kt +++ b/ground/src/main/java/com/google/android/ground/persistence/local/stores/LocalOfflineAreaStore.kt @@ -18,7 +18,6 @@ package com.google.android.ground.persistence.local.stores import com.google.android.ground.model.imagery.OfflineArea import com.google.android.ground.rx.annotations.Cold import io.reactivex.Flowable -import io.reactivex.Single interface LocalOfflineAreaStore { /** @@ -34,5 +33,5 @@ interface LocalOfflineAreaStore { suspend fun deleteOfflineArea(offlineAreaId: String) /** Returns the offline area with the specified id. */ - fun getOfflineAreaById(id: String): Single + suspend fun getOfflineAreaById(id: String): OfflineArea? } diff --git a/ground/src/main/java/com/google/android/ground/repository/OfflineAreaRepository.kt b/ground/src/main/java/com/google/android/ground/repository/OfflineAreaRepository.kt index 0b35319b35..37b7d2fad8 100644 --- a/ground/src/main/java/com/google/android/ground/repository/OfflineAreaRepository.kt +++ b/ground/src/main/java/com/google/android/ground/repository/OfflineAreaRepository.kt @@ -23,16 +23,23 @@ import com.google.android.ground.persistence.uuid.OfflineUuidGenerator import com.google.android.ground.rx.annotations.Cold import com.google.android.ground.system.GeocodingManager import com.google.android.ground.ui.map.Bounds -import com.google.android.ground.ui.map.gms.mog.* +import com.google.android.ground.ui.map.gms.mog.MogClient +import com.google.android.ground.ui.map.gms.mog.MogCollection +import com.google.android.ground.ui.map.gms.mog.MogSource +import com.google.android.ground.ui.map.gms.mog.MogTileDownloader +import com.google.android.ground.ui.map.gms.mog.getTilePath +import com.google.android.ground.ui.map.gms.mog.maxZoom import com.google.android.ground.ui.util.FileUtil import com.google.android.ground.util.ByteCount import com.google.android.ground.util.deleteIfEmpty import com.google.android.ground.util.rangeOf -import io.reactivex.* +import io.reactivex.Flowable import java.io.File import javax.inject.Inject import javax.inject.Singleton -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.reactive.asFlow import kotlinx.coroutines.reactive.awaitFirst import timber.log.Timber @@ -74,11 +81,8 @@ constructor( fun offlineAreasOnceAndStream(): @Cold(terminates = false) Flowable> = localOfflineAreaStore.offlineAreasOnceAndStream() - /** - * Fetches a single offline area by ID. Triggers `onError` when the area is not found. Triggers - * `onSuccess` when the area is found. - */ - fun getOfflineArea(offlineAreaId: String): @Cold Single = + /** Fetches a single offline area by ID. */ + suspend fun getOfflineArea(offlineAreaId: String): OfflineArea? = localOfflineAreaStore.getOfflineAreaById(offlineAreaId) /** diff --git a/ground/src/main/java/com/google/android/ground/ui/offlineareas/viewer/OfflineAreaViewerViewModel.kt b/ground/src/main/java/com/google/android/ground/ui/offlineareas/viewer/OfflineAreaViewerViewModel.kt index a9b71c5e4e..90b7ae7e76 100644 --- a/ground/src/main/java/com/google/android/ground/ui/offlineareas/viewer/OfflineAreaViewerViewModel.kt +++ b/ground/src/main/java/com/google/android/ground/ui/offlineareas/viewer/OfflineAreaViewerViewModel.kt @@ -36,7 +36,6 @@ import com.google.android.ground.util.toMbString import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.launch -import kotlinx.coroutines.rx2.await import timber.log.Timber /** @@ -87,7 +86,7 @@ constructor( fun initialize(args: OfflineAreaViewerFragmentArgs) { offlineAreaId = args.offlineAreaId viewModelScope.launch(ioDispatcher) { - val thisArea = offlineAreaRepository.getOfflineArea(offlineAreaId).await() + val thisArea = offlineAreaRepository.getOfflineArea(offlineAreaId)!! area.postValue(thisArea) areaSize.postValue(offlineAreaRepository.sizeOnDevice(thisArea).toMb().toMbString()) }