From 39e3b3205fdac1bef101442b5746ce35d739f5bc Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Wed, 29 Jan 2025 12:39:45 +0530 Subject: [PATCH 1/7] Update lastActiveSurveyId along with activateSurvey call invocation --- .../java/com/google/android/ground/MainViewModel.kt | 2 +- .../android/ground/repository/SurveyRepository.kt | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/google/android/ground/MainViewModel.kt b/app/src/main/java/com/google/android/ground/MainViewModel.kt index 4347cc778e..43943f4eb5 100644 --- a/app/src/main/java/com/google/android/ground/MainViewModel.kt +++ b/app/src/main/java/com/google/android/ground/MainViewModel.kt @@ -99,7 +99,6 @@ constructor( private fun onUserSignedOut(): MainUiState { // Scope of subscription is until view model is cleared. Dispose it manually otherwise, firebase // attempts to maintain a connection even after user has logged out and throws an error. - userRepository.clearUserPreferences() // TODO: Once multi-user login is supported, avoid clearing local db data. This is // currently being done to prevent one user's data to be submitted as another user after @@ -108,6 +107,7 @@ constructor( viewModelScope.launch { withContext(ioDispatcher) { surveyRepository.clearActiveSurvey() + userRepository.clearUserPreferences() localDatabase.clearAllTables() } } diff --git a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt index d82cf7b3e1..d0b1921040 100644 --- a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt +++ b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt @@ -28,12 +28,9 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.withTimeout @@ -66,13 +63,6 @@ constructor( val activeSurvey: Survey? get() = activeSurveyFlow.value - /** The id of the last activated survey. */ - private var lastActiveSurveyId: String by localValueStore::lastActiveSurveyId - - init { - activeSurveyFlow.filterNotNull().onEach { lastActiveSurveyId = it.id }.launchIn(externalScope) - } - /** * Returns the survey with the specified id from the local db, or `null` if not available offline. */ @@ -99,6 +89,7 @@ constructor( } } + localValueStore.lastActiveSurveyId = surveyId firebaseCrashLogger.setSelectedSurveyId(surveyId) } From 0358721be4bcfe50d13ac268ef0ad3dd8a28a134 Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Wed, 29 Jan 2025 15:04:32 +0530 Subject: [PATCH 2/7] Move offline removal to a use case --- .../survey/RemoveOfflineSurveyUseCase.kt | 41 ++++++++++ .../ground/repository/SurveyRepository.kt | 15 +--- .../surveyselector/SurveySelectorViewModel.kt | 6 +- .../survey/RemoveOfflineSurveyUseCaseTest.kt | 76 +++++++++++++++++++ .../ground/repository/SurveyRepositoryTest.kt | 40 ---------- .../SurveySelectorFragmentTest.kt | 4 +- 6 files changed, 124 insertions(+), 58 deletions(-) create mode 100644 app/src/main/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCase.kt create mode 100644 app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt diff --git a/app/src/main/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCase.kt b/app/src/main/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCase.kt new file mode 100644 index 0000000000..efcd0c855d --- /dev/null +++ b/app/src/main/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCase.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.ground.domain.usecases.survey + +import com.google.android.ground.persistence.local.stores.LocalSurveyStore +import com.google.android.ground.repository.SurveyRepository +import javax.inject.Inject + +class RemoveOfflineSurveyUseCase +@Inject +constructor( + private val localSurveyStore: LocalSurveyStore, + private val surveyRepository: SurveyRepository, +) { + + /** + * Attempts to remove the locally synced survey. Also, deactivates it before removing, if it is + * active. Doesn't throw an error if it doesn't exist. + */ + suspend operator fun invoke(surveyId: String) { + if (surveyRepository.isSurveyActive(surveyId)) { + surveyRepository.clearActiveSurvey() + } + + val survey = localSurveyStore.getSurveyById(surveyId) ?: return + localSurveyStore.deleteSurvey(survey) + } +} diff --git a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt index d0b1921040..bdfa0968fb 100644 --- a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt +++ b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt @@ -37,11 +37,7 @@ import kotlinx.coroutines.withTimeout private const val ACTIVATE_SURVEY_TIMEOUT_MILLS: Long = 3 * 1000 -/** - * Coordinates persistence and retrieval of [Survey] instances from remote, local, and in memory - * data stores. For more details on this pattern and overall architecture, see - * https://developer.android.com/jetpack/docs/guide. - */ +/** Maintains the state of currently active survey. */ @OptIn(ExperimentalCoroutinesApi::class) @Singleton class SurveyRepository @@ -101,13 +97,4 @@ constructor( fun isSurveyActive(surveyId: String): Boolean = surveyId.isNotBlank() && activeSurvey?.id == surveyId - - /** Attempts to remove the locally synced survey. Doesn't throw an error if it doesn't exist. */ - suspend fun removeOfflineSurvey(surveyId: String) { - val survey = localSurveyStore.getSurveyById(surveyId) ?: return - localSurveyStore.deleteSurvey(survey) - if (isSurveyActive(surveyId)) { - clearActiveSurvey() - } - } } diff --git a/app/src/main/java/com/google/android/ground/ui/surveyselector/SurveySelectorViewModel.kt b/app/src/main/java/com/google/android/ground/ui/surveyselector/SurveySelectorViewModel.kt index e5a1d00cda..321e583188 100644 --- a/app/src/main/java/com/google/android/ground/ui/surveyselector/SurveySelectorViewModel.kt +++ b/app/src/main/java/com/google/android/ground/ui/surveyselector/SurveySelectorViewModel.kt @@ -20,8 +20,8 @@ import com.google.android.ground.coroutines.ApplicationScope import com.google.android.ground.coroutines.IoDispatcher import com.google.android.ground.domain.usecases.survey.ActivateSurveyUseCase import com.google.android.ground.domain.usecases.survey.ListAvailableSurveysUseCase +import com.google.android.ground.domain.usecases.survey.RemoveOfflineSurveyUseCase import com.google.android.ground.model.SurveyListItem -import com.google.android.ground.repository.SurveyRepository import com.google.android.ground.repository.UserRepository import com.google.android.ground.ui.common.AbstractViewModel import javax.inject.Inject @@ -40,11 +40,11 @@ import timber.log.Timber class SurveySelectorViewModel @Inject internal constructor( - private val surveyRepository: SurveyRepository, private val activateSurveyUseCase: ActivateSurveyUseCase, @ApplicationScope private val externalScope: CoroutineScope, @IoDispatcher private val ioDispatcher: CoroutineDispatcher, private val listAvailableSurveysUseCase: ListAvailableSurveysUseCase, + private val remoteOfflineSurveyUseCase: RemoveOfflineSurveyUseCase, private val userRepository: UserRepository, ) : AbstractViewModel() { @@ -108,7 +108,7 @@ internal constructor( } fun deleteSurvey(surveyId: String) { - externalScope.launch(ioDispatcher) { surveyRepository.removeOfflineSurvey(surveyId) } + externalScope.launch(ioDispatcher) { remoteOfflineSurveyUseCase(surveyId) } } fun signOut() { diff --git a/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt b/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt new file mode 100644 index 0000000000..c3d02262ca --- /dev/null +++ b/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.ground.domain.usecases.survey + +import app.cash.turbine.test +import com.google.android.ground.BaseHiltTest +import com.google.android.ground.FakeData.SURVEY +import com.google.android.ground.persistence.local.stores.LocalSurveyStore +import com.google.android.ground.repository.SurveyRepository +import com.google.common.truth.Truth.assertThat +import dagger.hilt.android.testing.HiltAndroidTest +import javax.inject.Inject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceUntilIdle +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@OptIn(ExperimentalCoroutinesApi::class) +@HiltAndroidTest +@RunWith(RobolectricTestRunner::class) +class RemoveOfflineSurveyUseCaseTest : BaseHiltTest() { + @Inject lateinit var activateSurvey: ActivateSurveyUseCase + @Inject lateinit var localSurveyStore: LocalSurveyStore + @Inject lateinit var removeOfflineSurveyUseCase: RemoveOfflineSurveyUseCase + @Inject lateinit var surveyRepository: SurveyRepository + + @Test + fun `should delete local copy`() = runWithTestDispatcher { + localSurveyStore.insertOrUpdateSurvey(SURVEY) + + removeOfflineSurveyUseCase(SURVEY.id) + + localSurveyStore.surveys.test { assertThat(expectMostRecentItem()).isEmpty() } + } + + @Test + fun `when active survey is same, should deactivate as well`() = runWithTestDispatcher { + localSurveyStore.insertOrUpdateSurvey(SURVEY) + activateSurvey(SURVEY.id) + + removeOfflineSurveyUseCase(SURVEY.id) + + assertThat(surveyRepository.activeSurvey).isNull() + } + + @Test + fun `when active survey is different, should not deactivate`() = runWithTestDispatcher { + val survey1 = SURVEY.copy(id = "active survey id", jobMap = emptyMap()) + val survey2 = SURVEY.copy(id = "inactive survey id", jobMap = emptyMap()) + localSurveyStore.insertOrUpdateSurvey(survey1) + localSurveyStore.insertOrUpdateSurvey(survey2) + activateSurvey(survey1.id) + advanceUntilIdle() + + removeOfflineSurveyUseCase(survey2.id) + advanceUntilIdle() + + // Verify that active survey isn't cleared or de-activated + assertThat(surveyRepository.activeSurvey).isEqualTo(survey1) + localSurveyStore.surveys.test { assertThat(expectMostRecentItem()).isEqualTo(listOf(survey1)) } + } +} diff --git a/app/src/test/java/com/google/android/ground/repository/SurveyRepositoryTest.kt b/app/src/test/java/com/google/android/ground/repository/SurveyRepositoryTest.kt index 8537d812c6..a95a1cdc72 100644 --- a/app/src/test/java/com/google/android/ground/repository/SurveyRepositoryTest.kt +++ b/app/src/test/java/com/google/android/ground/repository/SurveyRepositoryTest.kt @@ -64,44 +64,4 @@ class SurveyRepositoryTest : BaseHiltTest() { surveyRepository.activeSurveyFlow.test { assertThat(expectMostRecentItem()).isNull() } assertThat(surveyRepository.activeSurvey).isNull() } - - @Test - fun `removeOfflineSurvey - should delete local copy`() = runWithTestDispatcher { - localSurveyStore.insertOrUpdateSurvey(SURVEY) - - surveyRepository.removeOfflineSurvey(SURVEY.id) - - localSurveyStore.surveys.test { assertThat(expectMostRecentItem()).isEmpty() } - } - - @Test - fun `removeOfflineSurvey - when active survey is same, should deactivate as well`() = - runWithTestDispatcher { - localSurveyStore.insertOrUpdateSurvey(SURVEY) - activateSurvey(SURVEY.id) - - surveyRepository.removeOfflineSurvey(SURVEY.id) - - assertThat(surveyRepository.activeSurvey).isNull() - } - - @Test - fun `removeOfflineSurvey - when active survey is different, should not deactivate`() = - runWithTestDispatcher { - val survey1 = SURVEY.copy(id = "active survey id", jobMap = emptyMap()) - val survey2 = SURVEY.copy(id = "inactive survey id", jobMap = emptyMap()) - localSurveyStore.insertOrUpdateSurvey(survey1) - localSurveyStore.insertOrUpdateSurvey(survey2) - activateSurvey(survey1.id) - advanceUntilIdle() - - surveyRepository.removeOfflineSurvey(survey2.id) - advanceUntilIdle() - - // Verify that active survey isn't cleared or de-activated - assertThat(surveyRepository.activeSurvey).isEqualTo(survey1) - localSurveyStore.surveys.test { - assertThat(expectMostRecentItem()).isEqualTo(listOf(survey1)) - } - } } diff --git a/app/src/test/java/com/google/android/ground/ui/surveyselector/SurveySelectorFragmentTest.kt b/app/src/test/java/com/google/android/ground/ui/surveyselector/SurveySelectorFragmentTest.kt index 1083580950..7ee4b911ee 100644 --- a/app/src/test/java/com/google/android/ground/ui/surveyselector/SurveySelectorFragmentTest.kt +++ b/app/src/test/java/com/google/android/ground/ui/surveyselector/SurveySelectorFragmentTest.kt @@ -43,6 +43,7 @@ import com.google.android.ground.FakeData import com.google.android.ground.R import com.google.android.ground.domain.usecases.survey.ActivateSurveyUseCase import com.google.android.ground.domain.usecases.survey.ListAvailableSurveysUseCase +import com.google.android.ground.domain.usecases.survey.RemoveOfflineSurveyUseCase import com.google.android.ground.launchFragmentInHiltContainer import com.google.android.ground.launchFragmentWithNavController import com.google.android.ground.model.SurveyListItem @@ -81,6 +82,7 @@ class SurveySelectorFragmentTest : BaseHiltTest() { @BindValue @Mock lateinit var userRepository: UserRepository @BindValue @Mock lateinit var activateSurvey: ActivateSurveyUseCase @BindValue @Mock lateinit var listAvailableSurveysUseCase: ListAvailableSurveysUseCase + @BindValue @Mock lateinit var removeOfflineSurveyUseCase: RemoveOfflineSurveyUseCase @Inject lateinit var fakeAuthenticationManager: FakeAuthenticationManager private lateinit var fragment: SurveySelectorFragment @@ -257,7 +259,7 @@ class SurveySelectorFragmentTest : BaseHiltTest() { advanceUntilIdle() // Assert survey is deleted - verify(surveyRepository).removeOfflineSurvey(TEST_SURVEY_2.id) + verify(removeOfflineSurveyUseCase).invoke(TEST_SURVEY_2.id) } @Test From 39d14a6cc7bfcec75e0431a5ab5e20d944b5670c Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Wed, 29 Jan 2025 15:24:30 +0530 Subject: [PATCH 3/7] Refactor ReactivateLastSurveyUseCase to improve logic readability --- .../survey/ReactivateLastSurveyUseCase.kt | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt b/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt index f7d054628e..f2b18ee98b 100644 --- a/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt +++ b/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt @@ -29,14 +29,16 @@ constructor( private val surveyRepository: SurveyRepository, ) { - suspend operator fun invoke(): Boolean = - if (getLastActiveSurveyId().isEmpty()) { - false - } else if (surveyRepository.hasActiveSurvey()) { - true - } else { - activateSurvey(getLastActiveSurveyId()) + suspend operator fun invoke(): Boolean { + if (surveyRepository.hasActiveSurvey()) { + // Skip if there is an active survey. + return true } - - private fun getLastActiveSurveyId(): String = localValueStore.lastActiveSurveyId + val lastActiveSurveyId = localValueStore.lastActiveSurveyId + if (lastActiveSurveyId.isEmpty()) { + // Nothing to be re-activated. + return false + } + return activateSurvey(lastActiveSurveyId) + } } From 6b9fdb02470a996a1314ccc70ec4a83651ee6983 Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Wed, 29 Jan 2025 15:25:35 +0530 Subject: [PATCH 4/7] Refactor: Remove unused method and simplify check for active survey * Remove `hasActiveSurvey()` from `SurveyRepository` * Use `activeSurvey` directly to check for active survey in `ReactivateLastSurveyUseCase` --- .../domain/usecases/survey/ReactivateLastSurveyUseCase.kt | 2 +- .../com/google/android/ground/repository/SurveyRepository.kt | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt b/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt index f2b18ee98b..67c660e3df 100644 --- a/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt +++ b/app/src/main/java/com/google/android/ground/domain/usecases/survey/ReactivateLastSurveyUseCase.kt @@ -30,7 +30,7 @@ constructor( ) { suspend operator fun invoke(): Boolean { - if (surveyRepository.hasActiveSurvey()) { + if (surveyRepository.activeSurvey != null) { // Skip if there is an active survey. return true } diff --git a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt index bdfa0968fb..272557acd1 100644 --- a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt +++ b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt @@ -93,8 +93,6 @@ constructor( activateSurvey("") } - fun hasActiveSurvey(): Boolean = activeSurvey != null - fun isSurveyActive(surveyId: String): Boolean = surveyId.isNotBlank() && activeSurvey?.id == surveyId } From d5a4aca47f0a1fbb0889cf1f339f8c144ea123eb Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Wed, 29 Jan 2025 15:50:15 +0530 Subject: [PATCH 5/7] Improve removeOfflineSurvey test coverage * Add test to check that no exception is thrown when removing a non-existent local survey * Remove redundant assertion in existing test case --- .../usecases/survey/RemoveOfflineSurveyUseCaseTest.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt b/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt index c3d02262ca..4431688086 100644 --- a/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt +++ b/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt @@ -22,12 +22,12 @@ import com.google.android.ground.persistence.local.stores.LocalSurveyStore import com.google.android.ground.repository.SurveyRepository import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.HiltAndroidTest -import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltAndroidTest @@ -47,6 +47,13 @@ class RemoveOfflineSurveyUseCaseTest : BaseHiltTest() { localSurveyStore.surveys.test { assertThat(expectMostRecentItem()).isEmpty() } } + @Test + fun `should not throw if local copy missing`() = runWithTestDispatcher { + removeOfflineSurveyUseCase(SURVEY.id) + + localSurveyStore.surveys.test { assertThat(expectMostRecentItem()).isEmpty() } + } + @Test fun `when active survey is same, should deactivate as well`() = runWithTestDispatcher { localSurveyStore.insertOrUpdateSurvey(SURVEY) From a49d48b6596f0099f37de8dc16a3ef1542fc4975 Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Wed, 29 Jan 2025 15:52:04 +0530 Subject: [PATCH 6/7] Fix imports order --- .../domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt b/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt index 4431688086..fc7754213b 100644 --- a/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt +++ b/app/src/test/java/com/google/android/ground/domain/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt @@ -22,12 +22,12 @@ import com.google.android.ground.persistence.local.stores.LocalSurveyStore import com.google.android.ground.repository.SurveyRepository import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.HiltAndroidTest +import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner -import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltAndroidTest From 8918cad32010e145c6707978fdeceff9b891c5ae Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Wed, 29 Jan 2025 16:59:22 +0530 Subject: [PATCH 7/7] Add a check before updating last active survey id --- .../google/android/ground/repository/SurveyRepository.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt index 272557acd1..5d3a29320c 100644 --- a/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt +++ b/app/src/main/java/com/google/android/ground/repository/SurveyRepository.kt @@ -85,8 +85,10 @@ constructor( } } - localValueStore.lastActiveSurveyId = surveyId - firebaseCrashLogger.setSelectedSurveyId(surveyId) + if (isSurveyActive(surveyId) || surveyId.isBlank()) { + firebaseCrashLogger.setSelectedSurveyId(surveyId) + localValueStore.lastActiveSurveyId = surveyId + } } suspend fun clearActiveSurvey() {