diff --git a/app/src/main/java/org/groundplatform/android/data/local/room/converter/ConverterExt.kt b/app/src/main/java/org/groundplatform/android/data/local/room/converter/ConverterExt.kt index ece965b0c3..43405d8dba 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/room/converter/ConverterExt.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/room/converter/ConverterExt.kt @@ -17,7 +17,7 @@ package org.groundplatform.android.data.local.room.converter import com.google.common.reflect.TypeToken import com.google.gson.Gson -import java.util.* +import java.util.Date import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentMap import org.groundplatform.android.data.local.LocalDataConsistencyException @@ -54,9 +54,6 @@ import org.groundplatform.android.data.local.room.relations.TaskEntityAndRelatio import org.groundplatform.android.model.AuditInfo import org.groundplatform.android.model.Survey import org.groundplatform.android.model.User -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Geometry -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.imagery.OfflineArea import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Job.DataCollectionStrategy @@ -75,6 +72,9 @@ import org.groundplatform.android.model.task.Option import org.groundplatform.android.model.task.Task import org.groundplatform.android.model.task.TaskId import org.groundplatform.android.proto.Survey.DataSharingTerms +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.Point import org.json.JSONObject import timber.log.Timber diff --git a/app/src/main/java/org/groundplatform/android/data/local/room/converter/GeometryWrapperTypeConverter.kt b/app/src/main/java/org/groundplatform/android/data/local/room/converter/GeometryWrapperTypeConverter.kt index 1eb7303236..763cb1ff97 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/room/converter/GeometryWrapperTypeConverter.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/room/converter/GeometryWrapperTypeConverter.kt @@ -21,7 +21,7 @@ import kotlinx.serialization.decodeFromByteArray import kotlinx.serialization.encodeToByteArray import kotlinx.serialization.protobuf.ProtoBuf import org.groundplatform.android.data.local.room.entity.GeometryWrapper -import org.groundplatform.android.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.Geometry import org.json.JSONException import timber.log.Timber diff --git a/app/src/main/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverter.kt b/app/src/main/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverter.kt index f0b7181e94..133ad0c909 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverter.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverter.kt @@ -20,9 +20,6 @@ import kotlinx.collections.immutable.toPersistentList import org.groundplatform.android.data.remote.DataStoreException import org.groundplatform.android.data.remote.firebase.schema.CaptureLocationResultConverter.toCaptureLocationTaskData import org.groundplatform.android.data.remote.firebase.schema.CaptureLocationResultConverter.toJSONObject -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.submission.CaptureLocationTaskData import org.groundplatform.android.model.submission.DateTimeTaskData import org.groundplatform.android.model.submission.DrawAreaTaskData @@ -35,6 +32,9 @@ import org.groundplatform.android.model.submission.SkippedTaskData import org.groundplatform.android.model.submission.TaskData import org.groundplatform.android.model.submission.TextTaskData import org.groundplatform.android.model.task.Task +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.json.JSONArray import org.json.JSONException import org.json.JSONObject diff --git a/app/src/main/java/org/groundplatform/android/data/local/room/entity/GeometryWrapper.kt b/app/src/main/java/org/groundplatform/android/data/local/room/entity/GeometryWrapper.kt index 527ceeeb64..36aebb7628 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/room/entity/GeometryWrapper.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/room/entity/GeometryWrapper.kt @@ -15,11 +15,11 @@ */ package org.groundplatform.android.data.local.room.entity -import org.groundplatform.android.model.geometry.Geometry -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon +import org.groundplatform.domain.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon data class GeometryWrapper( /** Non-null iff this geometry is a point. */ diff --git a/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExt.kt b/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExt.kt index 0e17415926..af5ccc3bc3 100644 --- a/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExt.kt +++ b/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExt.kt @@ -19,13 +19,6 @@ import com.google.protobuf.timestamp import java.util.Date import kotlinx.collections.immutable.toImmutableMap import org.groundplatform.android.model.User -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Geometry -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.locationofinterest.LoiProperties import org.groundplatform.android.model.mutation.LocationOfInterestMutation import org.groundplatform.android.model.mutation.Mutation @@ -59,6 +52,13 @@ import org.groundplatform.android.proto.locationOfInterest import org.groundplatform.android.proto.point import org.groundplatform.android.proto.submission import org.groundplatform.android.proto.taskData +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon fun SubmissionMutation.createSubmissionMessage(user: User) = submission { assert(userId == user.id) { "UserId doesn't match: expected $userId, found ${user.id}" } diff --git a/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/CaptureLocationResultConverter.kt b/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/CaptureLocationResultConverter.kt index fb4ab911a7..9035099878 100644 --- a/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/CaptureLocationResultConverter.kt +++ b/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/CaptureLocationResultConverter.kt @@ -16,8 +16,8 @@ package org.groundplatform.android.data.remote.firebase.schema import org.groundplatform.android.data.local.room.converter.GeometryWrapperTypeConverter -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.submission.CaptureLocationTaskData +import org.groundplatform.domain.model.geometry.Point import org.json.JSONObject /** Converts between [CaptureLocationTaskData] and its equivalent [JSONObject] representation. */ diff --git a/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverter.kt b/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverter.kt index b248c9b67b..749455e7fb 100644 --- a/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverter.kt +++ b/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverter.kt @@ -16,17 +16,17 @@ package org.groundplatform.android.data.remote.firebase.schema -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Geometry -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.proto.Geometry as GeometryProto import org.groundplatform.android.proto.LinearRing as LinearRingProto import org.groundplatform.android.proto.MultiPolygon as MultiPolygonProto import org.groundplatform.android.proto.Point as PointProto import org.groundplatform.android.proto.Polygon as PolygonProto +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon /** * Converts between Geometry model objects and their equivalent remote representation using protos. diff --git a/app/src/main/java/org/groundplatform/android/model/locationofinterest/LocationOfInterest.kt b/app/src/main/java/org/groundplatform/android/model/locationofinterest/LocationOfInterest.kt index 4d27b79ceb..85aba31a15 100644 --- a/app/src/main/java/org/groundplatform/android/model/locationofinterest/LocationOfInterest.kt +++ b/app/src/main/java/org/groundplatform/android/model/locationofinterest/LocationOfInterest.kt @@ -16,11 +16,11 @@ package org.groundplatform.android.model.locationofinterest import org.groundplatform.android.model.AuditInfo -import org.groundplatform.android.model.geometry.Geometry import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.mutation.LocationOfInterestMutation import org.groundplatform.android.model.mutation.Mutation import org.groundplatform.android.model.mutation.Mutation.SyncStatus +import org.groundplatform.domain.model.geometry.Geometry /** Alias for a map of properties with string names. */ typealias LoiProperties = Map diff --git a/app/src/main/java/org/groundplatform/android/model/map/Bounds.kt b/app/src/main/java/org/groundplatform/android/model/map/Bounds.kt index c14266396e..fd3cbd0746 100644 --- a/app/src/main/java/org/groundplatform/android/model/map/Bounds.kt +++ b/app/src/main/java/org/groundplatform/android/model/map/Bounds.kt @@ -15,7 +15,7 @@ */ package org.groundplatform.android.model.map -import org.groundplatform.android.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Coordinates /** * Represents a rectangular bound on a map. A bounds may be constructed using only southwest and diff --git a/app/src/main/java/org/groundplatform/android/model/map/CameraPosition.kt b/app/src/main/java/org/groundplatform/android/model/map/CameraPosition.kt index dc98c85d48..b4004abd94 100644 --- a/app/src/main/java/org/groundplatform/android/model/map/CameraPosition.kt +++ b/app/src/main/java/org/groundplatform/android/model/map/CameraPosition.kt @@ -15,7 +15,7 @@ */ package org.groundplatform.android.model.map -import org.groundplatform.android.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Coordinates import timber.log.Timber /** Represents current camera position of the map. */ diff --git a/app/src/main/java/org/groundplatform/android/model/mutation/LocationOfInterestMutation.kt b/app/src/main/java/org/groundplatform/android/model/mutation/LocationOfInterestMutation.kt index f4a57c7398..49b48a2294 100644 --- a/app/src/main/java/org/groundplatform/android/model/mutation/LocationOfInterestMutation.kt +++ b/app/src/main/java/org/groundplatform/android/model/mutation/LocationOfInterestMutation.kt @@ -16,8 +16,8 @@ package org.groundplatform.android.model.mutation import java.util.Date -import org.groundplatform.android.model.geometry.Geometry import org.groundplatform.android.model.locationofinterest.LoiProperties +import org.groundplatform.domain.model.geometry.Geometry data class LocationOfInterestMutation( override val id: Long? = null, diff --git a/app/src/main/java/org/groundplatform/android/model/submission/CaptureLocationTaskData.kt b/app/src/main/java/org/groundplatform/android/model/submission/CaptureLocationTaskData.kt index 7d6a26e7a9..9af8786736 100644 --- a/app/src/main/java/org/groundplatform/android/model/submission/CaptureLocationTaskData.kt +++ b/app/src/main/java/org/groundplatform/android/model/submission/CaptureLocationTaskData.kt @@ -15,8 +15,8 @@ */ package org.groundplatform.android.model.submission -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.proto.Task +import org.groundplatform.domain.model.geometry.Point /** User-provided response to a "capture location" data collection [Task]. */ data class CaptureLocationTaskData( diff --git a/app/src/main/java/org/groundplatform/android/model/submission/GeometryTaskData.kt b/app/src/main/java/org/groundplatform/android/model/submission/GeometryTaskData.kt index 5b8a035283..71c038f0b8 100644 --- a/app/src/main/java/org/groundplatform/android/model/submission/GeometryTaskData.kt +++ b/app/src/main/java/org/groundplatform/android/model/submission/GeometryTaskData.kt @@ -15,11 +15,11 @@ */ package org.groundplatform.android.model.submission -import org.groundplatform.android.model.geometry.Geometry -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.task.Task +import org.groundplatform.domain.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon /** A user-provided response to a geometry-based task ("drop a pin" or "draw an area"). */ sealed class GeometryTaskData(val geometry: Geometry) : TaskData diff --git a/app/src/main/java/org/groundplatform/android/repository/LocationOfInterestRepository.kt b/app/src/main/java/org/groundplatform/android/repository/LocationOfInterestRepository.kt index 6cbd9e9b05..2d217e71de 100644 --- a/app/src/main/java/org/groundplatform/android/repository/LocationOfInterestRepository.kt +++ b/app/src/main/java/org/groundplatform/android/repository/LocationOfInterestRepository.kt @@ -31,7 +31,6 @@ import org.groundplatform.android.data.sync.MutationSyncWorkManager import org.groundplatform.android.data.uuid.OfflineUuidGenerator import org.groundplatform.android.model.Role import org.groundplatform.android.model.Survey -import org.groundplatform.android.model.geometry.Geometry import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.locationofinterest.LocationOfInterest import org.groundplatform.android.model.locationofinterest.generateProperties @@ -42,6 +41,7 @@ import org.groundplatform.android.model.mutation.Mutation.SyncStatus import org.groundplatform.android.proto.Survey.DataVisibility import org.groundplatform.android.system.auth.AuthenticationManager import org.groundplatform.android.ui.map.gms.GmsExt.contains +import org.groundplatform.domain.model.geometry.Geometry import timber.log.Timber /** diff --git a/app/src/main/java/org/groundplatform/android/system/GeocodingManager.kt b/app/src/main/java/org/groundplatform/android/system/GeocodingManager.kt index 9d8cc13679..d1cfaa9d0a 100644 --- a/app/src/main/java/org/groundplatform/android/system/GeocodingManager.kt +++ b/app/src/main/java/org/groundplatform/android/system/GeocodingManager.kt @@ -25,9 +25,9 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import org.groundplatform.android.R import org.groundplatform.android.di.coroutines.IoDispatcher -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds import org.groundplatform.android.ui.map.gms.GmsExt.center +import org.groundplatform.domain.model.geometry.Coordinates import timber.log.Timber /** Abstracts native geocoding facilities. */ diff --git a/app/src/main/java/org/groundplatform/android/system/SettingsClient.kt b/app/src/main/java/org/groundplatform/android/system/SettingsClient.kt index b43718a33c..4162ddb2e7 100644 --- a/app/src/main/java/org/groundplatform/android/system/SettingsClient.kt +++ b/app/src/main/java/org/groundplatform/android/system/SettingsClient.kt @@ -19,7 +19,6 @@ import android.content.Context import com.google.android.gms.location.LocationServices import com.google.android.gms.location.LocationSettingsRequest import com.google.android.gms.location.LocationSettingsResponse -import com.google.android.gms.location.SettingsClient import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import kotlinx.coroutines.tasks.await diff --git a/app/src/main/java/org/groundplatform/android/ui/common/AbstractMapContainerFragment.kt b/app/src/main/java/org/groundplatform/android/ui/common/AbstractMapContainerFragment.kt index 845e80c6d3..1b1c4e6e0b 100644 --- a/app/src/main/java/org/groundplatform/android/ui/common/AbstractMapContainerFragment.kt +++ b/app/src/main/java/org/groundplatform/android/ui/common/AbstractMapContainerFragment.kt @@ -23,7 +23,6 @@ import androidx.compose.runtime.getValue import androidx.lifecycle.compose.collectAsStateWithLifecycle import javax.inject.Inject import org.groundplatform.android.R -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds import org.groundplatform.android.system.GeocodingManager import org.groundplatform.android.system.PermissionDeniedException @@ -35,6 +34,7 @@ import org.groundplatform.android.ui.map.NewCameraPositionViaBounds import org.groundplatform.android.ui.map.NewCameraPositionViaCoordinates import org.groundplatform.android.ui.map.NewCameraPositionViaCoordinatesAndZoomLevel import org.groundplatform.android.util.createComposeView +import org.groundplatform.domain.model.geometry.Coordinates import timber.log.Timber /** Injects a [MapFragment] in the container with id "map" and provides shared map functionality. */ diff --git a/app/src/main/java/org/groundplatform/android/ui/common/BaseMapViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/common/BaseMapViewModel.kt index d06cfa7d51..dd6ab203b9 100644 --- a/app/src/main/java/org/groundplatform/android/ui/common/BaseMapViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/common/BaseMapViewModel.kt @@ -46,7 +46,6 @@ import kotlinx.coroutines.flow.withIndex import kotlinx.coroutines.launch import org.groundplatform.android.common.Constants.DEFAULT_LOI_ZOOM_LEVEL import org.groundplatform.android.model.Survey -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.imagery.TileSource import org.groundplatform.android.model.map.CameraPosition import org.groundplatform.android.model.map.MapType @@ -65,6 +64,7 @@ import org.groundplatform.android.ui.map.NewCameraPositionViaCoordinates import org.groundplatform.android.ui.map.NewCameraPositionViaCoordinatesAndZoomLevel import org.groundplatform.android.ui.map.gms.GmsExt.toBounds import org.groundplatform.android.ui.map.gms.toCoordinates +import org.groundplatform.domain.model.geometry.Coordinates import timber.log.Timber open class BaseMapViewModel diff --git a/app/src/main/java/org/groundplatform/android/ui/common/LocationOfInterestHelper.kt b/app/src/main/java/org/groundplatform/android/ui/common/LocationOfInterestHelper.kt index 28b24c89b6..8f72b0998c 100644 --- a/app/src/main/java/org/groundplatform/android/ui/common/LocationOfInterestHelper.kt +++ b/app/src/main/java/org/groundplatform/android/ui/common/LocationOfInterestHelper.kt @@ -18,12 +18,12 @@ package org.groundplatform.android.ui.common import android.content.res.Resources import javax.inject.Inject import org.groundplatform.android.R -import org.groundplatform.android.model.geometry.Geometry -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.locationofinterest.LOI_NAME_PROPERTY import org.groundplatform.android.model.locationofinterest.LocationOfInterest +import org.groundplatform.domain.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon /** Helper class for creating user-visible text. */ class LocationOfInterestHelper @Inject internal constructor(private val resources: Resources) { diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionInitializer.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionInitializer.kt index b2312ad025..a9de496462 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionInitializer.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionInitializer.kt @@ -27,6 +27,7 @@ import org.groundplatform.android.model.task.Task import org.groundplatform.android.repository.LocationOfInterestRepository import org.groundplatform.android.repository.SurveyRepository import org.groundplatform.android.ui.common.LocationOfInterestHelper +import org.groundplatform.android.ui.datacollection.DataCollectionInitializer.Companion.TASK_POSITION_ID /** * DataCollectionInitializer diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskViewModel.kt index 1fa7daa5fc..e8994a6e12 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskViewModel.kt @@ -19,7 +19,6 @@ import android.location.Location import androidx.annotation.VisibleForTesting import androidx.lifecycle.viewModelScope import javax.inject.Inject -import kotlin.lazy import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted.Companion.WhileSubscribed @@ -31,7 +30,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import org.groundplatform.android.common.Constants.ACCURACY_THRESHOLD_IN_M -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.submission.CaptureLocationTaskData import org.groundplatform.android.model.submission.TaskData import org.groundplatform.android.model.submission.isNullOrEmpty @@ -42,6 +40,7 @@ import org.groundplatform.android.ui.datacollection.tasks.LocationLockEnabledSta import org.groundplatform.android.ui.map.gms.getAccuracyOrNull import org.groundplatform.android.ui.map.gms.getAltitudeOrNull import org.groundplatform.android.ui.map.gms.toCoordinates +import org.groundplatform.domain.model.geometry.Point class CaptureLocationTaskViewModel @Inject constructor() : AbstractMapTaskViewModel() { diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModel.kt index 39da5371de..d44fa5cf99 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModel.kt @@ -21,7 +21,6 @@ import javax.inject.Inject import kotlinx.coroutines.launch import org.groundplatform.android.data.local.LocalValueStore import org.groundplatform.android.data.uuid.OfflineUuidGenerator -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.getDefaultColor import org.groundplatform.android.model.submission.DropPinTaskData @@ -33,6 +32,7 @@ import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.AbstractMapTaskViewModel import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface import org.groundplatform.android.ui.map.Feature +import org.groundplatform.domain.model.geometry.Point class DropPinTaskViewModel @Inject diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModel.kt index 3b515bd251..b4bb72a891 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModel.kt @@ -36,10 +36,6 @@ import kotlinx.coroutines.launch import org.groundplatform.android.R import org.groundplatform.android.data.local.LocalValueStore import org.groundplatform.android.data.uuid.OfflineUuidGenerator -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.getDefaultColor import org.groundplatform.android.model.settings.MeasurementUnits @@ -56,12 +52,16 @@ import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface import org.groundplatform.android.ui.map.Feature import org.groundplatform.android.ui.util.LocaleAwareMeasureFormatter import org.groundplatform.android.ui.util.VibrationHelper -import org.groundplatform.android.ui.util.calculateShoelacePolygonArea import org.groundplatform.android.ui.util.getFormattedArea -import org.groundplatform.android.ui.util.isSelfIntersecting import org.groundplatform.android.usecases.user.GetUserSettingsUseCase import org.groundplatform.android.util.distanceTo import org.groundplatform.android.util.penult +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Polygon +import org.groundplatform.domain.util.calculateShoelacePolygonArea +import org.groundplatform.domain.util.isSelfIntersecting import org.jetbrains.annotations.VisibleForTesting import timber.log.Timber diff --git a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt index ba1095d9dc..c1704dec18 100644 --- a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModel.kt @@ -59,6 +59,7 @@ import org.groundplatform.android.ui.home.mapcontainer.jobs.DataCollectionEntryP import org.groundplatform.android.ui.home.mapcontainer.jobs.JobMapComponentState import org.groundplatform.android.ui.home.mapcontainer.jobs.SelectedLoiSheetData import org.groundplatform.android.ui.map.Feature +import org.groundplatform.android.ui.map.gms.GmsExt.area import org.groundplatform.android.usecases.datasharingterms.GetDataSharingTermsUseCase @OptIn(ExperimentalCoroutinesApi::class) @@ -244,7 +245,7 @@ internal constructor( * list of provided features is empty. */ fun onFeatureClicked(features: Set) { - featureClicked.value = features.minByOrNull { it.geometry.area } + featureClicked.value = features.minByOrNull { it.geometry.area() } } fun grantDataSharingConsent() { diff --git a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheet.kt b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheet.kt index fa97d0cad7..00c36856be 100644 --- a/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheet.kt +++ b/app/src/main/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheet.kt @@ -50,8 +50,6 @@ import kotlinx.coroutines.launch import org.groundplatform.android.R import org.groundplatform.android.model.AuditInfo import org.groundplatform.android.model.User -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.job.getDefaultColor @@ -60,6 +58,8 @@ import org.groundplatform.android.model.task.Task import org.groundplatform.android.ui.common.ExcludeFromJacocoGeneratedReport import org.groundplatform.android.ui.common.LocationOfInterestHelper import org.groundplatform.android.ui.components.ConfirmationDialog +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.groundplatform.ui.theme.AppTheme @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/org/groundplatform/android/ui/map/CameraUpdateRequest.kt b/app/src/main/java/org/groundplatform/android/ui/map/CameraUpdateRequest.kt index a7fa39ba40..99458c4060 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/CameraUpdateRequest.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/CameraUpdateRequest.kt @@ -16,8 +16,8 @@ package org.groundplatform.android.ui.map import kotlin.math.max -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds +import org.groundplatform.domain.model.geometry.Coordinates sealed class CameraUpdateRequest diff --git a/app/src/main/java/org/groundplatform/android/ui/map/Feature.kt b/app/src/main/java/org/groundplatform/android/ui/map/Feature.kt index 8439b14645..fb06529f0b 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/Feature.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/Feature.kt @@ -16,7 +16,7 @@ package org.groundplatform.android.ui.map import androidx.annotation.ColorInt -import org.groundplatform.android.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.Geometry /** Represents an individual feature on a map with a given [Geometry] and [Tag]. */ data class Feature( diff --git a/app/src/main/java/org/groundplatform/android/ui/map/MapFragment.kt b/app/src/main/java/org/groundplatform/android/ui/map/MapFragment.kt index 9529ea1afb..fb5c912939 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/MapFragment.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/MapFragment.kt @@ -18,12 +18,12 @@ package org.groundplatform.android.ui.map import android.annotation.SuppressLint import androidx.annotation.IdRes import kotlinx.coroutines.flow.SharedFlow -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.imagery.TileSource import org.groundplatform.android.model.map.Bounds import org.groundplatform.android.model.map.CameraPosition import org.groundplatform.android.model.map.MapType import org.groundplatform.android.ui.common.AbstractFragment +import org.groundplatform.domain.model.geometry.Coordinates /** Implementation of Fragment which supports displaying a map. */ interface MapFragment { diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProvider.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProvider.kt index eccabf1cf9..07d02c9bac 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProvider.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProvider.kt @@ -25,6 +25,7 @@ import androidx.core.graphics.createBitmap import com.google.android.gms.maps.model.Tile import com.google.android.gms.maps.model.TileProvider import java.io.ByteArrayOutputStream +import org.groundplatform.android.ui.map.gms.CachingUpscalingTileProvider.Companion.DEFAULT_TILE_SIZE import timber.log.Timber /** diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/ConverterExt.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/ConverterExt.kt index a554e20bfa..333ed679b0 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/ConverterExt.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/ConverterExt.kt @@ -18,8 +18,8 @@ package org.groundplatform.android.ui.map.gms import android.location.Location import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.LatLngBounds -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds +import org.groundplatform.domain.model.geometry.Coordinates fun LatLng.toModelObject(): Coordinates = Coordinates(this.latitude, this.longitude) diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/GmsExt.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/GmsExt.kt index 89e2d33339..6f46b5c6e3 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/GmsExt.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/GmsExt.kt @@ -16,14 +16,15 @@ package org.groundplatform.android.ui.map.gms import com.google.android.gms.maps.model.LatLngBounds -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Geometry -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon +import com.google.maps.android.SphericalUtil.computeArea import org.groundplatform.android.model.map.Bounds +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Geometry +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon /** Extensions for indirectly using GMS functions in map-provider agnostic codebase. */ object GmsExt { @@ -57,4 +58,15 @@ object GmsExt { is Polygon -> getShellCoordinates() is MultiPolygon -> polygons.flatMap { it.getShellCoordinates() } } + + fun Geometry.area(): Double = + when (this) { + is Point -> 0.0 + is LineString -> 0.0 + is LinearRing -> 0.0 + is Polygon -> + computeArea(shell.coordinates.toLatLngList()) - + holes.sumOf { computeArea(it.coordinates.toLatLngList()) } + is MultiPolygon -> polygons.sumOf { it.area() } + } } diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/GoogleMapsFragment.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/GoogleMapsFragment.kt index 278ad8e0c5..c1881cc5d3 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/GoogleMapsFragment.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/GoogleMapsFragment.kt @@ -44,7 +44,6 @@ import kotlin.math.sqrt import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.imagery.LocalTileSource import org.groundplatform.android.model.imagery.RemoteMogTileSource import org.groundplatform.android.model.imagery.TileSource @@ -59,6 +58,7 @@ import org.groundplatform.android.ui.map.gms.mog.MogSourceProvider.DEFAULT_MOG_M import org.groundplatform.android.ui.map.gms.mog.MogTileProvider import org.groundplatform.android.util.invert import org.groundplatform.android.util.systemInsets +import org.groundplatform.domain.model.geometry.Coordinates import timber.log.Timber const val TILE_OVERLAY_Z = 0f diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/LineStringRenderer.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/LineStringRenderer.kt index 0299ce8c2e..144b4d19b2 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/LineStringRenderer.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/LineStringRenderer.kt @@ -26,13 +26,13 @@ import com.google.android.gms.maps.model.Polyline import com.google.android.gms.maps.model.PolylineOptions import javax.inject.Inject import org.groundplatform.android.R -import org.groundplatform.android.model.geometry.LineString import org.groundplatform.android.ui.map.Feature import org.groundplatform.android.ui.map.gms.POLYLINE_Z import org.groundplatform.android.ui.map.gms.toLatLngList import org.groundplatform.android.ui.util.BitmapUtil import org.groundplatform.android.util.midpoint import org.groundplatform.android.util.penult +import org.groundplatform.domain.model.geometry.LineString class LineStringRenderer @Inject diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemManager.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemManager.kt index 6fde14670a..f851fc022c 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemManager.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemManager.kt @@ -22,11 +22,11 @@ import com.google.android.gms.maps.model.Marker import com.google.android.gms.maps.model.Polygon as MapsPolygon import com.google.android.gms.maps.model.Polyline import com.google.maps.android.PolyUtil.containsLocation -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.ui.map.Feature +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon /** Manages [Feature]s displayed on the map as Maps SDK items (marker, polyline, etc). */ class MapsItemManager( diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemRenderer.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemRenderer.kt index a411dd9825..f179ea8747 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemRenderer.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/MapsItemRenderer.kt @@ -16,8 +16,8 @@ package org.groundplatform.android.ui.map.gms.features import com.google.android.gms.maps.GoogleMap -import org.groundplatform.android.model.geometry.Geometry import org.groundplatform.android.ui.map.Feature +import org.groundplatform.domain.model.geometry.Geometry interface MapsItemRenderer { fun add( diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PointRenderer.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PointRenderer.kt index 10d4ebd01a..3a7ba2fe4e 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PointRenderer.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PointRenderer.kt @@ -25,11 +25,11 @@ import com.google.android.gms.maps.model.MarkerOptions import javax.inject.Inject import org.groundplatform.android.R import org.groundplatform.android.common.Constants.isReleaseBuild -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.ui.IconFactory import org.groundplatform.android.ui.map.Feature import org.groundplatform.android.ui.map.gms.MARKER_Z import org.groundplatform.android.ui.map.gms.toLatLng +import org.groundplatform.domain.model.geometry.Point import org.jetbrains.annotations.TestOnly @TestOnly const val TEST_MARKER_TAG = "Test point" diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PolygonRenderer.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PolygonRenderer.kt index 029fcb7699..d8d47ef441 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PolygonRenderer.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/features/PolygonRenderer.kt @@ -23,11 +23,11 @@ import com.google.android.gms.maps.model.Polygon as MapsPolygon import com.google.android.gms.maps.model.PolygonOptions import javax.inject.Inject import org.groundplatform.android.R -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.ui.map.Feature import org.groundplatform.android.ui.map.gms.POLYGON_Z import org.groundplatform.android.ui.map.gms.toLatLng import org.groundplatform.android.ui.map.gms.toLatLngList +import org.groundplatform.domain.model.geometry.Polygon class PolygonRenderer @Inject constructor(resources: Resources) : MapsItemRenderer { diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinates.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinates.kt index 8f15b8f60b..f0cd60bd8f 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinates.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinates.kt @@ -18,8 +18,8 @@ package org.groundplatform.android.ui.map.gms.mog import kotlin.math.ln import kotlin.math.tan -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds +import org.groundplatform.domain.model.geometry.Coordinates /** * Uniquely identifies the coordinates of a web mercator tile by its X and Y coordinates and its diff --git a/app/src/main/java/org/groundplatform/android/ui/util/UiFormatUtil.kt b/app/src/main/java/org/groundplatform/android/ui/util/UiFormatUtil.kt new file mode 100644 index 0000000000..ee110d7868 --- /dev/null +++ b/app/src/main/java/org/groundplatform/android/ui/util/UiFormatUtil.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2026 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 org.groundplatform.android.ui.util + +import androidx.annotation.VisibleForTesting +import java.util.Locale +import org.groundplatform.android.model.settings.MeasurementUnits + +@VisibleForTesting const val SQUARE_METERS_PER_ACRE = 4046.86 +@VisibleForTesting const val SQUARE_METERS_PER_HECTARE = 10_000 +@VisibleForTesting const val SQUARE_FEET_PER_SQUARE_METER = 10.7639 + +fun getFormattedArea(areaInSquareMeters: Double, measurementUnits: MeasurementUnits): String { + val (convertedArea, stringUnit) = + when (measurementUnits) { + MeasurementUnits.METRIC -> + if (areaInSquareMeters < SQUARE_METERS_PER_HECTARE) { + areaInSquareMeters to "m²" + } else { + areaInSquareMeters / SQUARE_METERS_PER_HECTARE to "ha" + } + MeasurementUnits.IMPERIAL -> + if (areaInSquareMeters < SQUARE_METERS_PER_ACRE) { + areaInSquareMeters * SQUARE_FEET_PER_SQUARE_METER to "ft²" + } else { + areaInSquareMeters / SQUARE_METERS_PER_ACRE to "ac" + } + } + val rounded = String.format(Locale.getDefault(), "%.2f", convertedArea) + return "$rounded $stringUnit" +} diff --git a/app/src/main/java/org/groundplatform/android/util/CoordinatesExt.kt b/app/src/main/java/org/groundplatform/android/util/CoordinatesExt.kt index 521f332eb7..c21a207109 100644 --- a/app/src/main/java/org/groundplatform/android/util/CoordinatesExt.kt +++ b/app/src/main/java/org/groundplatform/android/util/CoordinatesExt.kt @@ -18,7 +18,7 @@ package org.groundplatform.android.util import android.location.Location import com.google.android.gms.maps.model.LatLng import kotlin.math.abs -import org.groundplatform.android.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Coordinates /** Converts the given coordinates in decimal format to D°M′S″ format. */ fun Coordinates.toDmsFormat(): String = "${convertLatToDms(lat)} ${convertLongToDms(lng)}" diff --git a/app/src/test/java/org/groundplatform/android/FakeData.kt b/app/src/test/java/org/groundplatform/android/FakeData.kt index 9eed704955..f0b5468359 100644 --- a/app/src/test/java/org/groundplatform/android/FakeData.kt +++ b/app/src/test/java/org/groundplatform/android/FakeData.kt @@ -20,11 +20,6 @@ import org.groundplatform.android.model.AuditInfo import org.groundplatform.android.model.Survey import org.groundplatform.android.model.TermsOfService import org.groundplatform.android.model.User -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.imagery.OfflineArea import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style @@ -42,6 +37,11 @@ import org.groundplatform.android.proto.SurveyKt.dataSharingTerms import org.groundplatform.android.proto.copy import org.groundplatform.android.ui.map.Feature import org.groundplatform.android.ui.map.gms.features.FeatureClusterItem +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon /** * Shared test data constants. Tests are expected to override existing or set missing values when diff --git a/app/src/test/java/org/groundplatform/android/data/local/LocalLocationOfInterestStoreTest.kt b/app/src/test/java/org/groundplatform/android/data/local/LocalLocationOfInterestStoreTest.kt index c0e70dd8ad..aa882c6b73 100644 --- a/app/src/test/java/org/groundplatform/android/data/local/LocalLocationOfInterestStoreTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/local/LocalLocationOfInterestStoreTest.kt @@ -36,10 +36,6 @@ import org.groundplatform.android.data.local.stores.LocalSurveyStore import org.groundplatform.android.data.local.stores.LocalUserStore import org.groundplatform.android.model.Survey import org.groundplatform.android.model.User -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.mutation.Mutation @@ -49,6 +45,10 @@ import org.groundplatform.android.model.submission.TextTaskData import org.groundplatform.android.model.submission.ValueDelta import org.groundplatform.android.model.task.Task import org.groundplatform.android.ui.map.gms.GmsExt.getShellCoordinates +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/data/local/LocalSubmissionStoreTest.kt b/app/src/test/java/org/groundplatform/android/data/local/LocalSubmissionStoreTest.kt index 8357aa42a3..8aaeb8f8c9 100644 --- a/app/src/test/java/org/groundplatform/android/data/local/LocalSubmissionStoreTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/local/LocalSubmissionStoreTest.kt @@ -33,8 +33,6 @@ import org.groundplatform.android.data.local.stores.LocalSurveyStore import org.groundplatform.android.data.local.stores.LocalUserStore import org.groundplatform.android.model.Survey import org.groundplatform.android.model.User -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.mutation.Mutation @@ -45,6 +43,8 @@ import org.groundplatform.android.model.submission.SubmissionData import org.groundplatform.android.model.submission.TextTaskData import org.groundplatform.android.model.submission.ValueDelta import org.groundplatform.android.model.task.Task +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.hamcrest.MatcherAssert import org.hamcrest.Matchers import org.junit.Test diff --git a/app/src/test/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverterTest.kt b/app/src/test/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverterTest.kt index c42462492d..f4383d0ac4 100644 --- a/app/src/test/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverterTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/local/room/converter/ValueJsonConverterTest.kt @@ -18,11 +18,6 @@ package org.groundplatform.android.data.local.room.converter import com.google.common.truth.Truth.assertThat import kotlinx.collections.immutable.persistentListOf import org.groundplatform.android.FakeData -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.submission.DateTimeTaskData import org.groundplatform.android.model.submission.DrawAreaTaskData import org.groundplatform.android.model.submission.DrawAreaTaskIncompleteData @@ -34,6 +29,11 @@ import org.groundplatform.android.model.submission.TextTaskData import org.groundplatform.android.model.task.MultipleChoice import org.groundplatform.android.model.task.Option import org.groundplatform.android.model.task.Task +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.json.JSONArray import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/LoiMutationConverterTest.kt b/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/LoiMutationConverterTest.kt index 09d5bee96a..a0722d0f06 100644 --- a/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/LoiMutationConverterTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/LoiMutationConverterTest.kt @@ -21,10 +21,6 @@ import java.time.Instant import java.util.Date import org.groundplatform.android.FakeData import org.groundplatform.android.FakeData.LOCATION_OF_INTEREST_NAME -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.locationofinterest.LOI_NAME_PROPERTY import org.groundplatform.android.model.mutation.LocationOfInterestMutation import org.groundplatform.android.model.mutation.Mutation @@ -47,6 +43,10 @@ import org.groundplatform.android.proto.LocationOfInterest.SOURCE_FIELD_NUMBER import org.groundplatform.android.proto.LocationOfInterest.SUBMISSION_COUNT_FIELD_NUMBER import org.groundplatform.android.proto.Point.COORDINATES_FIELD_NUMBER import org.groundplatform.android.proto.Polygon.SHELL_FIELD_NUMBER +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Assert.assertThrows import org.junit.Test diff --git a/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExtKtTest.kt b/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExtKtTest.kt index 911ace189a..26223081cd 100644 --- a/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExtKtTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/remote/firebase/protobuf/ModelToProtoExtKtTest.kt @@ -20,8 +20,6 @@ import com.google.protobuf.timestamp import java.time.Instant import java.util.Date import org.groundplatform.android.model.User -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.locationofinterest.generateProperties import org.groundplatform.android.model.mutation.LocationOfInterestMutation import org.groundplatform.android.model.mutation.Mutation @@ -32,6 +30,8 @@ import org.groundplatform.android.proto.coordinates import org.groundplatform.android.proto.geometry import org.groundplatform.android.proto.locationOfInterest import org.groundplatform.android.proto.point +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Assert.assertThrows import org.junit.Test diff --git a/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverterTest.kt b/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverterTest.kt index 88005e3ffa..53947b1a35 100644 --- a/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverterTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/GeometryConverterTest.kt @@ -18,17 +18,17 @@ package org.groundplatform.android.data.remote.firebase.schema import com.google.common.truth.Truth.assertThat import org.groundplatform.android.data.remote.firebase.schema.GeometryConverter.toGeometry -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.MultiPolygon -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.proto.coordinates import org.groundplatform.android.proto.geometry import org.groundplatform.android.proto.linearRing import org.groundplatform.android.proto.multiPolygon import org.groundplatform.android.proto.point import org.groundplatform.android.proto.polygon +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Test typealias Path = Array> diff --git a/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/LoiConverterTest.kt b/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/LoiConverterTest.kt index 8e5c219a86..7b3e25593a 100644 --- a/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/LoiConverterTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/LoiConverterTest.kt @@ -29,8 +29,6 @@ import org.groundplatform.android.data.remote.firebase.protobuf.toFirestoreMap import org.groundplatform.android.data.remote.firebase.schema.LoiConverter.toLoi import org.groundplatform.android.model.AuditInfo import org.groundplatform.android.model.Survey -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.locationofinterest.LocationOfInterest @@ -44,6 +42,8 @@ import org.groundplatform.android.proto.coordinates import org.groundplatform.android.proto.geometry import org.groundplatform.android.proto.locationOfInterest import org.groundplatform.android.proto.point +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock diff --git a/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/SubmissionMutationConverterTest.kt b/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/SubmissionMutationConverterTest.kt index fbea7b26e5..9a66e0d2a1 100644 --- a/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/SubmissionMutationConverterTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/remote/firebase/schema/SubmissionMutationConverterTest.kt @@ -22,10 +22,6 @@ import kotlinx.collections.immutable.persistentListOf import org.groundplatform.android.FakeData import org.groundplatform.android.data.remote.firebase.protobuf.createSubmissionMessage import org.groundplatform.android.data.remote.firebase.protobuf.toFirestoreMap -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.mutation.Mutation import org.groundplatform.android.model.mutation.SubmissionMutation import org.groundplatform.android.model.submission.CaptureLocationTaskData @@ -74,6 +70,10 @@ import org.groundplatform.android.proto.TaskData.SKIPPED_FIELD_NUMBER import org.groundplatform.android.proto.TaskData.TASK_ID_FIELD_NUMBER import org.groundplatform.android.proto.TaskData.TEXT_RESPONSE_FIELD_NUMBER import org.groundplatform.android.proto.TaskData.TextResponse.TEXT_FIELD_NUMBER +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Assert.assertThrows import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/data/sync/LocalMutationSyncWorkerTest.kt b/app/src/test/java/org/groundplatform/android/data/sync/LocalMutationSyncWorkerTest.kt index a975c5bb09..3c7f6a4d7d 100644 --- a/app/src/test/java/org/groundplatform/android/data/sync/LocalMutationSyncWorkerTest.kt +++ b/app/src/test/java/org/groundplatform/android/data/sync/LocalMutationSyncWorkerTest.kt @@ -38,7 +38,6 @@ import org.groundplatform.android.data.local.stores.LocalSurveyStore import org.groundplatform.android.data.local.stores.LocalUserStore import org.groundplatform.android.data.remote.FakeRemoteDataStore import org.groundplatform.android.di.coroutines.IoDispatcher -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.mutation.LocationOfInterestMutation import org.groundplatform.android.model.mutation.Mutation import org.groundplatform.android.model.mutation.Mutation.SyncStatus.FAILED @@ -50,6 +49,7 @@ import org.groundplatform.android.model.mutation.SubmissionMutation import org.groundplatform.android.repository.MutationRepository import org.groundplatform.android.repository.UserRepository import org.groundplatform.android.system.auth.FakeAuthenticationManager +import org.groundplatform.domain.model.geometry.Point import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/model/geometry/GeometryTest.kt b/app/src/test/java/org/groundplatform/android/model/geometry/GeometryTest.kt index fd8b76116c..b0a65dfd55 100644 --- a/app/src/test/java/org/groundplatform/android/model/geometry/GeometryTest.kt +++ b/app/src/test/java/org/groundplatform/android/model/geometry/GeometryTest.kt @@ -18,6 +18,14 @@ package org.groundplatform.android.model.geometry import com.google.common.truth.Truth.assertThat import org.groundplatform.android.data.local.room.converter.toLocalDataStoreObject import org.groundplatform.android.data.remote.firebase.schema.Path +import org.groundplatform.android.ui.map.gms.GmsExt.area +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.InvalidGeometryException +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.MultiPolygon +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Assert import org.junit.Test @@ -75,7 +83,7 @@ class GeometryTest { @Test fun `point area`() { val point = point(x, y) - assertThat(point.area).isEqualTo(0.0) + assertThat(point.area()).isEqualTo(0.0) } @Test @@ -89,7 +97,7 @@ class GeometryTest { fun `polygon area`() { val polygon = polygon(path1, path2) - assertThat(polygon.area).isEqualTo(4130.091187385864) + assertThat(polygon.area()).isEqualTo(4130.091187385864) } @Test @@ -110,7 +118,7 @@ class GeometryTest { fun `multi polygon area`() { val multiPolygon = multiPolygon(polygon(path1, path2), polygon(path3, path4)) - assertThat(multiPolygon.area).isEqualTo(5953.0440156963905) + assertThat(multiPolygon.area()).isEqualTo(5953.0440156963905) } @Test @@ -168,7 +176,7 @@ class GeometryTest { @Test fun `area of line string`() { - assertThat(LineString(CLOSED_LOOP).area).isEqualTo(0.0) + assertThat(LineString(CLOSED_LOOP).area()).isEqualTo(0.0) } private fun point(x: Double, y: Double) = Point(Coordinates(x, y)) diff --git a/app/src/test/java/org/groundplatform/android/repository/LocationOfInterestRepositoryTest.kt b/app/src/test/java/org/groundplatform/android/repository/LocationOfInterestRepositoryTest.kt index 0eab6eacaa..0408c16f64 100644 --- a/app/src/test/java/org/groundplatform/android/repository/LocationOfInterestRepositoryTest.kt +++ b/app/src/test/java/org/groundplatform/android/repository/LocationOfInterestRepositoryTest.kt @@ -29,16 +29,16 @@ import org.groundplatform.android.FakeData import org.groundplatform.android.data.local.stores.LocalLocationOfInterestStore import org.groundplatform.android.data.remote.FakeRemoteDataStore import org.groundplatform.android.data.sync.MutationSyncWorkManager -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Point -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.map.Bounds import org.groundplatform.android.model.mutation.Mutation.Type.CREATE import org.groundplatform.android.proto.Survey.DataVisibility import org.groundplatform.android.system.auth.FakeAuthenticationManager import org.groundplatform.android.usecases.survey.ActivateSurveyUseCase import org.groundplatform.android.usecases.survey.SyncSurveyUseCase +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/system/GeocodingManagerTest.kt b/app/src/test/java/org/groundplatform/android/system/GeocodingManagerTest.kt index 94fd22235e..6b131c0dfe 100644 --- a/app/src/test/java/org/groundplatform/android/system/GeocodingManagerTest.kt +++ b/app/src/test/java/org/groundplatform/android/system/GeocodingManagerTest.kt @@ -24,9 +24,9 @@ import javax.inject.Inject import kotlin.test.assertEquals import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.di.SystemModule -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds import org.groundplatform.android.ui.map.gms.GmsExt.center +import org.groundplatform.domain.model.geometry.Coordinates import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyInt diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionFragmentTest.kt index 34f389cd53..366c9fbcee 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionFragmentTest.kt @@ -38,8 +38,6 @@ import org.groundplatform.android.R import org.groundplatform.android.data.local.room.converter.SubmissionDeltasConverter import org.groundplatform.android.data.remote.FakeRemoteDataStore import org.groundplatform.android.data.sync.MutationSyncWorkManager -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.map.CameraPosition import org.groundplatform.android.model.mutation.Mutation import org.groundplatform.android.model.mutation.SubmissionMutation @@ -60,6 +58,8 @@ import org.groundplatform.android.repository.UserRepository import org.groundplatform.android.testrules.FragmentScenarioRule import org.groundplatform.android.ui.datacollection.tasks.point.DropPinTaskViewModel import org.groundplatform.android.usecases.survey.ActivateSurveyUseCase +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskFragmentTest.kt index 6dbe7dabb2..33e1d3e702 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskFragmentTest.kt @@ -23,8 +23,6 @@ import javax.inject.Inject import kotlinx.coroutines.flow.MutableSharedFlow import org.groundplatform.android.FlakyTest import org.groundplatform.android.R -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.submission.CaptureLocationTaskData import org.groundplatform.android.model.task.Task @@ -36,6 +34,8 @@ import org.groundplatform.android.ui.datacollection.DataCollectionViewModel import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.BaseTaskFragmentTest +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskFragmentTest.kt index a52c64c607..22ef6b3475 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskFragmentTest.kt @@ -19,8 +19,6 @@ import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidTest import javax.inject.Inject import org.groundplatform.android.data.local.LocalValueStore -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.map.CameraPosition @@ -31,6 +29,8 @@ import org.groundplatform.android.ui.datacollection.DataCollectionViewModel import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.BaseTaskFragmentTest +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModelTest.kt index b8f92042c9..ab128d3aab 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskViewModelTest.kt @@ -28,13 +28,13 @@ import kotlinx.coroutines.test.advanceUntilIdle import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.FakeData.JOB import org.groundplatform.android.FakeData.newTask -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.map.CameraPosition import org.groundplatform.android.model.submission.DropPinTaskData import org.groundplatform.android.model.submission.TaskData import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskFragmentTest.kt index 84e5f73fdc..fb6fb1248a 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskFragmentTest.kt @@ -19,10 +19,6 @@ import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidTest import javax.inject.Inject -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.submission.DrawAreaTaskData @@ -33,6 +29,10 @@ import org.groundplatform.android.ui.datacollection.DataCollectionViewModel import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.BaseTaskFragmentTest +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModelTest.kt index 4da473000f..487e429bd6 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskViewModelTest.kt @@ -37,10 +37,6 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.test.advanceUntilIdle import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.data.local.LocalValueStore -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.LineString -import org.groundplatform.android.model.geometry.LinearRing -import org.groundplatform.android.model.geometry.Polygon import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.settings.MeasurementUnits @@ -53,6 +49,10 @@ import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface import org.groundplatform.android.ui.datacollection.tasks.polygon.DrawAreaTaskViewModel.Companion.DISTANCE_THRESHOLD_DP import org.groundplatform.android.ui.map.Feature import org.groundplatform.android.ui.map.gms.GmsExt.getShellCoordinates +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.LineString +import org.groundplatform.domain.model.geometry.LinearRing +import org.groundplatform.domain.model.geometry.Polygon import org.junit.Assert.assertThrows import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt index 7622ed84e9..2d9e744112 100644 --- a/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/HomeScreenMapContainerViewModelTest.kt @@ -31,7 +31,6 @@ import org.groundplatform.android.FakeData.LOCATION_OF_INTEREST_FEATURE import org.groundplatform.android.FakeData.SURVEY import org.groundplatform.android.FakeData.USER import org.groundplatform.android.data.remote.FakeRemoteDataStore -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds import org.groundplatform.android.model.map.CameraPosition import org.groundplatform.android.repository.LocationOfInterestRepository @@ -41,6 +40,7 @@ import org.groundplatform.android.system.auth.FakeAuthenticationManager import org.groundplatform.android.ui.home.mapcontainer.jobs.AdHocDataCollectionButtonData import org.groundplatform.android.ui.home.mapcontainer.jobs.SelectedLoiSheetData import org.groundplatform.android.usecases.survey.ActivateSurveyUseCase +import org.groundplatform.domain.model.geometry.Coordinates import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheetTest.kt b/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheetTest.kt index 0b24fcbe41..249c56e381 100644 --- a/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheetTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/home/mapcontainer/jobs/LoiJobSheetTest.kt @@ -25,12 +25,12 @@ import org.groundplatform.android.FakeData.USER import org.groundplatform.android.R import org.groundplatform.android.getString import org.groundplatform.android.model.AuditInfo -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.job.Style import org.groundplatform.android.model.locationofinterest.LocationOfInterest import org.groundplatform.android.model.task.Task +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Rule import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/MogClientTest.kt b/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/MogClientTest.kt index 6881e54255..eb17f10dba 100644 --- a/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/MogClientTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/MogClientTest.kt @@ -23,8 +23,8 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.runBlocking import org.groundplatform.android.data.remote.RemoteStorageManager -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds +import org.groundplatform.domain.model.geometry.Coordinates import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull diff --git a/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinatesTest.kt b/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinatesTest.kt index b75d0b15b0..ddebf14153 100644 --- a/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinatesTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/map/gms/mog/TileCoordinatesTest.kt @@ -16,8 +16,8 @@ package org.groundplatform.android.ui.map.gms.mog import com.google.common.truth.Truth.assertThat -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds +import org.groundplatform.domain.model.geometry.Coordinates import org.junit.Test class TileCoordinatesTest { diff --git a/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/OfflineAreaSelectorViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/OfflineAreaSelectorViewModelTest.kt index 0321ddbe02..18e791e5cb 100644 --- a/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/OfflineAreaSelectorViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/OfflineAreaSelectorViewModelTest.kt @@ -26,7 +26,6 @@ import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.groundplatform.android.BaseHiltTest -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.Bounds import org.groundplatform.android.model.map.CameraPosition import org.groundplatform.android.repository.LocationOfInterestRepository @@ -39,6 +38,7 @@ import org.groundplatform.android.system.PermissionsManager import org.groundplatform.android.system.SettingsManager import org.groundplatform.android.ui.offlineareas.selector.model.BottomTextState import org.groundplatform.android.util.toMbString +import org.groundplatform.domain.model.geometry.Coordinates import org.junit.After import org.junit.Assert.assertEquals import org.junit.Before diff --git a/app/src/test/java/org/groundplatform/android/ui/syncstatus/SyncStatusFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/syncstatus/SyncStatusFragmentTest.kt index 7e961cac9a..13113fcf3c 100644 --- a/app/src/test/java/org/groundplatform/android/ui/syncstatus/SyncStatusFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/syncstatus/SyncStatusFragmentTest.kt @@ -38,10 +38,10 @@ import org.groundplatform.android.data.local.stores.LocalSubmissionStore import org.groundplatform.android.data.local.stores.LocalSurveyStore import org.groundplatform.android.data.local.stores.LocalUserStore import org.groundplatform.android.data.remote.FakeRemoteDataStore -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.repository.SurveyRepository import org.groundplatform.android.testrules.FragmentScenarioRule +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/usecases/submission/SubmitDataUseCaseTest.kt b/app/src/test/java/org/groundplatform/android/usecases/submission/SubmitDataUseCaseTest.kt index b33a459f7b..d016cdef01 100644 --- a/app/src/test/java/org/groundplatform/android/usecases/submission/SubmitDataUseCaseTest.kt +++ b/app/src/test/java/org/groundplatform/android/usecases/submission/SubmitDataUseCaseTest.kt @@ -23,8 +23,6 @@ import kotlin.test.assertFailsWith import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.FakeData.newTask import org.groundplatform.android.data.sync.MutationSyncWorkManager -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.geometry.Point import org.groundplatform.android.model.job.Job import org.groundplatform.android.model.submission.CaptureLocationTaskData import org.groundplatform.android.model.submission.DropPinTaskData @@ -32,6 +30,8 @@ import org.groundplatform.android.model.submission.ValueDelta import org.groundplatform.android.model.task.Task import org.groundplatform.android.repository.LocationOfInterestRepository import org.groundplatform.android.repository.SubmissionRepository +import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Point import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt b/app/src/test/java/org/groundplatform/android/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt index 608aa1e4c3..343f7d6e92 100644 --- a/app/src/test/java/org/groundplatform/android/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt +++ b/app/src/test/java/org/groundplatform/android/usecases/survey/RemoveOfflineSurveyUseCaseTest.kt @@ -25,9 +25,9 @@ import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.FakeData.SURVEY import org.groundplatform.android.data.local.LocalValueStore import org.groundplatform.android.data.local.stores.LocalSurveyStore -import org.groundplatform.android.model.geometry.Coordinates import org.groundplatform.android.model.map.CameraPosition import org.groundplatform.android.repository.SurveyRepository +import org.groundplatform.domain.model.geometry.Coordinates import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/util/CoordinatesExtTest.kt b/app/src/test/java/org/groundplatform/android/util/CoordinatesExtTest.kt index aa26ab5092..32c5d42e40 100644 --- a/app/src/test/java/org/groundplatform/android/util/CoordinatesExtTest.kt +++ b/app/src/test/java/org/groundplatform/android/util/CoordinatesExtTest.kt @@ -19,7 +19,7 @@ package org.groundplatform.android.util import com.google.android.gms.maps.model.LatLng import com.google.common.truth.Truth.assertThat import junit.framework.TestCase.assertEquals -import org.groundplatform.android.model.geometry.Coordinates +import org.groundplatform.domain.model.geometry.Coordinates import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/util/UiFormatUtilTest.kt b/app/src/test/java/org/groundplatform/android/util/UiFormatUtilTest.kt new file mode 100644 index 0000000000..f0a27aace3 --- /dev/null +++ b/app/src/test/java/org/groundplatform/android/util/UiFormatUtilTest.kt @@ -0,0 +1,64 @@ +/* + * 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 org.groundplatform.android.util + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import java.util.Locale +import kotlin.test.Test +import org.groundplatform.android.model.settings.MeasurementUnits +import org.groundplatform.android.ui.util.SQUARE_FEET_PER_SQUARE_METER +import org.groundplatform.android.ui.util.SQUARE_METERS_PER_ACRE +import org.groundplatform.android.ui.util.SQUARE_METERS_PER_HECTARE +import org.groundplatform.android.ui.util.getFormattedArea +import org.junit.Assert.assertEquals +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class UiFormatUtilTest { + @Test + fun `Should display area in square meters if it's below an hectare`() { + val areaInSquareMeters = 500.0 + val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.METRIC) + assertEquals("500.00 m²", result) + } + + @Test + fun `Should display area in hectare if it's equal or above an hectare`() { + val areaInSquareMeters = SQUARE_METERS_PER_HECTARE.toDouble() + val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.METRIC) + assertEquals("1.00 ha", result) + } + + @Test + fun `Should display area in square feet if it's below an acre`() { + val areaInSquareMeters = 2000.0 + val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.IMPERIAL) + val expected = + String.format( + Locale.getDefault(), + "%.2f ft²", + areaInSquareMeters * SQUARE_FEET_PER_SQUARE_METER, + ) + assertEquals(expected, result) + } + + @Test + fun `Should display area in acres if it's equal or above an acre`() { + val areaInSquareMeters = SQUARE_METERS_PER_ACRE + val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.IMPERIAL) + assertEquals("1.00 ac", result) + } +} diff --git a/app/src/main/java/org/groundplatform/android/model/geometry/Coordinates.kt b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/Coordinates.kt similarity index 94% rename from app/src/main/java/org/groundplatform/android/model/geometry/Coordinates.kt rename to core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/Coordinates.kt index 68f3af8830..389be341d3 100644 --- a/app/src/main/java/org/groundplatform/android/model/geometry/Coordinates.kt +++ b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/Coordinates.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.groundplatform.android.model.geometry +package org.groundplatform.domain.model.geometry import kotlinx.serialization.Serializable diff --git a/app/src/main/java/org/groundplatform/android/model/geometry/Geometry.kt b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/Geometry.kt similarity index 83% rename from app/src/main/java/org/groundplatform/android/model/geometry/Geometry.kt rename to core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/Geometry.kt index 208ce08fb2..c03ca88c61 100644 --- a/app/src/main/java/org/groundplatform/android/model/geometry/Geometry.kt +++ b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/Geometry.kt @@ -13,21 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.groundplatform.android.model.geometry +package org.groundplatform.domain.model.geometry -import com.google.maps.android.SphericalUtil.computeArea import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.groundplatform.android.ui.map.gms.GmsExt.center -import org.groundplatform.android.ui.map.gms.GmsExt.toBounds -import org.groundplatform.android.ui.map.gms.toLatLngList -import org.groundplatform.android.ui.util.isClosed +import org.groundplatform.domain.util.isClosed /** A common ancestor for all geometry types. */ @Serializable sealed interface Geometry { - val area: Double - /** * Returns the center coordinates of the geometry. It may or may not be within the geometry bounds * if the shape is irregular. @@ -50,10 +44,6 @@ sealed interface Geometry { @Serializable @SerialName("polygon") data class Polygon(val shell: LinearRing, val holes: List = listOf()) : Geometry { - override val area: Double - get() = - computeArea(shell.coordinates.toLatLngList()) - - holes.sumOf { computeArea(it.coordinates.toLatLngList()) } override fun center(): Coordinates = shell.center() @@ -66,8 +56,6 @@ data class Polygon(val shell: LinearRing, val holes: List = listOf() @Serializable @SerialName("point") data class Point(val coordinates: Coordinates) : Geometry { - override val area: Double - get() = 0.0 override fun center(): Coordinates = coordinates @@ -78,8 +66,6 @@ data class Point(val coordinates: Coordinates) : Geometry { @Serializable @SerialName("multi_polygon") data class MultiPolygon(val polygons: List) : Geometry { - override val area: Double - get() = polygons.sumOf { it.area } override fun center(): Coordinates = polygons.map { it.center() }.centerOrError() @@ -90,8 +76,6 @@ data class MultiPolygon(val polygons: List) : Geometry { @Serializable @SerialName("line_string") data class LineString(val coordinates: List) : Geometry { - override val area: Double - get() = 0.0 override fun center(): Coordinates = coordinates.centerOrError() @@ -111,8 +95,6 @@ data class LineString(val coordinates: List) : Geometry { @Serializable @SerialName("linear_ring") data class LinearRing(val coordinates: List) : Geometry { - override val area: Double - get() = 0.0 init { validate() @@ -163,10 +145,20 @@ data class LinearRing(val coordinates: List) : Geometry { } /** - * Returns the center coordinates of the bounding box from the given list of coordinates. + * Returns the center coordinates of the bounding box from the given list of coordinates. This + * mirrors the behavior of `LatLngBounds.center`, but is implemented in pure Kotlin and does not + * depend on Google Maps classes to keep this a pure domain module * * Note: This might return an unexpected result for oddly shaped polygons. Check if this can be * replaced with a centroid. See (#1737) for more info. */ -private fun List?.centerOrError(): Coordinates = - this?.map { Point(it) }?.toBounds()?.center() ?: error("missing vertices") +private fun List?.centerOrError(): Coordinates { + if (this.isNullOrEmpty()) error("missing vertices") + + val minLat = this.minOf { it.lat } + val maxLat = this.maxOf { it.lat } + val minLng = this.minOf { it.lng } + val maxLng = this.maxOf { it.lng } + + return Coordinates(lat = (minLat + maxLat) / 2.0, lng = (minLng + maxLng) / 2.0) +} diff --git a/app/src/main/java/org/groundplatform/android/model/geometry/InvalidGeometryException.kt b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/InvalidGeometryException.kt similarity index 94% rename from app/src/main/java/org/groundplatform/android/model/geometry/InvalidGeometryException.kt rename to core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/InvalidGeometryException.kt index 5255036b65..c9055b0761 100644 --- a/app/src/main/java/org/groundplatform/android/model/geometry/InvalidGeometryException.kt +++ b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/model/geometry/InvalidGeometryException.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.groundplatform.android.model.geometry +package org.groundplatform.domain.model.geometry /** * Represents types of geometry errors. diff --git a/app/src/main/java/org/groundplatform/android/ui/util/PolygonUtil.kt b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/util/PolygonUtil.kt similarity index 75% rename from app/src/main/java/org/groundplatform/android/ui/util/PolygonUtil.kt rename to core/domain/src/commonMain/kotlin/org/groundplatform/domain/util/PolygonUtil.kt index aa41881afe..319c38ebec 100644 --- a/app/src/main/java/org/groundplatform/android/ui/util/PolygonUtil.kt +++ b/core/domain/src/commonMain/kotlin/org/groundplatform/domain/util/PolygonUtil.kt @@ -13,19 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.groundplatform.android.ui.util +package org.groundplatform.domain.util -import androidx.annotation.VisibleForTesting -import java.util.Locale import kotlin.math.PI import kotlin.math.abs import kotlin.math.cos -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.settings.MeasurementUnits - -@VisibleForTesting const val SQUARE_METERS_PER_ACRE = 4046.86 -@VisibleForTesting const val SQUARE_METERS_PER_HECTARE = 10_000 -@VisibleForTesting const val SQUARE_FEET_PER_SQUARE_METER = 10.7639 +import org.groundplatform.domain.model.geometry.Coordinates /** * Calculates the area of a polygon using the Shoelace formula. @@ -33,8 +26,9 @@ import org.groundplatform.android.model.settings.MeasurementUnits * This function computes the area of a simple, non-self-intersecting polygon based on its vertex * coordinates. The first coordinate is used as a reference to convert all other points to meters. * - * @param coordinates A list of [Coordinates] representing the vertices of the polygon. The list - * must contain at least three points; otherwise, the function returns 0.0. + * @param coordinates A list of [org.groundplatform.domain.model.geometry.Coordinates] representing + * the vertices of the polygon. The list must contain at least three points; otherwise, the + * function returns 0.0. * @return The area of the polygon in square meters. */ fun calculateShoelacePolygonArea(coordinates: List): Double { @@ -51,26 +45,6 @@ fun calculateShoelacePolygonArea(coordinates: List): Double { ) / 2.0 } -fun getFormattedArea(areaInSquareMeters: Double, measurementUnits: MeasurementUnits): String { - val (convertedArea, stringUnit) = - when (measurementUnits) { - MeasurementUnits.METRIC -> - if (areaInSquareMeters < SQUARE_METERS_PER_HECTARE) { - areaInSquareMeters to "m²" - } else { - areaInSquareMeters / SQUARE_METERS_PER_HECTARE to "ha" - } - MeasurementUnits.IMPERIAL -> - if (areaInSquareMeters < SQUARE_METERS_PER_ACRE) { - areaInSquareMeters * SQUARE_FEET_PER_SQUARE_METER to "ft²" - } else { - areaInSquareMeters / SQUARE_METERS_PER_ACRE to "ac" - } - } - val rounded = String.format(Locale.getDefault(), "%.2f", convertedArea) - return "$rounded $stringUnit" -} - /** Converts geographic coordinate to meters relative to reference point. */ private fun toMeters(reference: Coordinates, point: Coordinates): Pair { val earthRadius = 6378137.0 diff --git a/app/src/test/java/org/groundplatform/android/util/PolygonUtilTest.kt b/core/domain/src/commonTest/kotlin/org/groundplatform/domain/util/PolygonUtilTest.kt similarity index 72% rename from app/src/test/java/org/groundplatform/android/util/PolygonUtilTest.kt rename to core/domain/src/commonTest/kotlin/org/groundplatform/domain/util/PolygonUtilTest.kt index a86de7fef3..87b6257f1f 100644 --- a/app/src/test/java/org/groundplatform/android/util/PolygonUtilTest.kt +++ b/core/domain/src/commonTest/kotlin/org/groundplatform/domain/util/PolygonUtilTest.kt @@ -13,27 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.groundplatform.android.util +package org.groundplatform.domain.util -import androidx.test.ext.junit.runners.AndroidJUnit4 -import java.util.Locale -import junit.framework.TestCase.assertFalse import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse import kotlin.test.assertTrue -import org.groundplatform.android.model.geometry.Coordinates -import org.groundplatform.android.model.settings.MeasurementUnits -import org.groundplatform.android.ui.util.SQUARE_FEET_PER_SQUARE_METER -import org.groundplatform.android.ui.util.SQUARE_METERS_PER_ACRE -import org.groundplatform.android.ui.util.SQUARE_METERS_PER_HECTARE -import org.groundplatform.android.ui.util.calculateShoelacePolygonArea -import org.groundplatform.android.ui.util.getFormattedArea -import org.groundplatform.android.ui.util.isClosed -import org.groundplatform.android.ui.util.isSelfIntersecting -import org.groundplatform.android.ui.util.segmentsIntersect -import org.junit.Assert.assertEquals -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) +import org.groundplatform.domain.model.geometry.Coordinates + class PolygonUtilTest { @Test @@ -183,40 +170,6 @@ class PolygonUtilTest { assertFalse(isClosed(emptyList())) } - @Test - fun `Should display area in square meters if it's below an hectare`() { - val areaInSquareMeters = 500.0 - val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.METRIC) - assertEquals("500.00 m²", result) - } - - @Test - fun `Should display area in hectare if it's equal or above an hectare`() { - val areaInSquareMeters = SQUARE_METERS_PER_HECTARE.toDouble() - val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.METRIC) - assertEquals("1.00 ha", result) - } - - @Test - fun `Should display area in square feet if it's below an acre`() { - val areaInSquareMeters = 2000.0 - val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.IMPERIAL) - val expected = - String.format( - Locale.getDefault(), - "%.2f ft²", - areaInSquareMeters * SQUARE_FEET_PER_SQUARE_METER, - ) - assertEquals(expected, result) - } - - @Test - fun `Should display area in acres if it's equal or above an acre`() { - val areaInSquareMeters = SQUARE_METERS_PER_ACRE - val result = getFormattedArea(areaInSquareMeters, MeasurementUnits.IMPERIAL) - assertEquals("1.00 ac", result) - } - companion object { val P1 = Coordinates(1.0, 1.0) val P2 = Coordinates(4.0, 4.0)