diff --git a/app/src/main/java/org/groundplatform/android/data/local/LocalValueStore.kt b/app/src/main/java/org/groundplatform/android/data/local/LocalValueStore.kt index 0d26118aaa..134e6a7d8c 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/LocalValueStore.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/LocalValueStore.kt @@ -185,26 +185,26 @@ constructor(private val preferences: SharedPreferences, private val locale: Loca private fun getDeserializedCameraPosition(serializedValue: String): CameraPosition? = runCatching { - if (serializedValue.isEmpty()) return null - val parts = serializedValue.split(",") - val lat = parts[0].trim().toDouble() - val long = parts[1].trim().toDouble() - val zoomLevel = parts[2].trim().toFloatOrNull() - val south = parts[3].trim().toDoubleOrNull() - val west = parts[4].trim().toDoubleOrNull() - val north = parts[5].trim().toDoubleOrNull() - val east = parts[6].trim().toDoubleOrNull() - - var bounds: Bounds? = null - if (south != null && west != null && north != null && east != null) { - bounds = Bounds(south, west, north, east) - } - - return CameraPosition(Coordinates(lat, long), zoomLevel, bounds) - } - .getOrElse { exception -> - Timber.e(exception) - // Prevent app from crashing if we are unable to parse the camera position - null + if (serializedValue.isEmpty()) return null + val parts = serializedValue.split(",") + val lat = parts[0].trim().toDouble() + val long = parts[1].trim().toDouble() + val zoomLevel = parts[2].trim().toFloatOrNull() + val south = parts[3].trim().toDoubleOrNull() + val west = parts[4].trim().toDoubleOrNull() + val north = parts[5].trim().toDoubleOrNull() + val east = parts[6].trim().toDoubleOrNull() + + var bounds: Bounds? = null + if (south != null && west != null && north != null && east != null) { + bounds = Bounds(south, west, north, east) } + + return CameraPosition(Coordinates(lat, long), zoomLevel, bounds) + } + .getOrElse { exception -> + Timber.e(exception) + // Prevent app from crashing if we are unable to parse the camera position + null + } } diff --git a/app/src/main/java/org/groundplatform/android/data/local/room/LocalDatabase.kt b/app/src/main/java/org/groundplatform/android/data/local/room/LocalDatabase.kt index 7a3b6d8981..4f6722fa9e 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/room/LocalDatabase.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/room/LocalDatabase.kt @@ -96,7 +96,7 @@ import org.groundplatform.android.data.local.room.fields.TileSetEntityState AutoMigration(from = 121, to = 122), AutoMigration(from = 122, to = 123), AutoMigration(from = 123, to = 124), - AutoMigration(from = 127, to = 128) + AutoMigration(from = 127, to = 128), ], ) @TypeConverters( 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 1b07c3b092..ee1d5f814c 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 @@ -52,7 +52,6 @@ import org.groundplatform.android.data.local.room.relations.SurveyEntityAndRelat import org.groundplatform.android.data.local.room.relations.TaskEntityAndRelations import org.groundplatform.android.data.remote.firebase.protobuf.toModel import org.groundplatform.android.data.remote.firebase.protobuf.toProto -import org.groundplatform.domain.model.imagery.OfflineArea import org.groundplatform.android.proto.Survey as SurveyProto import org.groundplatform.android.proto.Survey.DataSharingTerms import org.groundplatform.domain.model.Survey @@ -60,6 +59,7 @@ import org.groundplatform.domain.model.User import org.groundplatform.domain.model.geometry.Coordinates import org.groundplatform.domain.model.geometry.Geometry import org.groundplatform.domain.model.geometry.Point +import org.groundplatform.domain.model.imagery.OfflineArea import org.groundplatform.domain.model.job.Job import org.groundplatform.domain.model.job.Job.DataCollectionStrategy import org.groundplatform.domain.model.job.Style @@ -263,14 +263,10 @@ fun MultipleChoice.toLocalDataStoreObject(taskId: String): MultipleChoiceEntity private fun OfflineAreaEntityState.toModelObject() = when (this) { - OfflineAreaEntityState.PENDING -> - OfflineArea.State.PENDING - OfflineAreaEntityState.IN_PROGRESS -> - OfflineArea.State.IN_PROGRESS - OfflineAreaEntityState.DOWNLOADED -> - OfflineArea.State.DOWNLOADED - OfflineAreaEntityState.FAILED -> - OfflineArea.State.FAILED + OfflineAreaEntityState.PENDING -> OfflineArea.State.PENDING + OfflineAreaEntityState.IN_PROGRESS -> OfflineArea.State.IN_PROGRESS + OfflineAreaEntityState.DOWNLOADED -> OfflineArea.State.DOWNLOADED + OfflineAreaEntityState.FAILED -> OfflineArea.State.FAILED else -> throw IllegalArgumentException("Unknown area state: $this") } @@ -516,7 +512,7 @@ fun ExpressionEntity.toModelObject(): Expression = expressionType = expressionType.toExpressionType(), taskId = taskId, optionIds = optionIds?.split(',')?.toSet() ?: setOf(), - otherSelected = otherSelected + otherSelected = otherSelected, ) fun DraftSubmissionEntity.toModelObject(survey: Survey): DraftSubmission? { diff --git a/app/src/main/java/org/groundplatform/android/data/local/room/dao/BaseDao.kt b/app/src/main/java/org/groundplatform/android/data/local/room/dao/BaseDao.kt index a6a1bb27fe..1eca0b8482 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/room/dao/BaseDao.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/room/dao/BaseDao.kt @@ -36,8 +36,8 @@ interface BaseDao { } /** - * Conservative SQLite variable limit. The actual limit is ~999, but 900 ensures - * compatibility across SQLite versions. Use when chunking IN clauses. + * Conservative SQLite variable limit. The actual limit is ~999, but 900 ensures compatibility + * across SQLite versions. Use when chunking IN clauses. */ const val MAX_SQL_VARIABLES = 900 diff --git a/app/src/main/java/org/groundplatform/android/data/local/room/stores/RoomLocationOfInterestStore.kt b/app/src/main/java/org/groundplatform/android/data/local/room/stores/RoomLocationOfInterestStore.kt index 45916f84ff..d34b17853b 100644 --- a/app/src/main/java/org/groundplatform/android/data/local/room/stores/RoomLocationOfInterestStore.kt +++ b/app/src/main/java/org/groundplatform/android/data/local/room/stores/RoomLocationOfInterestStore.kt @@ -136,11 +136,10 @@ class RoomLocationOfInterestStore @Inject internal constructor() : LocalLocation } override suspend fun insertOrUpdateAll(lois: List) { - val entities = - lois.map { - require(!it.geometry.isEmpty()) { "Cannot save LOI ${it.id} with empty geometry" } - it.toLocalDataStoreObject() - } + val entities = lois.map { + require(!it.geometry.isEmpty()) { "Cannot save LOI ${it.id} with empty geometry" } + it.toLocalDataStoreObject() + } locationOfInterestDao.upsertAll(entities) } diff --git a/app/src/main/java/org/groundplatform/android/data/remote/firebase/FirestoreDataStore.kt b/app/src/main/java/org/groundplatform/android/data/remote/firebase/FirestoreDataStore.kt index e51fbd1dcd..1c7addd08d 100644 --- a/app/src/main/java/org/groundplatform/android/data/remote/firebase/FirestoreDataStore.kt +++ b/app/src/main/java/org/groundplatform/android/data/remote/firebase/FirestoreDataStore.kt @@ -105,17 +105,17 @@ internal constructor( override suspend fun subscribeToSurveyUpdates(surveyId: String) { if (USE_EMULATORS) return Timber.d("Subscribing to FCM topic $surveyId") - Firebase.messaging - .subscribeToTopic(surveyId) - .addOnFailureListener { Timber.w(it, "Failed to subscribe to FCM topic $surveyId") } + Firebase.messaging.subscribeToTopic(surveyId).addOnFailureListener { + Timber.w(it, "Failed to subscribe to FCM topic $surveyId") + } } override suspend fun unsubscribeFromSurveyUpdates(surveyId: String) { if (USE_EMULATORS) return Timber.d("Unsubscribing from FCM topic $surveyId") - Firebase.messaging - .unsubscribeFromTopic(surveyId) - .addOnFailureListener { Timber.w(it, "Failed to unsubscribe from FCM topic $surveyId") } + Firebase.messaging.unsubscribeFromTopic(surveyId).addOnFailureListener { + Timber.w(it, "Failed to unsubscribe from FCM topic $surveyId") + } } /** diff --git a/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/FirestoreToProtobufExt.kt b/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/FirestoreToProtobufExt.kt index 6ccfd2a310..e38c81a3f2 100644 --- a/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/FirestoreToProtobufExt.kt +++ b/app/src/main/java/org/groundplatform/android/data/remote/firebase/protobuf/FirestoreToProtobufExt.kt @@ -86,9 +86,10 @@ private fun FirestoreMapEntry.toMessageField( private fun FirestoreKey.toMessageFieldNumber() = toIntOrNull() ?: throw IllegalArgumentException("Non-numeric document key $this") -private fun FirestoreMap.toMessageMap(mapValueType: KClass<*>): MessageMap = - map { (key: FirestoreValue, value: FirestoreValue) -> key to value.toMessageValue(mapValueType) } - .toMap() +@Suppress("ExpressionBodySyntax") +private fun FirestoreMap.toMessageMap(mapValueType: KClass<*>): MessageMap { + return map { (key, value) -> key to value.toMessageValue(mapValueType) }.toMap() +} @Suppress("UNCHECKED_CAST") private fun FirestoreValue.toMessageValue( diff --git a/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/ConditionConverter.kt b/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/ConditionConverter.kt index 30dbf7d5d3..65884f0515 100644 --- a/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/ConditionConverter.kt +++ b/app/src/main/java/org/groundplatform/android/data/remote/firebase/schema/ConditionConverter.kt @@ -37,7 +37,7 @@ internal object ConditionConverter { expressionType = ExpressionType.ANY_OF_SELECTED, taskId = multipleChoice.taskId, optionIds = multipleChoice.optionIdsList.toSet(), - otherSelected = multipleChoice.otherSelected + otherSelected = multipleChoice.otherSelected, ) ) return Condition(MatchType.MATCH_ANY, expressions) diff --git a/app/src/main/java/org/groundplatform/android/repository/MutationRepository.kt b/app/src/main/java/org/groundplatform/android/repository/MutationRepository.kt index 80018b6e31..3a7866557e 100644 --- a/app/src/main/java/org/groundplatform/android/repository/MutationRepository.kt +++ b/app/src/main/java/org/groundplatform/android/repository/MutationRepository.kt @@ -122,14 +122,14 @@ constructor( mutations: List ): MutationRepositoryInterface.MutationResult = try { - markAsInProgress(mutations) - uploadMutations(mutations) - finalizeDeletions(mutations) - val (hasMediaToUpload, hasNoMedia) = - mutations.partition { it is SubmissionMutation && it.getPhotoData().isNotEmpty() } - if (hasNoMedia.isNotEmpty()) markAsComplete(hasNoMedia) - if (hasMediaToUpload.isNotEmpty()) markForMediaUpload(hasMediaToUpload) - MutationRepositoryInterface.MutationResult.Success(hasMediaToUpload.isNotEmpty()) + markAsInProgress(mutations) + uploadMutations(mutations) + finalizeDeletions(mutations) + val (hasMediaToUpload, hasNoMedia) = + mutations.partition { it is SubmissionMutation && it.getPhotoData().isNotEmpty() } + if (hasNoMedia.isNotEmpty()) markAsComplete(hasNoMedia) + if (hasMediaToUpload.isNotEmpty()) markForMediaUpload(hasMediaToUpload) + MutationRepositoryInterface.MutationResult.Success(hasMediaToUpload.isNotEmpty()) } catch (t: Throwable) { // Mark all mutations as having failed since the remote datastore only commits when all // mutations have succeeded. diff --git a/app/src/main/java/org/groundplatform/android/repository/OfflineAreaRepository.kt b/app/src/main/java/org/groundplatform/android/repository/OfflineAreaRepository.kt index c075a5fb62..6e26f67079 100644 --- a/app/src/main/java/org/groundplatform/android/repository/OfflineAreaRepository.kt +++ b/app/src/main/java/org/groundplatform/android/repository/OfflineAreaRepository.kt @@ -25,9 +25,6 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.mapNotNull import org.groundplatform.android.data.local.stores.LocalOfflineAreaStore import org.groundplatform.android.data.uuid.OfflineUuidGenerator -import org.groundplatform.domain.model.imagery.LocalTileSource -import org.groundplatform.domain.model.imagery.OfflineArea -import org.groundplatform.domain.model.imagery.TileSource import org.groundplatform.android.system.GeocodingManager import org.groundplatform.android.ui.map.gms.mog.MogClient import org.groundplatform.android.ui.map.gms.mog.MogTileDownloader @@ -36,6 +33,9 @@ import org.groundplatform.android.ui.map.gms.mog.maxZoom import org.groundplatform.android.ui.util.FileUtil import org.groundplatform.android.util.deleteIfEmpty import org.groundplatform.android.util.rangeOf +import org.groundplatform.domain.model.imagery.LocalTileSource +import org.groundplatform.domain.model.imagery.OfflineArea +import org.groundplatform.domain.model.imagery.TileSource import org.groundplatform.domain.model.map.Bounds import org.groundplatform.domain.model.util.ByteCount import org.groundplatform.domain.repository.OfflineAreaRepositoryInterface @@ -52,7 +52,7 @@ constructor( private val geocodingManager: GeocodingManager, private val mogClient: MogClient, private val offlineUuidGenerator: OfflineUuidGenerator, -): OfflineAreaRepositoryInterface { +) : OfflineAreaRepositoryInterface { private suspend fun addOfflineArea(bounds: Bounds, zoomRange: IntRange) { val areaName = geocodingManager.getAreaName(bounds.shrink(AREA_NAME_SENSITIVITY)) diff --git a/app/src/main/java/org/groundplatform/android/repository/TermsOfServiceRepository.kt b/app/src/main/java/org/groundplatform/android/repository/TermsOfServiceRepository.kt index 67298fb475..e38bd1486a 100644 --- a/app/src/main/java/org/groundplatform/android/repository/TermsOfServiceRepository.kt +++ b/app/src/main/java/org/groundplatform/android/repository/TermsOfServiceRepository.kt @@ -36,7 +36,7 @@ constructor( private val networkManager: NetworkManager, private val remoteDataStore: RemoteDataStore, private val localValueStore: LocalValueStore, -): TermsOfServiceRepositoryInterface { +) : TermsOfServiceRepositoryInterface { override var isTermsOfServiceAccepted: Boolean by localValueStore::isTermsOfServiceAccepted diff --git a/app/src/main/java/org/groundplatform/android/repository/UserRepository.kt b/app/src/main/java/org/groundplatform/android/repository/UserRepository.kt index c94a42a049..c515e9d14e 100644 --- a/app/src/main/java/org/groundplatform/android/repository/UserRepository.kt +++ b/app/src/main/java/org/groundplatform/android/repository/UserRepository.kt @@ -109,9 +109,10 @@ constructor( if (ownerId == user.id) return true // Check if user is a survey organizer - val isOrganizer = - runCatching { surveyRepository.activeSurvey?.getRole(user.email) == Role.SURVEY_ORGANIZER } - .getOrElse { false } + val isOrganizer = runCatching { + surveyRepository.activeSurvey?.getRole(user.email) == Role.SURVEY_ORGANIZER + } + .getOrElse { false } return isOrganizer } diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionScreen.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionScreen.kt index 7edc08f9bf..32a604ee5c 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionScreen.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/DataCollectionScreen.kt @@ -82,8 +82,7 @@ fun DataCollectionScreen( uiState = uiState, onCloseClicked = { viewModel.onCloseClicked() }, onLoiReportAction = { viewModel.onLoiReportAction(it) }, - ) { - readyState -> + ) { readyState -> val tasks = readyState.tasks if (tasks.isNotEmpty()) { val position = readyState.position diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/AbstractTaskMapFragment.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/AbstractTaskMapFragment.kt index a78395d4b0..03a73be8a0 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/AbstractTaskMapFragment.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/AbstractTaskMapFragment.kt @@ -30,6 +30,8 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import java.math.RoundingMode +import java.text.DecimalFormat import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch @@ -51,8 +53,6 @@ import org.groundplatform.android.util.setComposableContent import org.groundplatform.android.util.toDmsFormat import org.groundplatform.domain.model.map.CameraPosition import org.jetbrains.annotations.MustBeInvokedByOverriders -import java.math.RoundingMode -import java.text.DecimalFormat abstract class AbstractTaskMapFragment : AbstractMapContainerFragment() { diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreen.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreen.kt index 5205ce0726..7326346f3c 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreen.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreen.kt @@ -36,6 +36,8 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle +import java.text.SimpleDateFormat +import java.util.Date import org.groundplatform.android.R import org.groundplatform.android.ui.common.ExcludeFromJacocoGeneratedReport import org.groundplatform.android.ui.datacollection.TaskPosition @@ -44,8 +46,6 @@ import org.groundplatform.android.ui.datacollection.tasks.TaskScreen import org.groundplatform.domain.model.submission.DateTimeTaskData import org.groundplatform.ui.theme.AppTheme import org.groundplatform.ui.theme.sizes -import java.text.SimpleDateFormat -import java.util.Date const val DATE_PICKER_TEST_TAG: String = "date picker test tag" diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreen.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreen.kt index f49268433a..772d1ccb70 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreen.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreen.kt @@ -51,7 +51,7 @@ fun CaptureLocationTaskScreen( clazz = CaptureLocationTaskMapFragment::class.java, arguments = bundleOf(Pair(DataCollectionFragment.TASK_ID, viewModel.task.id)), ) - } + }, ) { val taskActionButtonsStates by viewModel.taskActionButtonStates.collectAsStateWithLifecycle() val showAccuracyCard by viewModel.showAccuracyCard.collectAsStateWithLifecycle() diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceItemView.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceItemView.kt index 288ebf34c8..853478f3bc 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceItemView.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceItemView.kt @@ -44,11 +44,11 @@ import androidx.compose.ui.unit.dp import ground_android.core.ui.generated.resources.Res import ground_android.core.ui.generated.resources.other import org.groundplatform.android.common.Constants -import org.jetbrains.compose.resources.stringResource import org.groundplatform.android.ui.common.ExcludeFromJacocoGeneratedReport import org.groundplatform.domain.model.task.MultipleChoice import org.groundplatform.domain.model.task.Option import org.groundplatform.ui.theme.AppTheme +import org.jetbrains.compose.resources.stringResource const val MULTIPLE_CHOICE_ITEM_TEST_TAG = "multiple choice item test tag" const val OTHER_INPUT_TEXT_TEST_TAG = "other input test tag" diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskViewModel.kt index e5413a2b75..4bc71bf1a4 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskViewModel.kt @@ -22,6 +22,8 @@ import android.os.Build import android.os.Build.VERSION_CODES import androidx.core.net.toUri import androidx.lifecycle.viewModelScope +import java.io.File +import javax.inject.Inject import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted @@ -41,8 +43,6 @@ import org.groundplatform.domain.model.submission.isNotNullOrEmpty import org.groundplatform.domain.model.task.PhotoTaskData import org.groundplatform.domain.repository.UserMediaRepositoryInterface import timber.log.Timber -import java.io.File -import javax.inject.Inject class PhotoTaskViewModel @Inject 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 27dae065e3..9538fc311a 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 @@ -51,8 +51,6 @@ constructor( /** Whether the instructions dialog has been shown or not. */ internal var instructionsDialogShown: Boolean by localValueStore::dropPinInstructionsShown - - override fun initialize( job: Job, task: Task, diff --git a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreen.kt b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreen.kt index cb949e185b..ee11e6ff1e 100644 --- a/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreen.kt +++ b/app/src/main/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreen.kt @@ -36,6 +36,9 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date import org.groundplatform.android.R import org.groundplatform.android.ui.common.ExcludeFromJacocoGeneratedReport import org.groundplatform.android.ui.datacollection.TaskPosition @@ -44,9 +47,6 @@ import org.groundplatform.android.ui.datacollection.tasks.TaskScreen import org.groundplatform.domain.model.submission.DateTimeTaskData import org.groundplatform.ui.theme.AppTheme import org.groundplatform.ui.theme.sizes -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Date const val TIME_PICKER_TEST_TAG: String = "time picker test tag" diff --git a/app/src/main/java/org/groundplatform/android/ui/home/HomeScreenViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/home/HomeScreenViewModel.kt index 9312ecc799..b3afb15d26 100644 --- a/app/src/main/java/org/groundplatform/android/ui/home/HomeScreenViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/home/HomeScreenViewModel.kt @@ -100,16 +100,17 @@ internal constructor( viewModelScope.launch { kickLocalMutationSyncWorkers() } } - val drawerState: StateFlow = - flow { emit(userRepository.getAuthenticatedUser()) } - .combine(surveyRepository.activeSurveyFlow) { user, survey -> - HomeDrawerState( - user = user, - survey = survey, - appVersion = org.groundplatform.android.BuildConfig.VERSION_NAME, - ) - } - .stateIn(viewModelScope, SharingStarted.Lazily, null) + val drawerState: StateFlow = flow { + emit(userRepository.getAuthenticatedUser()) + } + .combine(surveyRepository.activeSurveyFlow) { user, survey -> + HomeDrawerState( + user = user, + survey = survey, + appVersion = org.groundplatform.android.BuildConfig.VERSION_NAME, + ) + } + .stateIn(viewModelScope, SharingStarted.Lazily, null) /** * Enqueue data and photo upload workers for all pending mutations when home screen is first 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 e027d2bf6f..0f2dc98557 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 @@ -175,11 +175,10 @@ internal constructor( } .stateIn(viewModelScope, SharingStarted.Lazily, listOf()) - adHocLoiJobs = - activeSurvey.map { survey -> - if (survey == null) listOf() - else survey.jobs.filter { it.canDataCollectorsAddLois && it.getAddLoiTask() != null } - } + adHocLoiJobs = activeSurvey.map { survey -> + if (survey == null) listOf() + else survey.jobs.filter { it.canDataCollectorsAddLois && it.getAddLoiTask() != null } + } jobMapComponentState = processJobMapComponentState() 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 49775b2599..e44658f8a9 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,9 +18,9 @@ package org.groundplatform.android.ui.map import android.annotation.SuppressLint import androidx.annotation.IdRes import kotlinx.coroutines.flow.SharedFlow -import org.groundplatform.domain.model.imagery.TileSource import org.groundplatform.android.ui.common.AbstractFragment import org.groundplatform.domain.model.geometry.Coordinates +import org.groundplatform.domain.model.imagery.TileSource import org.groundplatform.domain.model.map.Bounds import org.groundplatform.domain.model.map.CameraPosition import org.groundplatform.domain.model.map.MapType 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 fe6aedcd22..0eae247ef4 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,9 +44,6 @@ import kotlin.math.sqrt import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch -import org.groundplatform.domain.model.imagery.LocalTileSource -import org.groundplatform.domain.model.imagery.RemoteMogTileSource -import org.groundplatform.domain.model.imagery.TileSource import org.groundplatform.android.ui.common.AbstractFragment import org.groundplatform.android.ui.map.Feature import org.groundplatform.android.ui.map.MapFragment @@ -56,6 +53,9 @@ 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 org.groundplatform.domain.model.imagery.LocalTileSource +import org.groundplatform.domain.model.imagery.RemoteMogTileSource +import org.groundplatform.domain.model.imagery.TileSource import org.groundplatform.domain.model.map.Bounds import org.groundplatform.domain.model.map.CameraPosition import org.groundplatform.domain.model.map.MapType diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogMetadataReader.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogMetadataReader.kt index 8099994765..3f248258af 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogMetadataReader.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogMetadataReader.kt @@ -17,11 +17,11 @@ package org.groundplatform.android.ui.map.gms.mog import com.google.common.io.LittleEndianDataInputStream -import org.groundplatform.domain.model.imagery.TiffTag -import org.groundplatform.domain.model.imagery.TiffTagDataType import java.io.DataInput import java.io.DataInputStream import java.nio.charset.StandardCharsets +import org.groundplatform.domain.model.imagery.TiffTag +import org.groundplatform.domain.model.imagery.TiffTagDataType private const val NULL_CHAR = 0.toChar() diff --git a/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogTileDownloader.kt b/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogTileDownloader.kt index 3ecfcf8b3f..5258f07532 100644 --- a/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogTileDownloader.kt +++ b/app/src/main/java/org/groundplatform/android/ui/map/gms/mog/MogTileDownloader.kt @@ -37,20 +37,19 @@ class MogTileDownloader(private val client: MogClient, private val outputBasePat * Executes the provided [requests], writing resulting tiles to [outputBasePath] in sub-paths of * the form `{z}/{x}/{y}.jpg`. */ - suspend fun downloadTiles(requests: List) = - flow { - client.getTiles(requests).collect { tile -> - currentCoroutineContext().ensureActive() - val outFile = File(outputBasePath, tile.metadata.tileCoordinates.getTilePath()) - outFile.parentFile?.mkdirs() - val gmsTile = tile.toGmsTile() - val data = gmsTile.data!! - outFile.writeBytes(data) - Timber.d("Saved ${data.size} bytes to ${outFile.path}") - emit(data.size) - } - } - .cancellable() + suspend fun downloadTiles(requests: List) = flow { + client.getTiles(requests).collect { tile -> + currentCoroutineContext().ensureActive() + val outFile = File(outputBasePath, tile.metadata.tileCoordinates.getTilePath()) + outFile.parentFile?.mkdirs() + val gmsTile = tile.toGmsTile() + val data = gmsTile.data!! + outFile.writeBytes(data) + Timber.d("Saved ${data.size} bytes to ${outFile.path}") + emit(data.size) + } + } + .cancellable() } fun TileCoordinates.getTilePath() = "$zoom/$x/$y.jpg" diff --git a/app/src/main/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModel.kt b/app/src/main/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModel.kt index 178cd1bcf7..77764ea43f 100644 --- a/app/src/main/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModel.kt +++ b/app/src/main/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModel.kt @@ -42,11 +42,11 @@ import org.groundplatform.android.system.GmsQrCodeScanner import org.groundplatform.android.ui.common.AbstractViewModel import org.groundplatform.android.usecases.survey.ActivateSurveyUseCase import org.groundplatform.android.usecases.survey.ListAvailableSurveysUseCase -import org.groundplatform.domain.usecases.survey.RemoveOfflineSurveyUseCase import org.groundplatform.android.util.SurveyDeepLinkParser import org.groundplatform.domain.model.SurveyListItem import org.groundplatform.domain.repository.UserRepositoryInterface import org.groundplatform.domain.usecases.survey.GetSurveyListItemUseCase +import org.groundplatform.domain.usecases.survey.RemoveOfflineSurveyUseCase import timber.log.Timber /** Represents view state and behaviors of the survey selector dialog. */ diff --git a/app/src/main/java/org/groundplatform/android/util/FileExt.kt b/app/src/main/java/org/groundplatform/android/util/FileExt.kt index 7ad7015953..c63cce430f 100644 --- a/app/src/main/java/org/groundplatform/android/util/FileExt.kt +++ b/app/src/main/java/org/groundplatform/android/util/FileExt.kt @@ -25,4 +25,3 @@ fun File?.isEmpty() = this?.listFiles().isNullOrEmpty() fun File.deleteIfEmpty() { if (isEmpty()) delete() } - diff --git a/app/src/main/java/org/groundplatform/android/util/IntentExt.kt b/app/src/main/java/org/groundplatform/android/util/IntentExt.kt index a062582cc1..442d942f9d 100644 --- a/app/src/main/java/org/groundplatform/android/util/IntentExt.kt +++ b/app/src/main/java/org/groundplatform/android/util/IntentExt.kt @@ -23,8 +23,8 @@ import android.provider.Settings /** * Opens the system settings screen for the current application. * - * This is typically used to allow users to manually manage app permissions or clear app data - * when they have permanently denied a permission request. + * This is typically used to allow users to manually manage app permissions or clear app data when + * they have permanently denied a permission request. */ fun Activity.openAppSettings() { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) 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 53947b1a35..9f2acda7a8 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 @@ -58,13 +58,13 @@ class GeometryConverterTest { fun `toGeometry converts point from proto`() { assertThat( geometry { - point = point { - coordinates = coordinates { - latitude = x - longitude = y - } + point = point { + coordinates = coordinates { + latitude = x + longitude = y } } + } .toGeometry() ) .isEqualTo(Point(coordinates = 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 7ef42829b3..5a7943fe30 100644 --- a/app/src/test/java/org/groundplatform/android/repository/LocationOfInterestRepositoryTest.kt +++ b/app/src/test/java/org/groundplatform/android/repository/LocationOfInterestRepositoryTest.kt @@ -176,11 +176,10 @@ class LocationOfInterestRepositoryTest : BaseHiltTest() { @Test fun `sync that fails midway keeps saved pages and deletes nothing`() = runWithTestDispatcher { val newLoi = createPoint("6", COORDINATE_2) - fakeRemoteDataStore.predefinedLoiPages = - flow { - emit(listOf(newLoi)) - throw TestSyncException() - } + fakeRemoteDataStore.predefinedLoiPages = flow { + emit(listOf(newLoi)) + throw TestSyncException() + } assertFailsWith { locationOfInterestRepository.syncLocationsOfInterest(TEST_SURVEY) @@ -209,8 +208,9 @@ class LocationOfInterestRepositoryTest : BaseHiltTest() { @Test fun `sync updates lois that changed remotely`() = runWithTestDispatcher { val updated = TEST_POINT_OF_INTEREST_1.copy(geometry = Point(COORDINATE_3)) - fakeRemoteDataStore.predefinedLois = - TEST_LOCATIONS_OF_INTEREST.map { if (it.id == updated.id) updated else it } + fakeRemoteDataStore.predefinedLois = TEST_LOCATIONS_OF_INTEREST.map { + if (it.id == updated.id) updated else it + } locationOfInterestRepository.syncLocationsOfInterest(TEST_SURVEY) diff --git a/app/src/test/java/org/groundplatform/android/repository/OfflineAreaRepositoryTest.kt b/app/src/test/java/org/groundplatform/android/repository/OfflineAreaRepositoryTest.kt index 5c48ae5438..1365cf3aa4 100644 --- a/app/src/test/java/org/groundplatform/android/repository/OfflineAreaRepositoryTest.kt +++ b/app/src/test/java/org/groundplatform/android/repository/OfflineAreaRepositoryTest.kt @@ -263,8 +263,7 @@ class OfflineAreaRepositoryTest { private companion object { val TEST_BOUNDS = Bounds(0.0, 0.0, 1.0, 1.0) - val TEST_AREA = - OfflineArea("id", OfflineArea.State.DOWNLOADED, TEST_BOUNDS, "Test Area", 0..14) + val TEST_AREA = OfflineArea("id", OfflineArea.State.DOWNLOADED, TEST_BOUNDS, "Test Area", 0..14) val TEST_COLLECTION = MogCollection(listOf(MogSource(0..14, "/path/{z}/{x}/{y}.tif"))) } } diff --git a/app/src/test/java/org/groundplatform/android/ui/common/BaseMapViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/common/BaseMapViewModelTest.kt index 4ea4b05c92..49ed01eaa2 100644 --- a/app/src/test/java/org/groundplatform/android/ui/common/BaseMapViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/common/BaseMapViewModelTest.kt @@ -170,36 +170,35 @@ class BaseMapViewModelTest : BaseHiltTest() { } @Test - fun `Should show existing features on the map`() = - runWithTestDispatcher { - setupMocks() - val areaOfInterest = AREA_OF_INTEREST.copy(id = "loi id 2") - whenever(surveyRepository.activeSurveyFlow).thenReturn(MutableStateFlow(SURVEY)) - whenever(locationOfInterestRepository.getValidLois(SURVEY)) - .thenReturn(flowOf(setOf(LOCATION_OF_INTEREST, areaOfInterest))) - - val features = viewModel.existingLoiFeatures.first { it.isNotEmpty() } - - assertThat(features) - .containsExactly( - Feature( - id = LOCATION_OF_INTEREST.id, - type = Feature.Type.LOCATION_OF_INTEREST, - geometry = LOCATION_OF_INTEREST.geometry, - style = Feature.Style(JOB.getDefaultColor()), - clusterable = false, - selected = false, - ), - Feature( - id = areaOfInterest.id, - type = Feature.Type.LOCATION_OF_INTEREST, - geometry = areaOfInterest.geometry, - style = Feature.Style(JOB.getDefaultColor()), - clusterable = false, - selected = false, - ), - ) - } + fun `Should show existing features on the map`() = runWithTestDispatcher { + setupMocks() + val areaOfInterest = AREA_OF_INTEREST.copy(id = "loi id 2") + whenever(surveyRepository.activeSurveyFlow).thenReturn(MutableStateFlow(SURVEY)) + whenever(locationOfInterestRepository.getValidLois(SURVEY)) + .thenReturn(flowOf(setOf(LOCATION_OF_INTEREST, areaOfInterest))) + + val features = viewModel.existingLoiFeatures.first { it.isNotEmpty() } + + assertThat(features) + .containsExactly( + Feature( + id = LOCATION_OF_INTEREST.id, + type = Feature.Type.LOCATION_OF_INTEREST, + geometry = LOCATION_OF_INTEREST.geometry, + style = Feature.Style(JOB.getDefaultColor()), + clusterable = false, + selected = false, + ), + Feature( + id = areaOfInterest.id, + type = Feature.Type.LOCATION_OF_INTEREST, + geometry = areaOfInterest.geometry, + style = Feature.Style(JOB.getDefaultColor()), + clusterable = false, + selected = false, + ), + ) + } private fun setupMocks( isLocationLocked: Boolean = false, diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionViewModelTest.kt index 6e508f80de..bf3dcae7d2 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/DataCollectionViewModelTest.kt @@ -120,7 +120,7 @@ class DataCollectionViewModelTest : BaseHiltTest() { viewModelFactory = mock(), dataCollectionInitializer = initializer, getLoiReportUseCase = mock(), - loiReportExporter = mock() + loiReportExporter = mock(), ) } diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreenTest.kt index ac4bf9346c..266e208a82 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/date/DateTaskScreenTest.kt @@ -24,6 +24,8 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import com.google.common.truth.Truth.assertThat +import java.text.SimpleDateFormat +import java.util.Date import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.ButtonActionStateChecker @@ -37,8 +39,6 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner -import java.text.SimpleDateFormat -import java.util.Date @RunWith(RobolectricTestRunner::class) class DateTaskScreenTest { diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/instruction/InstructionTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/instruction/InstructionTaskScreenTest.kt index 5f6275c302..65b7348339 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/instruction/InstructionTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/instruction/InstructionTaskScreenTest.kt @@ -25,11 +25,11 @@ import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.components.TEST_TAG_TASK_VIEW_HEADER import org.groundplatform.android.ui.datacollection.tasks.ButtonActionStateChecker +import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface import org.groundplatform.domain.model.job.Job import org.groundplatform.domain.model.submission.TaskData import org.groundplatform.domain.model.task.Task -import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -67,11 +67,7 @@ class InstructionTaskScreenTest { ) } - composeTestRule.setContent { - InstructionTaskScreen( - viewModel = viewModel, - ) - } + composeTestRule.setContent { InstructionTaskScreen(viewModel = viewModel) } } @Test diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreenTest.kt index ccf594987f..cb653b78d0 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/location/CaptureLocationTaskScreenTest.kt @@ -242,7 +242,7 @@ class CaptureLocationTaskScreenTest { composeTestRule.setContent { CaptureLocationTaskScreen( viewModel = viewModel, - mapContent = {} + mapContent = {}, ) } } diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceTaskScreenTest.kt index 65df2b3fe9..23092586e8 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/multiplechoice/MultipleChoiceTaskScreenTest.kt @@ -72,11 +72,7 @@ class MultipleChoiceTaskScreenTest { eventReporter = {}, ) - composeTestRule.setContent { - MultipleChoiceTaskScreen( - viewModel = viewModel, - ) - } + composeTestRule.setContent { MultipleChoiceTaskScreen(viewModel = viewModel) } } @Test diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/number/NumberTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/number/NumberTaskScreenTest.kt index 27bc2ba741..dd9bca152b 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/number/NumberTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/number/NumberTaskScreenTest.kt @@ -64,11 +64,7 @@ class NumberTaskScreenTest { buttonActionStateChecker = ButtonActionStateChecker(composeTestRule) - composeTestRule.setContent { - NumberTaskScreen( - viewModel = viewModel, - ) - } + composeTestRule.setContent { NumberTaskScreen(viewModel = viewModel) } } @Test diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskScreenTest.kt index 0381213832..0026d2a679 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/photo/PhotoTaskScreenTest.kt @@ -24,12 +24,14 @@ import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import com.google.common.truth.Truth.assertThat +import java.io.File import kotlinx.coroutines.runBlocking import org.groundplatform.android.system.PermissionDeniedException import org.groundplatform.android.system.PermissionsManager import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.ButtonActionStateChecker +import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface import org.groundplatform.domain.model.job.Job import org.groundplatform.domain.model.job.Style @@ -37,7 +39,6 @@ import org.groundplatform.domain.model.submission.TaskData import org.groundplatform.domain.model.task.PhotoTaskData import org.groundplatform.domain.model.task.Task import org.groundplatform.domain.repository.UserMediaRepositoryInterface -import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.junit.Before import org.junit.Rule import org.junit.Test @@ -49,7 +50,6 @@ import org.mockito.kotlin.doThrow import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import org.robolectric.RobolectricTestRunner -import java.io.File @RunWith(RobolectricTestRunner::class) class PhotoTaskScreenTest { @@ -89,9 +89,7 @@ class PhotoTaskScreenTest { eventReporter = { lastEvent = it }, ) - composeTestRule.setContent { - PhotoTaskScreen(viewModel = viewModel) - } + composeTestRule.setContent { PhotoTaskScreen(viewModel = viewModel) } } @Test diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskScreenTest.kt index 3c35991dd0..e80744e8e9 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/point/DropPinTaskScreenTest.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.HiltAndroidTest +import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.FakeData.JOB @@ -43,7 +44,6 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner -import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltAndroidTest @@ -182,7 +182,7 @@ class DropPinTaskScreenTest : BaseHiltTest() { shouldShowLoiNameDialog = false, loiName = "", onLoiNameAction = {}, - mapContent = {} + mapContent = {}, ) } } diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskScreenTest.kt index 625590fc7f..7f6f9f8aae 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/polygon/DrawAreaTaskScreenTest.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.HiltAndroidTest +import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.FakeData.JOB @@ -46,7 +47,6 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner -import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltAndroidTest @@ -261,7 +261,7 @@ class DrawAreaTaskScreenTest : BaseHiltTest() { shouldShowLoiNameDialog = false, loiName = "", onLoiNameAction = {}, - mapContent = {} + mapContent = {}, ) } } 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 77e26a2ca0..39848e50b2 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 @@ -351,9 +351,7 @@ class DrawAreaTaskViewModelTest : BaseHiltTest() { with(requireNotNull(states.find { it.action == ButtonAction.ADD_POINT })) { assertFalse(isVisible) } - with(requireNotNull(states.find { it.action == ButtonAction.NEXT })) { - assertTrue(isVisible) - } + with(requireNotNull(states.find { it.action == ButtonAction.NEXT })) { assertTrue(isVisible) } } @Test diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/text/TextTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/text/TextTaskScreenTest.kt index 61a6bbb6e0..a228f431c7 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/text/TextTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/text/TextTaskScreenTest.kt @@ -29,12 +29,12 @@ import org.groundplatform.android.common.Constants import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.ButtonActionStateChecker +import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface import org.groundplatform.domain.model.job.Job import org.groundplatform.domain.model.submission.TaskData import org.groundplatform.domain.model.submission.TextTaskData import org.groundplatform.domain.model.task.Task -import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -66,11 +66,7 @@ class TextTaskScreenTest { eventReporter = { lastEvent = it }, ) - composeTestRule.setContent { - TextTaskScreen( - viewModel = viewModel, - ) - } + composeTestRule.setContent { TextTaskScreen(viewModel = viewModel) } } @Test diff --git a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreenTest.kt index c0e83e47d5..d07408357b 100644 --- a/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/datacollection/tasks/time/TimeTaskScreenTest.kt @@ -24,21 +24,21 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import com.google.common.truth.Truth.assertThat +import java.text.SimpleDateFormat +import java.util.Date import org.groundplatform.android.ui.datacollection.components.ButtonAction import org.groundplatform.android.ui.datacollection.components.ButtonActionState import org.groundplatform.android.ui.datacollection.tasks.ButtonActionStateChecker +import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.groundplatform.android.ui.datacollection.tasks.TaskPositionInterface import org.groundplatform.domain.model.job.Job import org.groundplatform.domain.model.submission.DateTimeTaskData import org.groundplatform.domain.model.submission.TaskData import org.groundplatform.domain.model.task.Task -import org.groundplatform.android.ui.datacollection.tasks.DataCollectionEvent import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner -import java.text.SimpleDateFormat -import java.util.Date @RunWith(RobolectricTestRunner::class) class TimeTaskScreenTest { @@ -66,11 +66,7 @@ class TimeTaskScreenTest { eventReporter = { lastEvent = it }, ) - composeTestRule.setContent { - TimeTaskScreen( - viewModel = viewModel, - ) - } + composeTestRule.setContent { TimeTaskScreen(viewModel = viewModel) } } @Test diff --git a/app/src/test/java/org/groundplatform/android/ui/home/DataSharingTermsDialogTest.kt b/app/src/test/java/org/groundplatform/android/ui/home/DataSharingTermsDialogTest.kt index a99d1903dd..c36b2da658 100644 --- a/app/src/test/java/org/groundplatform/android/ui/home/DataSharingTermsDialogTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/home/DataSharingTermsDialogTest.kt @@ -22,11 +22,11 @@ import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import com.google.common.truth.Truth.assertThat -import org.junit.Test import org.groundplatform.android.R import org.groundplatform.android.getString import org.groundplatform.domain.model.Survey import org.junit.Rule +import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/ui/home/HomeScreenFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/home/HomeScreenFragmentTest.kt index ee3ca37111..6fe1ea20b2 100644 --- a/app/src/test/java/org/groundplatform/android/ui/home/HomeScreenFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/home/HomeScreenFragmentTest.kt @@ -165,9 +165,7 @@ class HomeScreenFragmentTest : AbstractHomeScreenFragmentTest() { .onNodeWithText(fragment.getString(R.string.terms_of_service)) .assertIsDisplayed() composeTestRule - .onNodeWithText( - fragment.getString(R.string.build, BuildConfig.VERSION_NAME) - ) + .onNodeWithText(fragment.getString(R.string.build, BuildConfig.VERSION_NAME)) .assertIsDisplayed() } @@ -177,9 +175,7 @@ class HomeScreenFragmentTest : AbstractHomeScreenFragmentTest() { swipeUpDrawer() composeTestRule - .onNodeWithText( - fragment.getString(R.string.build, BuildConfig.VERSION_NAME) - ) + .onNodeWithText(fragment.getString(R.string.build, BuildConfig.VERSION_NAME)) .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Button)) .performClick() 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 ce49d7c4ad..f535f79bdd 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 @@ -161,9 +161,7 @@ class HomeScreenMapContainerViewModelTest : BaseHiltTest() { @Test fun `job component state is AddLoiButton below clustering threshold`() = runWithTestDispatcher { - viewModel.onMapCameraMoved( - CAMERA_POSITION.copy(zoomLevel = CLUSTERING_ZOOM_THRESHOLD - 1f) - ) + viewModel.onMapCameraMoved(CAMERA_POSITION.copy(zoomLevel = CLUSTERING_ZOOM_THRESHOLD - 1f)) advanceUntilIdle() val state = viewModel.processJobMapComponentState().first() diff --git a/app/src/test/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProviderTest.kt b/app/src/test/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProviderTest.kt index 57842d6c87..3130545bd7 100644 --- a/app/src/test/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProviderTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/map/gms/CachingUpscalingTileProviderTest.kt @@ -20,8 +20,8 @@ import com.google.android.gms.maps.model.Tile import com.google.android.gms.maps.model.TileProvider import com.google.common.truth.Truth.assertThat import java.io.ByteArrayOutputStream -import org.junit.Test import org.junit.Before +import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/DownloadProgressDialogTest.kt b/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/DownloadProgressDialogTest.kt index c418c37b67..be8b150aff 100644 --- a/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/DownloadProgressDialogTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/offlineareas/selector/DownloadProgressDialogTest.kt @@ -21,11 +21,11 @@ import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import dagger.hilt.android.testing.HiltAndroidTest -import org.junit.Test import org.groundplatform.android.R import org.groundplatform.android.getString import org.junit.Assert.assertTrue import org.junit.Rule +import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/ui/signin/SignInFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/signin/SignInFragmentTest.kt index 2efe7a50bf..f118b02e6e 100644 --- a/app/src/test/java/org/groundplatform/android/ui/signin/SignInFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/signin/SignInFragmentTest.kt @@ -23,7 +23,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.junit.Ignore import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.advanceUntilIdle @@ -35,6 +34,7 @@ import org.groundplatform.android.system.auth.FakeAuthenticationManager import org.groundplatform.android.testrules.FragmentScenarioRule import org.groundplatform.domain.model.auth.SignInState import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModelTest.kt index 27f206a023..2c679cea9e 100644 --- a/app/src/test/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/surveyselector/SurveySelectorViewModelTest.kt @@ -36,12 +36,12 @@ import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.system.GmsQrCodeScanner import org.groundplatform.android.usecases.survey.ActivateSurveyUseCase import org.groundplatform.android.usecases.survey.ListAvailableSurveysUseCase -import org.groundplatform.domain.usecases.survey.RemoveOfflineSurveyUseCase import org.groundplatform.android.util.SurveyDeepLinkParser import org.groundplatform.domain.model.Survey import org.groundplatform.domain.model.SurveyListItem import org.groundplatform.domain.repository.UserRepositoryInterface import org.groundplatform.domain.usecases.survey.GetSurveyListItemUseCase +import org.groundplatform.domain.usecases.survey.RemoveOfflineSurveyUseCase import org.junit.Before import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceFragmentTest.kt b/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceFragmentTest.kt index 0abdf1d898..21c757498d 100644 --- a/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceFragmentTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceFragmentTest.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.test.junit4.v2.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.core.os.bundleOf import dagger.hilt.android.testing.HiltAndroidTest +import javax.inject.Inject import org.groundplatform.android.BaseHiltTest import org.groundplatform.android.data.remote.FakeRemoteDataStore import org.groundplatform.android.testrules.FragmentScenarioRule @@ -28,8 +29,8 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner -import javax.inject.Inject +@Suppress("MultilineRawStringIndentation") @HiltAndroidTest @RunWith(RobolectricTestRunner::class) class TermsOfServiceFragmentTest : BaseHiltTest() { @@ -50,19 +51,25 @@ class TermsOfServiceFragmentTest : BaseHiltTest() { bundleOf(Pair("isViewOnly", false)) ) - composeTestRule.onNodeWithText(""" + composeTestRule + .onNodeWithText( + """ This is a heading Sample terms of service - """.trimIndent()).isDisplayed() + """ + .trimIndent() + ) + .isDisplayed() composeTestRule .onNodeWithText( """ -

This is a heading

-

Sample terms of service

- """.trimIndent() +

This is a heading

+

Sample terms of service

+ """ + .trimIndent() ) .isDisplayed() } diff --git a/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceScreenTest.kt b/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceScreenTest.kt index 0515819b35..dafce07d06 100644 --- a/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceScreenTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceScreenTest.kt @@ -17,7 +17,6 @@ package org.groundplatform.android.ui.tos import androidx.compose.material3.Text import androidx.compose.ui.test.assertIsDisplayed -import androidx.lifecycle.SavedStateHandle import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertIsNotEnabled @@ -26,6 +25,7 @@ import androidx.compose.ui.test.junit4.v2.createComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.lifecycle.SavedStateHandle import ground_android.core.ui.generated.resources.Res import ground_android.core.ui.generated.resources.retry import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -64,12 +64,17 @@ class TermsOfServiceScreenTest { private fun setupViewModel( result: Result = Result.success(TEST_TOS), - isViewOnly: Boolean = false + isViewOnly: Boolean = false, ) { fakeRepository.termsOfService = result val savedStateHandle = SavedStateHandle(mapOf("isViewOnly" to isViewOnly)) viewModel = - TermsOfServiceViewModel(authManager, fakeRepository, playInstallReferrerService, savedStateHandle) + TermsOfServiceViewModel( + authManager, + fakeRepository, + playInstallReferrerService, + savedStateHandle, + ) } private fun setScreenContent( @@ -151,9 +156,7 @@ class TermsOfServiceScreenTest { setupViewModel(Result.failure(Exception("Failed to load")), isViewOnly = true) setScreenContent() - composeTestRule.waitUntil(timeoutMillis = 5000) { - viewModel.uiState.value is TosUiState.Error - } + composeTestRule.waitUntil(timeoutMillis = 5000) { viewModel.uiState.value is TosUiState.Error } composeTestRule.onNodeWithText(getString(Res.string.retry)).assertIsDisplayed() fakeRepository.termsOfService = Result.success(TEST_TOS) diff --git a/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceViewModelTest.kt b/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceViewModelTest.kt index 3e93274981..e982880897 100644 --- a/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceViewModelTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/tos/TermsOfServiceViewModelTest.kt @@ -64,7 +64,12 @@ class TermsOfServiceViewModelTest { private fun setupViewModel(isViewOnly: Boolean = false) = runTest { val savedStateHandle = SavedStateHandle(mapOf("isViewOnly" to isViewOnly)) viewModel = - TermsOfServiceViewModel(authManager, fakeRepository, playInstallReferrerService, savedStateHandle) + TermsOfServiceViewModel( + authManager, + fakeRepository, + playInstallReferrerService, + savedStateHandle, + ) advanceUntilIdle() } diff --git a/app/src/test/java/org/groundplatform/android/ui/util/LocaleAwareMeasureFormatterTest.kt b/app/src/test/java/org/groundplatform/android/ui/util/LocaleAwareMeasureFormatterTest.kt index dc6678b5dc..aca395bed5 100644 --- a/app/src/test/java/org/groundplatform/android/ui/util/LocaleAwareMeasureFormatterTest.kt +++ b/app/src/test/java/org/groundplatform/android/ui/util/LocaleAwareMeasureFormatterTest.kt @@ -18,9 +18,9 @@ package org.groundplatform.android.ui.util import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.HiltAndroidTest import javax.inject.Inject -import org.junit.Test import org.groundplatform.android.BaseHiltTest import org.groundplatform.domain.model.settings.MeasurementUnits +import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/app/src/test/java/org/groundplatform/android/usecases/survey/ListAvailableSurveysUseCaseTest.kt b/app/src/test/java/org/groundplatform/android/usecases/survey/ListAvailableSurveysUseCaseTest.kt index 154dac2715..5ac64dcdbe 100644 --- a/app/src/test/java/org/groundplatform/android/usecases/survey/ListAvailableSurveysUseCaseTest.kt +++ b/app/src/test/java/org/groundplatform/android/usecases/survey/ListAvailableSurveysUseCaseTest.kt @@ -19,7 +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.junit.Test import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flowOf @@ -31,6 +30,7 @@ import org.groundplatform.android.system.NetworkManager import org.groundplatform.android.system.NetworkStatus import org.groundplatform.domain.model.Survey import org.groundplatform.domain.model.toListItem +import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.kotlin.whenever diff --git a/app/src/test/java/org/groundplatform/android/util/RangeExtTest.kt b/app/src/test/java/org/groundplatform/android/util/RangeExtTest.kt index d7535c7a0f..0af3af000e 100644 --- a/app/src/test/java/org/groundplatform/android/util/RangeExtTest.kt +++ b/app/src/test/java/org/groundplatform/android/util/RangeExtTest.kt @@ -16,8 +16,8 @@ package org.groundplatform.android.util -import org.junit.Test import kotlin.test.assertEquals +import org.junit.Test import org.junit.runner.RunWith import org.mockito.junit.MockitoJUnitRunner diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cace52dcfa..ef5c34dc4c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -53,7 +53,7 @@ kotlinVersion = "2.4.10" kotlinxBom = "1.11.0" kspVersion = "2.3.11" kotlinxCollectionsImmutable = "0.5.1" -ktfmtVersion = "0.26.0" +ktfmtVersion = "0.27.0" lifecycleVersion = "2.11.0" markdownVersion = "0.7.3" materialVersion = "1.14.0"