diff --git a/targets/wearos/app/build.gradle.kts b/targets/wearos/app/build.gradle.kts index 052bdc9..601e922 100644 --- a/targets/wearos/app/build.gradle.kts +++ b/targets/wearos/app/build.gradle.kts @@ -50,7 +50,7 @@ android { dependencies { // Wear OS Compose implementation("androidx.wear.compose:compose-material:1.3.1") - implementation("androidx.wear.compose:compose-foundation:1.3.1") + implementation("androidx.wear.compose:compose-foundation:1.5.0") implementation("androidx.wear.compose:compose-navigation:1.3.1") // Compose diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/SwimBuddyWearActivity.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/SwimBuddyWearActivity.kt index e12ecfb..f0d793d 100644 --- a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/SwimBuddyWearActivity.kt +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/SwimBuddyWearActivity.kt @@ -20,6 +20,7 @@ class SwimBuddyWearActivity : ComponentActivity() { val completedWorkouts by viewModel.completedWorkouts.collectAsState() val selectedWorkout by viewModel.selectedWorkout.collectAsState() val isWorkoutActive by viewModel.isWorkoutActive.collectAsState() + val isPaused by viewModel.isPaused.collectAsState() val currentSetIndex by viewModel.currentSetIndex.collectAsState() val currentRep by viewModel.currentRep.collectAsState() val elapsedSeconds by viewModel.elapsedSeconds.collectAsState() @@ -29,12 +30,14 @@ class SwimBuddyWearActivity : ComponentActivity() { val isResting by viewModel.isResting.collectAsState() val restTimeRemaining by viewModel.restTimeRemaining.collectAsState() val workoutSummary by viewModel.workoutSummary.collectAsState() + val isWaterLockActive by viewModel.isWaterLockActive.collectAsState() SwimBuddyApp( savedWorkouts = savedWorkouts, completedWorkouts = completedWorkouts, selectedWorkout = selectedWorkout, isWorkoutActive = isWorkoutActive, + isPaused = isPaused, currentSetIndex = currentSetIndex, currentRep = currentRep, elapsedSeconds = elapsedSeconds, @@ -47,9 +50,13 @@ class SwimBuddyWearActivity : ComponentActivity() { totalDistanceSwum = viewModel.totalDistanceSwum(), currentSetDistanceSwum = viewModel.currentSetDistanceSwum(), currentSetTotalDistance = viewModel.currentSetTotalDistance(), + isWaterLockActive = isWaterLockActive, onSelectWorkout = { viewModel.selectWorkout(it) }, onStartWorkout = { viewModel.startWorkout() }, onCompleteLap = { viewModel.completeLap() }, + onPauseResume = { + if (isPaused) viewModel.resumeWorkout() else viewModel.pauseWorkout() + }, onEndWorkout = { viewModel.endWorkout() }, onBack = { viewModel.selectWorkout(null) }, onDeleteSaved = { viewModel.deleteSavedWorkout(it) }, diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/WaterLockHelper.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/WaterLockHelper.kt new file mode 100644 index 0000000..1adec6c --- /dev/null +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/WaterLockHelper.kt @@ -0,0 +1,19 @@ +package nl.guidoit.swimbuddy + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class WaterLockHelper { + + private val _isActive = MutableStateFlow(false) + val isActive: StateFlow = _isActive.asStateFlow() + + fun onWorkoutStarted() { + _isActive.value = true + } + + fun onWorkoutEnded() { + _isActive.value = false + } +} diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/WorkoutViewModel.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/WorkoutViewModel.kt index 5df208d..eb6a3eb 100644 --- a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/WorkoutViewModel.kt +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/WorkoutViewModel.kt @@ -22,6 +22,7 @@ class WorkoutViewModel(application: Application) : AndroidViewModel(application) private val healthManager = HealthServicesManager(application) private val storage = WorkoutStorage(application) + private val waterLockHelper = WaterLockHelper() private val gson = Gson() private val appContext = application @@ -67,8 +68,14 @@ class WorkoutViewModel(application: Application) : AndroidViewModel(application) private val _workoutSummary = MutableStateFlow(null) val workoutSummary: StateFlow = _workoutSummary.asStateFlow() + private val _isPaused = MutableStateFlow(false) + val isPaused: StateFlow = _isPaused.asStateFlow() + + val isWaterLockActive: StateFlow = waterLockHelper.isActive + private var startTime = 0L private var lapStartTime = 0L + private var pausedElapsedSeconds = 0f private var lapDetector: LapDetector? = null private var currentStrokeCount = 0L @@ -137,8 +144,11 @@ class WorkoutViewModel(application: Application) : AndroidViewModel(application) viewModelScope.launch { healthManager.startSwimmingWorkout(workout.poolLength) _isWorkoutActive.value = true + _isPaused.value = false + waterLockHelper.onWorkoutStarted() startTime = System.currentTimeMillis() lapStartTime = startTime + pausedElapsedSeconds = 0f _currentSetIndex.value = 0 _currentRep.value = 0 _completedLaps.value = emptyList() @@ -152,6 +162,27 @@ class WorkoutViewModel(application: Application) : AndroidViewModel(application) } } + fun pauseWorkout() { + if (!_isWorkoutActive.value || _isPaused.value) return + viewModelScope.launch { + healthManager.pauseWorkout() + _isPaused.value = true + pausedElapsedSeconds = _elapsedSeconds.value + HapticFeedback.play(appContext, HapticFeedback.Type.NOTIFICATION) + } + } + + fun resumeWorkout() { + if (!_isWorkoutActive.value || !_isPaused.value) return + viewModelScope.launch { + healthManager.resumeWorkout() + _isPaused.value = false + startTime = System.currentTimeMillis() - (pausedElapsedSeconds * 1000).toLong() + lapStartTime = System.currentTimeMillis() + HapticFeedback.play(appContext, HapticFeedback.Type.START) + } + } + private fun startLapDetection() { lapDetector = LapDetector(appContext) { viewModelScope.launch { @@ -167,7 +198,9 @@ class WorkoutViewModel(application: Application) : AndroidViewModel(application) private fun startElapsedTimeTracking() { viewModelScope.launch { while (_isWorkoutActive.value) { - _elapsedSeconds.value = (System.currentTimeMillis() - startTime) / 1000f + if (!_isPaused.value) { + _elapsedSeconds.value = (System.currentTimeMillis() - startTime) / 1000f + } kotlinx.coroutines.delay(1000) } } @@ -259,6 +292,8 @@ class WorkoutViewModel(application: Application) : AndroidViewModel(application) viewModelScope.launch { healthManager.endWorkout() _isWorkoutActive.value = false + _isPaused.value = false + waterLockHelper.onWorkoutEnded() _currentSetIndex.value = 0 _currentRep.value = 0 _elapsedSeconds.value = 0f diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/ActiveWorkoutScreen.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/ActiveWorkoutScreen.kt index ffde39e..82e9d8f 100644 --- a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/ActiveWorkoutScreen.kt +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/ActiveWorkoutScreen.kt @@ -151,14 +151,17 @@ fun ActiveWorkoutScreen( ) } - Text( - text = stringResource(R.string.end), - modifier = Modifier - .fillMaxWidth() - .padding(top = 4.dp), - color = Color.Red, - style = MaterialTheme.typography.caption3, - textAlign = androidx.compose.ui.text.style.TextAlign.Center - ) + Button( + onClick = onEndWorkout, + modifier = Modifier.fillMaxWidth(), + colors = ButtonDefaults.buttonColors( + backgroundColor = Color.Red + ) + ) { + Text( + text = stringResource(R.string.end_workout), + color = Color.White + ) + } } } diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/ControlsScreen.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/ControlsScreen.kt new file mode 100644 index 0000000..cdda1ac --- /dev/null +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/ControlsScreen.kt @@ -0,0 +1,79 @@ +package nl.guidoit.swimbuddy.presentation + +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.wear.compose.material.Button +import androidx.wear.compose.material.ButtonDefaults +import androidx.wear.compose.material.MaterialTheme +import androidx.wear.compose.material.Text +import nl.guidoit.swimbuddy.R + +@Composable +fun ControlsScreen( + isPaused: Boolean, + isWaterLockActive: Boolean, + onPauseResume: () -> Unit, + onEndWorkout: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceEvenly + ) { + if (isWaterLockActive) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Text( + text = "\uD83D\uDCA7", + fontSize = 12.sp + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = stringResource(R.string.water_lock), + style = MaterialTheme.typography.caption, + color = Color.Cyan + ) + } + } + + Spacer(modifier = Modifier.weight(1f)) + + Button( + onClick = onPauseResume, + modifier = Modifier.fillMaxWidth(), + colors = ButtonDefaults.buttonColors( + backgroundColor = Color(0xFFFF9800) + ) + ) { + Text( + text = if (isPaused) stringResource(R.string.resume) else stringResource(R.string.pause), + color = Color.Black + ) + } + + Button( + onClick = onEndWorkout, + modifier = Modifier.fillMaxWidth(), + colors = ButtonDefaults.buttonColors( + backgroundColor = Color.Red + ) + ) { + Text( + text = stringResource(R.string.end_workout), + color = Color.White + ) + } + + Spacer(modifier = Modifier.weight(1f)) + } +} diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/SwimBuddyApp.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/SwimBuddyApp.kt index c2a05c3..c4e1c64 100644 --- a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/SwimBuddyApp.kt +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/SwimBuddyApp.kt @@ -1,6 +1,11 @@ package nl.guidoit.swimbuddy.presentation +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.wear.compose.foundation.ExperimentalWearFoundationApi +import androidx.wear.compose.foundation.pager.HorizontalPager +import androidx.wear.compose.foundation.pager.rememberPagerState import nl.guidoit.swimbuddy.data.StoredWorkout import nl.guidoit.swimbuddy.data.WorkoutSummary @@ -10,6 +15,7 @@ fun SwimBuddyApp( completedWorkouts: List, selectedWorkout: StoredWorkout?, isWorkoutActive: Boolean, + isPaused: Boolean, currentSetIndex: Int, currentRep: Int, elapsedSeconds: Float, @@ -22,9 +28,11 @@ fun SwimBuddyApp( totalDistanceSwum: Int, currentSetDistanceSwum: Int, currentSetTotalDistance: Int, + isWaterLockActive: Boolean, onSelectWorkout: (StoredWorkout) -> Unit, onStartWorkout: () -> Unit, onCompleteLap: () -> Unit, + onPauseResume: () -> Unit, onEndWorkout: () -> Unit, onBack: () -> Unit, onDeleteSaved: (StoredWorkout) -> Unit, @@ -38,16 +46,8 @@ fun SwimBuddyApp( onDismiss = onDismissSummary ) } - isWorkoutActive && isResting -> { - RestScreen( - restTimeRemaining = restTimeRemaining, - totalDistanceSwum = totalDistanceSwum, - calories = calories, - nextSet = selectedWorkout?.sets?.getOrNull(currentSetIndex) - ) - } isWorkoutActive -> { - ActiveWorkoutScreen( + ActiveWorkoutPager( workout = selectedWorkout, currentSetIndex = currentSetIndex, currentRep = currentRep, @@ -55,10 +55,15 @@ fun SwimBuddyApp( heartRate = heartRate, calories = calories, lapDetected = lapDetected, + isResting = isResting, + restTimeRemaining = restTimeRemaining, totalDistanceSwum = totalDistanceSwum, currentSetDistanceSwum = currentSetDistanceSwum, currentSetTotalDistance = currentSetTotalDistance, + isPaused = isPaused, + isWaterLockActive = isWaterLockActive, onCompleteLap = onCompleteLap, + onPauseResume = onPauseResume, onEndWorkout = onEndWorkout ) } @@ -80,3 +85,76 @@ fun SwimBuddyApp( } } } + +@OptIn(ExperimentalWearFoundationApi::class) +@Composable +private fun ActiveWorkoutPager( + workout: StoredWorkout?, + currentSetIndex: Int, + currentRep: Int, + elapsedSeconds: Float, + heartRate: Int, + calories: Float, + lapDetected: Boolean, + isResting: Boolean, + restTimeRemaining: Float, + totalDistanceSwum: Int, + currentSetDistanceSwum: Int, + currentSetTotalDistance: Int, + isPaused: Boolean, + isWaterLockActive: Boolean, + onCompleteLap: () -> Unit, + onPauseResume: () -> Unit, + onEndWorkout: () -> Unit +) { + val pagerState = rememberPagerState(pageCount = { 3 }) + + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxSize() + ) { page -> + when (page) { + 0 -> { + if (isResting) { + RestScreen( + restTimeRemaining = restTimeRemaining, + totalDistanceSwum = totalDistanceSwum, + calories = calories, + nextSet = workout?.sets?.getOrNull(currentSetIndex) + ) + } else { + ActiveWorkoutScreen( + workout = workout, + currentSetIndex = currentSetIndex, + currentRep = currentRep, + elapsedSeconds = elapsedSeconds, + heartRate = heartRate, + calories = calories, + lapDetected = lapDetected, + totalDistanceSwum = totalDistanceSwum, + currentSetDistanceSwum = currentSetDistanceSwum, + currentSetTotalDistance = currentSetTotalDistance, + onCompleteLap = onCompleteLap, + onEndWorkout = onEndWorkout + ) + } + } + 1 -> { + WorkoutOverviewScreen( + workout = workout, + currentSetIndex = currentSetIndex, + isResting = isResting, + restTimeRemaining = restTimeRemaining + ) + } + 2 -> { + ControlsScreen( + isPaused = isPaused, + isWaterLockActive = isWaterLockActive, + onPauseResume = onPauseResume, + onEndWorkout = onEndWorkout + ) + } + } + } +} diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/WorkoutDetailScreen.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/WorkoutDetailScreen.kt index 8635343..8306007 100644 --- a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/WorkoutDetailScreen.kt +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/WorkoutDetailScreen.kt @@ -7,6 +7,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.wear.compose.material.Button import androidx.wear.compose.material.ButtonDefaults import androidx.wear.compose.material.MaterialTheme @@ -55,19 +56,38 @@ fun WorkoutDetailScreen( } items(workout.sets.size) { index -> val set = workout.sets[index] - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text( - text = "${index + 1}. ${set.stroke}", - style = MaterialTheme.typography.body1 - ) - Text( - text = "${set.repCount}x${set.distancePerRep}m", - style = MaterialTheme.typography.caption3, - color = MaterialTheme.colors.onSecondary.copy(alpha = 0.7f) - ) + Column { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "${index + 1}. ${set.stroke}", + style = MaterialTheme.typography.body1 + ) + Text( + text = "${set.repCount}x${set.distancePerRep}m", + style = MaterialTheme.typography.caption3, + color = MaterialTheme.colors.onSecondary.copy(alpha = 0.7f) + ) + } + if (set.restType != "none" && set.restDuration > 0) { + Row( + modifier = Modifier.padding(start = 14.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "\u23F0", + fontSize = 10.sp + ) + Spacer(modifier = Modifier.width(2.dp)) + Text( + text = stringResource(R.string.rest_duration, set.restDuration.toInt()), + style = MaterialTheme.typography.caption2, + color = Color(0xFFFF9800) + ) + } + } } } item { diff --git a/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/WorkoutOverviewScreen.kt b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/WorkoutOverviewScreen.kt new file mode 100644 index 0000000..c45e60f --- /dev/null +++ b/targets/wearos/app/src/main/java/nl/guidoit/swimbuddy/presentation/WorkoutOverviewScreen.kt @@ -0,0 +1,108 @@ +package nl.guidoit.swimbuddy.presentation + +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.wear.compose.material.ListColumn +import androidx.wear.compose.material.MaterialTheme +import androidx.wear.compose.material.Text +import nl.guidoit.swimbuddy.R +import nl.guidoit.swimbuddy.data.StoredWorkout + +@Composable +fun WorkoutOverviewScreen( + workout: StoredWorkout?, + currentSetIndex: Int, + isResting: Boolean, + restTimeRemaining: Float +) { + if (workout == null) return + + val restMins = (restTimeRemaining / 60).toInt() + val restSecs = (restTimeRemaining % 60).toInt() + + ListColumn( + modifier = Modifier.padding(horizontal = 16.dp) + ) { + if (isResting) { + item { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "\u23F8", + fontSize = 12.sp + ) + Spacer(modifier = Modifier.width(4.dp)) + Text( + text = stringResource(R.string.rest) + " " + String.format("%d:%02d", restMins, restSecs), + style = MaterialTheme.typography.caption, + color = Color(0xFFFF9800) + ) + } + } + } + + items(workout.sets.size) { index -> + val set = workout.sets[index] + val statusColor = when { + index < currentSetIndex -> Color.Green + index == currentSetIndex -> Color.Cyan + else -> Color.Gray.copy(alpha = 0.4f) + } + val textColor = if (index <= currentSetIndex) { + MaterialTheme.colors.onPrimary + } else { + MaterialTheme.colors.onSecondary.copy(alpha = 0.7f) + } + + Column { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Canvas(modifier = Modifier.size(8.dp)) { + drawCircle(color = statusColor) + } + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = "${index + 1}. ${set.stroke}", + style = MaterialTheme.typography.caption, + color = textColor, + modifier = Modifier.weight(1f) + ) + Text( + text = "${set.repCount}x${set.distancePerRep}m", + style = MaterialTheme.typography.caption2, + color = MaterialTheme.colors.onSecondary.copy(alpha = 0.7f) + ) + } + if (set.restType != "none" && set.restDuration > 0) { + Row( + modifier = Modifier.padding(start = 22.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "\u23F0", + fontSize = 10.sp + ) + Spacer(modifier = Modifier.width(2.dp)) + Text( + text = stringResource(R.string.rest_duration, set.restDuration.toInt()), + style = MaterialTheme.typography.caption2, + color = Color(0xFFFF9800) + ) + } + } + } + } + } +} diff --git a/targets/wearos/app/src/main/res/values-da/strings.xml b/targets/wearos/app/src/main/res/values-da/strings.xml index 61bf979..5a0655f 100644 --- a/targets/wearos/app/src/main/res/values-da/strings.xml +++ b/targets/wearos/app/src/main/res/values-da/strings.xml @@ -27,4 +27,10 @@ Omgange Tryk for at lukke OK + Water Lock + Pause + Genoptag + Afslut træning + Oversigt + %ds pause diff --git a/targets/wearos/app/src/main/res/values-de/strings.xml b/targets/wearos/app/src/main/res/values-de/strings.xml index 388e8ba..5c155dc 100644 --- a/targets/wearos/app/src/main/res/values-de/strings.xml +++ b/targets/wearos/app/src/main/res/values-de/strings.xml @@ -27,4 +27,10 @@ Runden Tippen zum Schließen OK + Water Lock + Pause + Fortsetzen + Training beenden + Übersicht + %ds Pause diff --git a/targets/wearos/app/src/main/res/values-es/strings.xml b/targets/wearos/app/src/main/res/values-es/strings.xml index 6f192d2..56df533 100644 --- a/targets/wearos/app/src/main/res/values-es/strings.xml +++ b/targets/wearos/app/src/main/res/values-es/strings.xml @@ -27,4 +27,10 @@ Vueltas Toca para cerrar OK + Water Lock + Pausa + Reanudar + Finalizar entrenamiento + Resumen + %ds descanso diff --git a/targets/wearos/app/src/main/res/values-fr/strings.xml b/targets/wearos/app/src/main/res/values-fr/strings.xml index 20ff109..00e1197 100644 --- a/targets/wearos/app/src/main/res/values-fr/strings.xml +++ b/targets/wearos/app/src/main/res/values-fr/strings.xml @@ -27,4 +27,10 @@ Tours Appuyez pour fermer OK + Water Lock + Pause + Reprendre + Terminer l\'entraînement + Aperçu + %ds repos diff --git a/targets/wearos/app/src/main/res/values-it/strings.xml b/targets/wearos/app/src/main/res/values-it/strings.xml index f594ffe..bde64b9 100644 --- a/targets/wearos/app/src/main/res/values-it/strings.xml +++ b/targets/wearos/app/src/main/res/values-it/strings.xml @@ -27,4 +27,10 @@ Giri Tocca per chiudere OK + Water Lock + Pausa + Riprendi + Termina allenamento + Panoramica + %ds pausa diff --git a/targets/wearos/app/src/main/res/values-nl/strings.xml b/targets/wearos/app/src/main/res/values-nl/strings.xml index f9bfc15..7353d92 100644 --- a/targets/wearos/app/src/main/res/values-nl/strings.xml +++ b/targets/wearos/app/src/main/res/values-nl/strings.xml @@ -27,4 +27,10 @@ Rondes Tik om te sluiten OK + Water Lock + Pauze + Hervat + Training beëindigen + Overzicht + %ds rust diff --git a/targets/wearos/app/src/main/res/values-pl/strings.xml b/targets/wearos/app/src/main/res/values-pl/strings.xml index aaf3ba7..a9bc2b8 100644 --- a/targets/wearos/app/src/main/res/values-pl/strings.xml +++ b/targets/wearos/app/src/main/res/values-pl/strings.xml @@ -27,4 +27,10 @@ Okrążenia Stuknij aby zamknąć OK + Water Lock + Pauza + Wznów + Zakończ trening + Przegląd + %ds przerwy diff --git a/targets/wearos/app/src/main/res/values-pt/strings.xml b/targets/wearos/app/src/main/res/values-pt/strings.xml index aeb6990..f818374 100644 --- a/targets/wearos/app/src/main/res/values-pt/strings.xml +++ b/targets/wearos/app/src/main/res/values-pt/strings.xml @@ -27,4 +27,10 @@ Voltas Toque para fechar OK + Water Lock + Pausar + Retomar + Terminar treino + Resumo + %ds descanso diff --git a/targets/wearos/app/src/main/res/values/strings.xml b/targets/wearos/app/src/main/res/values/strings.xml index 9e27fc9..2145247 100644 --- a/targets/wearos/app/src/main/res/values/strings.xml +++ b/targets/wearos/app/src/main/res/values/strings.xml @@ -27,4 +27,10 @@ Laps Tap to dismiss OK + Water Lock + Pause + Resume + End Workout + Overview + %ds rest