ground-android
ground-android copied to clipboard
Ground mobile data collection app for Android
The path `ground-android/ground` is slightly confusing, and seems to imply the level about it is not actually part of `ground`. Perhaps the default `app` would be more appropriate here? @scolsen...
I think our overall approach and design will be simplified if we dumb down the logic the `MutationRepository` offers and offload some processing into methods defined directly on our mutation...
Merge the two flows, survey list & survey list state into one.
The proposal is the have the following Maps SDK agnostic classes: * class MapViewModel * exposes source-of-truth states (CameraPosition) as `StateFlow`s or `LiveData`s * exposes map events as `ShareFlow`s *...
@shobhitagarwal1612 @JSunde, rough design: 
``` 12:28:14.601 E java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map at com.google.android.ground.persistence.remote.firebase.schema.GeometryConverter.fromFirestoreGeometry(GeometryConverter.kt:93) at com.google.android.ground.persistence.remote.firebase.schema.GeometryConverter.fromFirestoreMap-IoAF18A(GeometryConverter.kt:82) at com.google.android.ground.persistence.remote.firebase.schema.LoiConverter.toLoiUnchecked(LoiConverter.kt:47) at com.google.android.ground.persistence.remote.firebase.schema.LoiConverter.toLoi-gIAlu-s(LoiConverter.kt:38) at com.google.android.ground.persistence.remote.firebase.schema.LoiCollectionReference$toLois$2.invokeSuspend(LoiCollectionReference.kt:41) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) ... ```
Code health improvements which came up while fixing #2129: Recommended: - [ ] Warn and ignore mutations not belonging to current signed in user (#2237) - [ ] Wrap `remoteDataStore.applyMutations`...
Adapter for Coroutines might look something like this: ```kt internal class CancellableGeocodeListener( private val cont: CancellableContinuation ) : GeocodeListener { @OptIn(ExperimentalCoroutinesApi::class) override fun onGeocode(addresses: MutableList) = cont.resume(addresses) override fun onError(errorMessage:...
We have some functions throughout the app that are called `on...Result...` `on...Click...` and similar. These names are really opaque and do not convey anything about the actual behavior that's happening...
Adds basic types for representing media and media mutations separately from other mutations. Media mutations are dependent on submission mutations, but using a more fine-grained representation allows us to both...