Skip to content

Commit 093b0f7

Browse files
committed
Merge branch 'fixes/touchUps' into develop
2 parents 8a1d93f + f13a12e commit 093b0f7

17 files changed

Lines changed: 432 additions & 135 deletions

File tree

app/src/main/java/com/appnotresponding/rumbo/models/logIn.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,17 +181,17 @@ class LoginViewModel : ViewModel() {
181181
}
182182

183183
private fun firebaseSignIn(email: String, password: String) {
184-
Firebase.messaging.token.addOnSuccessListener { token ->
185-
fcmToken = token
186-
FirebaseDatabase.getInstance().getReference("tokens/" + auth.currentUser!!.uid)
187-
.setValue(fcmToken).addOnSuccessListener {
188-
Log.i("FirebaseApp", "Token guardado correctamente")
189-
}.addOnFailureListener { e ->
190-
Log.e("FirebaseApp", "Error guardando token: ${e.message}")
191-
}
192-
}
193184
_loginState.update { it.copy(authResult = AuthResult.Loading) }
194185
auth.signInWithEmailAndPassword(email, password).addOnSuccessListener {
186+
Firebase.messaging.token.addOnSuccessListener { token ->
187+
fcmToken = token
188+
FirebaseDatabase.getInstance().getReference("tokens/" + auth.currentUser!!.uid)
189+
.setValue(fcmToken).addOnSuccessListener {
190+
Log.i("FirebaseApp", "Token guardado correctamente")
191+
}.addOnFailureListener { e ->
192+
Log.e("FirebaseApp", "Error guardando token: ${e.message}")
193+
}
194+
}
195195
_loginState.update { it.copy(authResult = AuthResult.Success) }
196196
}.addOnFailureListener { e ->
197197
clearCredentials()

app/src/main/java/com/appnotresponding/rumbo/models/place.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package com.appnotresponding.rumbo.models
22

33
data class Place(
4-
val id: String,
5-
val name: String,
6-
val address: String,
7-
val description: String?,
8-
val openHours: List<String>?,
9-
val price: String?,
10-
val latitude: Double,
11-
val longitude: Double,
12-
val rating: Double?,
13-
val reviews: List<Review>,
14-
val imageUrl: String?
4+
val id: String = "",
5+
val name: String = "",
6+
val address: String = "",
7+
val description: String? = null,
8+
val openHours: List<String>? = null,
9+
val price: String? = null,
10+
val latitude: Double = 0.0,
11+
val longitude: Double = 0.0,
12+
val rating: Double? = null,
13+
val reviews: List<Review> = emptyList(),
14+
val imageUrl: String? = null
1515
)
1616

1717
val samplePlace = Place(

app/src/main/java/com/appnotresponding/rumbo/ui/components/molecules/itinerary/ItineraryItemCard.kt

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.appnotresponding.rumbo.ui.components.molecules.itinerary
22

3+
import androidx.compose.foundation.BorderStroke
34
import androidx.compose.foundation.Image
45
import androidx.compose.foundation.background
56
import androidx.compose.foundation.layout.Arrangement
@@ -10,6 +11,7 @@ import androidx.compose.foundation.layout.Spacer
1011
import androidx.compose.foundation.layout.aspectRatio
1112
import androidx.compose.foundation.layout.fillMaxSize
1213
import androidx.compose.foundation.layout.fillMaxWidth
14+
import androidx.compose.foundation.layout.height
1315
import androidx.compose.foundation.layout.padding
1416
import androidx.compose.foundation.layout.width
1517
import androidx.compose.material.icons.Icons
@@ -87,23 +89,26 @@ fun ItineraryItemCard(p: Place, placesViewModel: PlacesViewModel, controller: Na
8789
}
8890

8991
ElevatedCard(
90-
modifier = Modifier.fillMaxWidth(), colors = CardDefaults.elevatedCardColors(
92+
modifier = Modifier.fillMaxWidth(),
93+
colors = CardDefaults.elevatedCardColors(
9194
containerColor = if (isActiveRoute) {
9295
MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.3f)
9396
} else {
9497
MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.3f)
9598
}
9699
),
97-
98100
elevation = CardDefaults.elevatedCardElevation(
99101
defaultElevation = if (isActiveRoute) 4.dp else 2.dp
100-
), shape = MaterialTheme.shapes.medium
102+
),
103+
shape = MaterialTheme.shapes.medium
101104
) {
102-
Column {
105+
Column (
106+
modifier = Modifier
107+
.padding(12.dp),
108+
) {
103109
Row(
104110
modifier = Modifier
105111
.fillMaxWidth()
106-
.padding(12.dp)
107112
) {
108113
Box(
109114
modifier = Modifier
@@ -129,7 +134,9 @@ fun ItineraryItemCard(p: Place, placesViewModel: PlacesViewModel, controller: Na
129134
}
130135
Spacer(modifier = Modifier.width(12.dp))
131136
Column(
132-
modifier = Modifier.weight(6f), verticalArrangement = Arrangement.spacedBy(8.dp)
137+
modifier = Modifier
138+
.weight(6f),
139+
verticalArrangement = Arrangement.spacedBy(8.dp)
133140
) {
134141
Row(
135142
verticalAlignment = Alignment.CenterVertically,
@@ -163,40 +170,40 @@ fun ItineraryItemCard(p: Place, placesViewModel: PlacesViewModel, controller: Na
163170
style = MaterialTheme.typography.bodySmall,
164171
color = MaterialTheme.colorScheme.onBackground
165172
)
166-
Row(
167-
modifier = Modifier.fillMaxWidth(),
168-
horizontalArrangement = Arrangement.spacedBy(8.dp),
169-
verticalAlignment = Alignment.CenterVertically
170-
) {}
171173
}
172174
}
173-
RumboButton(
174-
modifier = Modifier.weight(1f).fillMaxWidth()
175-
.padding(horizontal = 12.dp, vertical = 8.dp),
176-
text = if (isActiveRoute) "Ver Ruta Activa" else "Iniciar Desplazamiento",
177-
onClick = {
178-
if (isActiveRoute) {
179-
controller.navigate(AppScreens.Map.name)
180-
} else if (selectedPlace != null) {
181-
showReplaceRouteDialog = true
182-
} else {
183-
placesViewModel.selectForNavigation(p)
184-
controller.navigate(AppScreens.Map.name)
185-
}
186-
},
187-
style = if (isActiveRoute) RumboButtonStyle.Primary else RumboButtonStyle.Secondary,
188-
icon = painterResource(R.drawable.ic_map)
189-
)
190-
IconButton(onClick = { placesViewModel.removeFromItinerary(p) }) {
191-
Icon(
192-
imageVector = Icons.Default.Delete,
193-
contentDescription = "Eliminar del Itinerario",
194-
tint = MaterialTheme.colorScheme.error
175+
Spacer(modifier = Modifier.height(8.dp))
176+
Row(
177+
modifier = Modifier.fillMaxWidth(),
178+
horizontalArrangement = Arrangement.spacedBy(8.dp),
179+
verticalAlignment = Alignment.CenterVertically
180+
) {
181+
RumboButton(
182+
modifier = Modifier.weight(1f),
183+
text = if (isActiveRoute) "Ver Ruta Activa" else "Iniciar Desplazamiento",
184+
onClick = {
185+
if (isActiveRoute) {
186+
controller.navigate(AppScreens.Map.name)
187+
} else if (selectedPlace != null) {
188+
showReplaceRouteDialog = true
189+
} else {
190+
placesViewModel.selectForNavigation(p)
191+
controller.navigate(AppScreens.Map.name)
192+
}
193+
},
194+
style = if (isActiveRoute) RumboButtonStyle.Primary else RumboButtonStyle.Secondary,
195+
icon = painterResource(R.drawable.ic_map)
195196
)
197+
IconButton(onClick = { placesViewModel.removeFromItinerary(p) }) {
198+
Icon(
199+
painter = painterResource(R.drawable.ic_destroy),
200+
contentDescription = "Eliminar del Itinerario",
201+
tint = MaterialTheme.colorScheme.error
202+
)
203+
}
196204
}
197205
}
198206
}
199-
200207
}
201208

202209
/**

app/src/main/java/com/appnotresponding/rumbo/ui/components/molecules/map/MapFloatingActions.kt

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
package com.appnotresponding.rumbo.ui.components.molecules.map
22

3+
import androidx.compose.animation.AnimatedVisibility
4+
import androidx.compose.animation.fadeIn
5+
import androidx.compose.animation.fadeOut
6+
import androidx.compose.animation.slideInVertically
7+
import androidx.compose.animation.slideOutVertically
38
import androidx.compose.foundation.background
49
import androidx.compose.foundation.layout.Arrangement
510
import androidx.compose.foundation.layout.Box
611
import androidx.compose.foundation.layout.Column
712
import androidx.compose.foundation.layout.aspectRatio
13+
import androidx.compose.foundation.layout.fillMaxWidth
814
import androidx.compose.foundation.layout.padding
915
import androidx.compose.foundation.layout.size
16+
import androidx.compose.foundation.layout.width
1017
import androidx.compose.foundation.shape.CircleShape
1118
import androidx.compose.material3.Icon
1219
import androidx.compose.material3.IconButton
1320
import androidx.compose.material3.MaterialTheme
1421
import androidx.compose.runtime.Composable
22+
import androidx.compose.runtime.getValue
23+
import androidx.compose.runtime.mutableStateOf
24+
import androidx.compose.runtime.remember
25+
import androidx.compose.runtime.setValue
1526
import androidx.compose.ui.Alignment
1627
import androidx.compose.ui.Modifier
1728
import androidx.compose.ui.draw.clip
@@ -102,14 +113,89 @@ fun ToggleHeatmap(isHeatmapActive: Boolean = false, onClick: () -> Unit = {}) {
102113
) {
103114
IconButton(onClick = onClick) {
104115
Icon(
105-
painter = painterResource(R.drawable.ic_map), // Reusing map icon or any suitable icon
116+
modifier = Modifier.size(24.dp),
117+
painter = painterResource(R.drawable.ic_heat),
106118
contentDescription = "Toggle Heatmap",
107119
tint = iconTint,
108120
)
109121
}
110122
}
111123
}
112124

125+
@Composable
126+
fun ToggleUserRoute(isUserRouteActive: Boolean = false, onClick: () -> Unit = {}) {
127+
val bgColor = if (isUserRouteActive) MaterialTheme.colorScheme.tertiary else MaterialTheme.colorScheme.primary
128+
val iconTint = if (isUserRouteActive) MaterialTheme.colorScheme.onTertiary else MaterialTheme.colorScheme.onPrimary
129+
val iconRes = if (isUserRouteActive) R.drawable.ic_eye_open else R.drawable.ic_eye_crossed
130+
Box(
131+
modifier = Modifier
132+
.aspectRatio(1f)
133+
.clip(CircleShape)
134+
.background(bgColor), contentAlignment = Alignment.Center
135+
) {
136+
IconButton(onClick = onClick) {
137+
Icon(
138+
modifier = Modifier.size(24.dp),
139+
painter = painterResource(iconRes),
140+
contentDescription = "Toggle User Route",
141+
tint = iconTint,
142+
)
143+
}
144+
}
145+
}
146+
147+
@Composable
148+
fun ExpandableFAB(
149+
isHeatmapActive: Boolean,
150+
onHeatmapClick: () -> Unit,
151+
onDropNoteClick: () -> Unit,
152+
onLocateMeClick: () -> Unit,
153+
isUserRouteActive: Boolean,
154+
onUserRouteClick: () -> Unit,
155+
modifier: Modifier = Modifier
156+
) {
157+
var isExpanded by remember { mutableStateOf(false) }
158+
159+
Column(
160+
modifier = modifier.fillMaxWidth(),
161+
verticalArrangement = Arrangement.spacedBy(16.dp, Alignment.Bottom),
162+
horizontalAlignment = Alignment.CenterHorizontally
163+
) {
164+
AnimatedVisibility(
165+
visible = isExpanded,
166+
enter = fadeIn() + slideInVertically(initialOffsetY = { it / 2 }),
167+
exit = fadeOut() + slideOutVertically(targetOffsetY = { it / 2 })
168+
) {
169+
Column(
170+
verticalArrangement = Arrangement.spacedBy(16.dp),
171+
horizontalAlignment = Alignment.CenterHorizontally
172+
) {
173+
ToggleHeatmap(isHeatmapActive = isHeatmapActive, onClick = onHeatmapClick)
174+
WriteDropNote(onClick = onDropNoteClick)
175+
LocateMe(onClick = onLocateMeClick)
176+
ToggleUserRoute(isUserRouteActive = isUserRouteActive, onClick = onUserRouteClick)
177+
}
178+
}
179+
180+
Box(
181+
modifier = Modifier
182+
.aspectRatio(1f)
183+
.clip(CircleShape)
184+
.background(MaterialTheme.colorScheme.primary),
185+
contentAlignment = Alignment.Center
186+
) {
187+
IconButton(onClick = { isExpanded = !isExpanded }) {
188+
Icon(
189+
modifier = Modifier.size(24.dp),
190+
painter = painterResource(if (isExpanded) R.drawable.ic_minus else R.drawable.ic_plus),
191+
contentDescription = "Expand / Collapse Menu",
192+
tint = MaterialTheme.colorScheme.onPrimary
193+
)
194+
}
195+
}
196+
}
197+
}
198+
113199
@Preview(showBackground = true, name = "MapFloatingActions - Light")
114200
@Composable
115201
private fun MapFloatingActionsLightPreview() {

app/src/main/java/com/appnotresponding/rumbo/ui/components/organisms/map/ViewDropnote.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,12 @@ import androidx.compose.foundation.clickable
4545
import androidx.compose.foundation.layout.fillMaxSize
4646
import androidx.compose.foundation.background
4747
import androidx.compose.foundation.layout.Box
48+
import androidx.compose.foundation.shape.RoundedCornerShape
4849
import androidx.compose.ui.graphics.Color
50+
import androidx.compose.ui.res.painterResource
4951
import androidx.compose.ui.unit.sp
5052
import androidx.compose.ui.window.Dialog
53+
import com.appnotresponding.rumbo.R
5154

5255
fun formatTimestamp(timestamp: Long): String {
5356
val date = Date(timestamp)
@@ -133,7 +136,7 @@ fun ViewDropNote(
133136
modifier = Modifier.size(36.dp)
134137
) {
135138
Icon(
136-
imageVector = Icons.Rounded.Delete,
139+
painter = painterResource(R.drawable.ic_destroy),
137140
contentDescription = "Eliminar DropNote",
138141
tint = MaterialTheme.colorScheme.error
139142
)
@@ -206,7 +209,7 @@ fun ViewDropNote(
206209
model = imageUrl,
207210
contentDescription = "Imagen ampliada",
208211
modifier = Modifier
209-
.fillMaxWidth()
212+
.fillMaxWidth().clip(RoundedCornerShape(12.dp))
210213
.clickable { isImageExpanded = false },
211214
contentScale = ContentScale.Fit
212215
)

app/src/main/java/com/appnotresponding/rumbo/ui/screens/chat/ChatThreadScreen.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,21 @@ fun ChatThreadScreen(
7575
var unreadDividerTimestamp by remember(chatId) { mutableStateOf<Long?>(null) }
7676

7777
val mediaManager = rememberMediaHardwareManager()
78+
79+
LaunchedEffect(mediaManager.imageUri) {
80+
mediaManager.imageUri?.let { uri ->
81+
chatThreadViewModel.sendMediaMessage(
82+
chatId,
83+
currentUser.name,
84+
uri,
85+
isGroup,
86+
"image"
87+
)
88+
89+
mediaManager.clearImage()
90+
}
91+
}
92+
7893
var mediaRecorder by remember { mutableStateOf<MediaRecorder?>(null) }
7994
var audioFile by remember { mutableStateOf<File?>(null) }
8095
var isRecording by remember { mutableStateOf(false) }

app/src/main/java/com/appnotresponding/rumbo/ui/templates/AuthTemplate.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.compose.foundation.background
44
import androidx.compose.foundation.layout.Box
55
import androidx.compose.foundation.layout.BoxScope
66
import androidx.compose.foundation.layout.fillMaxSize
7+
import androidx.compose.foundation.layout.imePadding
78
import androidx.compose.foundation.layout.padding
89
import androidx.compose.material3.MaterialTheme
910
import androidx.compose.runtime.Composable
@@ -35,7 +36,7 @@ fun AuthTemplate(
3536

3637
Box(
3738
modifier = modifier
38-
.fillMaxSize()
39+
.fillMaxSize().imePadding()
3940
.background(MaterialTheme.colorScheme.background)
4041
.background(brush = backgroundBrush)
4142
.padding(24.dp), contentAlignment = Alignment.Center

0 commit comments

Comments
 (0)