diff --git a/android/app/src/main/java/com/guidecity/app/ui/map/MapScreen.kt b/android/app/src/main/java/com/guidecity/app/ui/map/MapScreen.kt
index 27e1f88..bb3c9ea 100644
--- a/android/app/src/main/java/com/guidecity/app/ui/map/MapScreen.kt
+++ b/android/app/src/main/java/com/guidecity/app/ui/map/MapScreen.kt
@@ -3,12 +3,14 @@ package com.guidecity.app.ui.map
import android.Manifest
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
+import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@@ -16,12 +18,15 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material.icons.filled.List
+import androidx.compose.material.icons.filled.Map
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ListItem
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
@@ -40,6 +45,12 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.guidecity.app.R
import com.guidecity.app.map.CityMapView
+import com.guidecity.app.theme.Mocha
+import com.guidecity.app.ui.guide.CardState
+import com.guidecity.app.ui.guide.PlaceCard
+
+/** Overlay text sits on top of the (now real, often light-colored) map tiles, so it needs a fixed dark color rather than the theme's default light-on-dark text. */
+private val MapOverlayTextColor = Mocha.Crust
@Composable
fun MapScreen(
@@ -53,6 +64,7 @@ fun MapScreen(
val resolvedLocation by viewModel.resolvedLocation.collectAsState()
val nearbyPlaces by viewModel.nearbyPlaces.collectAsState()
var query by remember { mutableStateOf("") }
+ var showList by remember { mutableStateOf(false) }
val permissionLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.RequestMultiplePermissions(),
@@ -69,6 +81,16 @@ fun MapScreen(
TopAppBar(
title = { Text(stringResource(R.string.app_name)) },
actions = {
+ if (uiState is MapUiState.ReadyToStart) {
+ IconButton(onClick = { showList = !showList }) {
+ Icon(
+ imageVector = if (showList) Icons.Filled.Map else Icons.Filled.List,
+ contentDescription = stringResource(
+ if (showList) R.string.map_show_map else R.string.map_show_list,
+ ),
+ )
+ }
+ }
IconButton(onClick = onOpenFavorites) {
Icon(Icons.Filled.Favorite, contentDescription = stringResource(R.string.favorites_title))
}
@@ -151,7 +173,7 @@ fun MapScreen(
CircularProgressIndicator()
if (state == MapUiState.CheckingNearby) {
Spacer(modifier = Modifier.height(12.dp))
- Text(stringResource(R.string.map_checking_nearby))
+ Text(stringResource(R.string.map_checking_nearby), color = MapOverlayTextColor)
}
}
}
@@ -164,11 +186,28 @@ fun MapScreen(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
- Text(stringResource(R.string.map_no_places_nearby))
+ Text(stringResource(R.string.map_no_places_nearby), color = MapOverlayTextColor)
}
}
is MapUiState.ReadyToStart -> {
+ if (showList) {
+ LazyColumn(
+ modifier = Modifier
+ .fillMaxSize()
+ .background(MaterialTheme.colorScheme.background),
+ contentPadding = PaddingValues(bottom = 140.dp),
+ ) {
+ items(nearbyPlaces, key = { it.id }) { place ->
+ PlaceCard(
+ place = place,
+ state = CardState.UPCOMING,
+ modifier = Modifier.padding(horizontal = 12.dp, vertical = 6.dp),
+ )
+ }
+ }
+ }
+
Column(
modifier = Modifier
.fillMaxSize()
@@ -178,6 +217,7 @@ fun MapScreen(
) {
Text(
text = stringResource(R.string.map_places_found, state.placesFound, state.radiusM),
+ color = MapOverlayTextColor,
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = onLocationResolved) {
diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml
index a5cbcb3..85052ba 100644
--- a/android/app/src/main/res/values-ru/strings.xml
+++ b/android/app/src/main/res/values-ru/strings.xml
@@ -19,6 +19,8 @@
Найдено мест поблизости: %1$d (в радиусе %2$d м)
Начать
В радиусе 10 км ничего не нашлось.
+ Показать список
+ Показать карту
Поблизости пока не найдено интересных мест.
Мест поблизости: %1$d
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 9fce130..e6a9176 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -19,6 +19,8 @@
Found %1$d place(s) nearby (within %2$d m)
Start
Nothing found within 10 km of here.
+ Show list
+ Show map
No places found nearby yet.
%1$d place(s) nearby