diff --git a/app/src/main/java/pl/firmatpp/kierowca/data/model/DriverModels.kt b/app/src/main/java/pl/firmatpp/kierowca/data/model/DriverModels.kt index 988c17f..99a1c5d 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/data/model/DriverModels.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/data/model/DriverModels.kt @@ -47,6 +47,7 @@ data class BootstrapResponse( val routes: RoutesBucketDto, val driverAppSettings: DriverAppSettingsDto?, val dispatchSheetReminder: DispatchSheetReminderDto? = null, + val tachographReminder: TachographReminderDto? = null, val notificationPreferences: NotificationPreferencesDto? = null, val realtime: RealtimeConfigDto? = null, val syncState: SyncStateResponse? = null, @@ -80,6 +81,7 @@ data class DriverAppSettingsDto( val dispatchSheetRemindersEnabled: Boolean? = null, val dispatchSheetOnFridays: Boolean? = null, val dispatchSheetOnLastWorkingDay: Boolean? = null, + val tachographRemindersEnabled: Boolean? = null, val leaveRequests: LeaveRequestsConfigDto? = null, ) @@ -99,6 +101,13 @@ data class DispatchSheetReminderDto( val canUpload: Boolean = false, ) +data class TachographReminderDto( + val enabled: Boolean = false, + val visible: Boolean = false, + val title: String? = null, + val message: String? = null, +) + data class DispatchSheetPhotoDto( val id: String, val driverId: String, diff --git a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverApp.kt b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverApp.kt index 5086321..2eb886c 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverApp.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverApp.kt @@ -74,6 +74,7 @@ import androidx.compose.material.icons.outlined.Person import androidx.compose.material.icons.outlined.Phone import androidx.compose.material.icons.outlined.Refresh import androidx.compose.material.icons.outlined.SystemUpdate +import androidx.compose.material.icons.outlined.Speed import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.pullrefresh.PullRefreshIndicator import androidx.compose.material.pullrefresh.pullRefresh @@ -164,6 +165,7 @@ import pl.firmatpp.kierowca.data.model.DriverLeaveRequestDto import pl.firmatpp.kierowca.data.model.DriverRouteDto import pl.firmatpp.kierowca.data.model.NavigationPointDto import pl.firmatpp.kierowca.data.model.RoutePhotoDto +import pl.firmatpp.kierowca.data.model.TachographReminderDto import pl.firmatpp.kierowca.data.model.driverLifecycleStatus import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadEntity import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity @@ -1277,6 +1279,11 @@ private fun RoutesScreen( onDate = onDate, ) } + if (shouldShowTachographReminderCard(state.tachographReminder)) { + item { + TachographReminderCard(state.tachographReminder) + } + } if (shouldShowDispatchSheetReminderCard(state.dispatchSheetReminder)) { item { DispatchSheetReminderCard( @@ -2251,6 +2258,51 @@ private fun DispatchSheetReminderCard( } } +@Composable +private fun TachographReminderCard(reminder: TachographReminderDto?) { + if (!shouldShowTachographReminderCard(reminder)) return + + Card( + colors = CardDefaults.cardColors(containerColor = TppTheme.colors.warningContainer), + border = BorderStroke(1.dp, TppTheme.colors.warningOutline), + shape = MaterialTheme.shapes.medium, + modifier = Modifier.fillMaxWidth(), + ) { + Row( + Modifier.fillMaxWidth().padding(18.dp), + horizontalArrangement = Arrangement.spacedBy(14.dp), + verticalAlignment = Alignment.Top, + ) { + Box( + modifier = Modifier + .size(44.dp) + .background(Color.White.copy(alpha = 0.72f), RoundedCornerShape(12.dp)), + contentAlignment = Alignment.Center, + ) { + Icon( + Icons.Outlined.Speed, + contentDescription = null, + tint = Color(0xFF7A5200), + modifier = Modifier.size(27.dp), + ) + } + Column(Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(5.dp)) { + Text( + reminder?.title.orEmpty(), + color = TppTheme.colors.ink, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold, + ) + Text( + reminder?.message.orEmpty(), + color = Color(0xFF5F4200), + style = MaterialTheme.typography.bodyMedium, + ) + } + } + } +} + @Composable private fun OperationalQueueBanner(state: DriverUiState, onPhotoQueue: () -> Unit) { val count = state.pendingOperationalItems diff --git a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverUiRules.kt b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverUiRules.kt index 55ebcee..772037f 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverUiRules.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverUiRules.kt @@ -14,6 +14,7 @@ import kotlin.math.abs import pl.firmatpp.kierowca.data.model.DriverRouteDto import pl.firmatpp.kierowca.data.model.DispatchSheetReminderDto import pl.firmatpp.kierowca.data.model.RoutePhotoDto +import pl.firmatpp.kierowca.data.model.TachographReminderDto import pl.firmatpp.kierowca.data.model.driverLifecycleStatus import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity import pl.firmatpp.kierowca.data.upload.PhotoUploadStatus @@ -671,6 +672,12 @@ fun canLaunchCameraWithLocationPolicy(requirePreciseLocation: Boolean, hasFineLo fun shouldShowDispatchSheetReminderCard(reminder: DispatchSheetReminderDto?): Boolean = reminder?.dueToday == true && reminder.status in setOf("missing", "uploaded") +fun shouldShowTachographReminderCard(reminder: TachographReminderDto?): Boolean = + reminder?.enabled == true && + reminder.visible && + !reminder.title.isNullOrBlank() && + !reminder.message.isNullOrBlank() + fun dispatchSheetPrimaryActionLabel(reminder: DispatchSheetReminderDto?, hasQueuedUpload: Boolean): String = when { hasQueuedUpload -> "Wysyłam zdjęcie..." diff --git a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt index eeb9598..2b3fdd0 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt @@ -33,6 +33,7 @@ import pl.firmatpp.kierowca.data.model.DriverLeaveCalendarEntryDto import pl.firmatpp.kierowca.data.model.DriverLeaveRequestDto import pl.firmatpp.kierowca.data.model.DriverRouteDto import pl.firmatpp.kierowca.data.model.RoutePhotoDto +import pl.firmatpp.kierowca.data.model.TachographReminderDto import pl.firmatpp.kierowca.data.model.driverLifecycleStatus import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadEntity import pl.firmatpp.kierowca.data.upload.DispatchSheetUploadOutbox @@ -102,6 +103,7 @@ data class DriverUiState( val photoUploads: List = emptyList(), val queuedPhotoUploads: List = emptyList(), val dispatchSheetReminder: DispatchSheetReminderDto? = null, + val tachographReminder: TachographReminderDto? = null, val appUpdate: AppUpdateDto? = null, val dispatchSheetUploads: List = emptyList(), val leaveRequestsConfig: LeaveRequestsConfig? = null, @@ -509,6 +511,7 @@ class DriverViewModel(application: Application) : AndroidViewModel(application) driver = response.session.driver, routes = response.routes.today, dispatchSheetReminder = response.dispatchSheetReminder, + tachographReminder = response.tachographReminder, appUpdate = response.appUpdate ?: it.appUpdate, selectedDate = settings?.selectedDate ?: date ?: it.selectedDate, minRouteDate = settings?.minDate ?: it.minRouteDate, diff --git a/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiRulesTest.kt b/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiRulesTest.kt index bb7cfe3..ca2ffc1 100644 --- a/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiRulesTest.kt +++ b/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiRulesTest.kt @@ -8,6 +8,7 @@ import org.junit.Test import pl.firmatpp.kierowca.data.model.DriverRouteDto import pl.firmatpp.kierowca.data.model.DispatchSheetReminderDto import pl.firmatpp.kierowca.data.model.RoutePhotoDto +import pl.firmatpp.kierowca.data.model.TachographReminderDto import pl.firmatpp.kierowca.data.upload.PhotoUploadEntity import pl.firmatpp.kierowca.data.upload.RouteActionEntity import pl.firmatpp.kierowca.data.upload.RouteActionStatus @@ -410,6 +411,41 @@ class DriverUiRulesTest { assertFalse(shouldShowDispatchSheetReminderCard(null)) } + @Test + fun showsTachographCardOnlyForCompleteReminderEnabledByBackend() { + assertTrue( + shouldShowTachographReminderCard( + TachographReminderDto( + enabled = true, + visible = true, + title = "Odczyt tachografu", + message = "Pamiętaj o odczycie.", + ), + ), + ) + assertFalse( + shouldShowTachographReminderCard( + TachographReminderDto( + enabled = false, + visible = true, + title = "Odczyt tachografu", + message = "Pamiętaj o odczycie.", + ), + ), + ) + assertFalse( + shouldShowTachographReminderCard( + TachographReminderDto( + enabled = true, + visible = false, + title = "Odczyt tachografu", + message = "Pamiętaj o odczycie.", + ), + ), + ) + assertFalse(shouldShowTachographReminderCard(null)) + } + @Test fun explainsOfflineStateWithoutCachedSync() { assertEquals(