diff --git a/ground/src/main/java/com/google/android/ground/MainActivity.kt b/ground/src/main/java/com/google/android/ground/MainActivity.kt index d085ad4460..cb973d30e8 100644 --- a/ground/src/main/java/com/google/android/ground/MainActivity.kt +++ b/ground/src/main/java/com/google/android/ground/MainActivity.kt @@ -19,6 +19,7 @@ import android.app.AlertDialog import android.content.Intent import android.os.Bundle import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatDelegate import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -85,6 +86,18 @@ class MainActivity : AbstractActivity() { lifecycleScope.launch { viewModel.navigationRequests.filterNotNull().collect { updateUi(binding.root, it) } } + + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (!dispatchBackPressed()) { + isEnabled = false + onBackPressedDispatcher.onBackPressed() + } + } + }, + ) } private fun updateUi(viewGroup: ViewGroup, uiState: MainUiState) { @@ -182,11 +195,6 @@ class MainActivity : AbstractActivity() { } } - @Deprecated("Deprecated in Java") - override fun onBackPressed() { - if (!dispatchBackPressed()) super.onBackPressed() - } - private fun dispatchBackPressed(): Boolean { val fragmentManager = navHostFragment.childFragmentManager val currentFragment = fragmentManager.findFragmentById(R.id.nav_host_fragment) diff --git a/ground/src/main/java/com/google/android/ground/persistence/remote/firebase/schema/SurveyConverter.kt b/ground/src/main/java/com/google/android/ground/persistence/remote/firebase/schema/SurveyConverter.kt index 4a89940ca3..489823aab2 100644 --- a/ground/src/main/java/com/google/android/ground/persistence/remote/firebase/schema/SurveyConverter.kt +++ b/ground/src/main/java/com/google/android/ground/persistence/remote/firebase/schema/SurveyConverter.kt @@ -32,21 +32,41 @@ internal object SurveyConverter { fun toSurvey(doc: DocumentSnapshot, jobs: List = listOf()): SurveyModel { if (!doc.exists()) throw DataStoreException("Missing survey") - val surveyFromProto = SurveyProto::class.parseFrom(doc, 1) - val jobMap = jobs.associateBy { it.id } - val dataSharingTerms = - if (surveyFromProto.dataSharingTerms.type == Survey.DataSharingTerms.Type.TYPE_UNSPECIFIED) { - null - } else { - surveyFromProto.dataSharingTerms - } - return SurveyModel( - surveyFromProto.id.ifEmpty { doc.id }, - surveyFromProto.name, - surveyFromProto.description, - jobMap.toPersistentMap(), - surveyFromProto.aclMap.entries.associate { it.key to it.value.toString() }, + val surveyFromProto = parseSurveyFromDocument(doc) + val jobMap = convertJobsToMap(jobs) + val dataSharingTerms = getDataSharingTerms(surveyFromProto) + + return createSurveyModel(doc, surveyFromProto, jobMap, dataSharingTerms) + } + + /** Parse survey data from the DocumentSnapshot. */ + private fun parseSurveyFromDocument(doc: DocumentSnapshot): SurveyProto = + SurveyProto::class.parseFrom(doc, 1) + + /** Convert a list of jobs into a map for easy lookup. */ + private fun convertJobsToMap(jobs: List): Map = jobs.associateBy { it.id } + + /** Extract dataSharingTerms from survey. */ + private fun getDataSharingTerms(surveyProto: SurveyProto): Survey.DataSharingTerms? = + if (surveyProto.dataSharingTerms.type == Survey.DataSharingTerms.Type.TYPE_UNSPECIFIED) { + null + } else { + surveyProto.dataSharingTerms + } + + /** Build SurveyModel from parsed data. */ + private fun createSurveyModel( + doc: DocumentSnapshot, + surveyProto: SurveyProto, + jobMap: Map, + dataSharingTerms: Survey.DataSharingTerms?, + ): SurveyModel = + SurveyModel( + id = surveyProto.id.ifEmpty { doc.id }, + title = surveyProto.name, + description = surveyProto.description, + jobMap = jobMap.toPersistentMap(), + acl = surveyProto.aclMap.entries.associate { it.key to it.value.toString() }, dataSharingTerms = dataSharingTerms, ) - } }