Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -122,45 +122,45 @@ fun DirectionsScreen(
val coroutineScope = rememberCoroutineScope()

// Auto-retry location request when permissions are granted
LaunchedEffect(hasLocationPermission, pendingLocationRequest) {
if (hasLocationPermission && pendingLocationRequest != null) {
val targetField = pendingLocationRequest!!
pendingLocationRequest = null // Clear the pending request

// Automatically fetch location for the target field
coroutineScope.launch {
val myLocationPlace = viewModel.getCurrentLocationAsPlace()
myLocationPlace?.let { place ->
// Update the appropriate place based on which field was focused
if (targetField == FieldFocusState.FROM) {
viewModel.updateFromPlace(place)
} else {
viewModel.updateToPlace(place)
}
// Clear focus state after selection
fieldFocusState = FieldFocusState.NONE
}
}
} else if (hasLocationPermission && appPreferences.continuousLocationTracking.value) {
coroutineScope.launch {
viewModel.initializeDeparture()
}
AutoRetryMyLocation(
hasLocationPermission = hasLocationPermission,
pendingLocationRequest = pendingLocationRequest,
coroutineScope = coroutineScope,
viewModel = viewModel,
appPreferences = appPreferences,
onCompletion = {
fieldFocusState = FieldFocusState.NONE
}
}

stringResource(string.change_start_location_to_my_location)
)

Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = dimensionResource(dimen.padding))
) {
if (!isAnyFieldFocused) {
if (isAnyFieldFocused) {
DirectionsScreenFocusedField(
viewModel = viewModel,
fieldFocusState = fieldFocusState,
onFieldFocusStateChange = {
fieldFocusState = it
if (fieldFocusState != FieldFocusState.NONE) {
onFullExpansionRequired()
}
},
savedPlaces = savedPlaces,
hasLocationPermission = hasLocationPermission,
onRequestLocationPermission = {
pendingLocationRequest = fieldFocusState
onRequestLocationPermission()
},
coroutineScope = coroutineScope
)
} else {
DirectionsScreenFullUI(
viewModel = viewModel,
onPeekHeightChange = onPeekHeightChange,
onBack = onBack,
onFullExpansionRequired = onFullExpansionRequired,
navController = navController,
onFieldFocusStateChange = { fieldFocusState = it },
fieldFocusState = fieldFocusState,
Expand All @@ -170,16 +170,40 @@ fun DirectionsScreen(
hasNotificationPermission = hasNotificationPermission,
onRequestNotificationPermission = onRequestNotificationPermission
)
} else {
DirectionsScreenFocusedField(
viewModel = viewModel,
fieldFocusState = fieldFocusState,
savedPlaces = savedPlaces,
hasLocationPermission = hasLocationPermission,
onRequestLocationPermission = onRequestLocationPermission,
pendingLocationRequest = pendingLocationRequest,
coroutineScope = coroutineScope
)
}
}
}

@Composable
private fun AutoRetryMyLocation(
hasLocationPermission: Boolean,
pendingLocationRequest: FieldFocusState?,
coroutineScope: CoroutineScope,
viewModel: DirectionsViewModel,
appPreferences: AppPreferenceRepository,
onCompletion: () -> Unit,
) {
LaunchedEffect(hasLocationPermission, pendingLocationRequest) {
if (hasLocationPermission && pendingLocationRequest != null) {
val targetField = pendingLocationRequest

// Automatically fetch location for the target field
coroutineScope.launch {
val myLocationPlace = viewModel.getCurrentLocationAsPlace()
myLocationPlace?.let { place ->
// Update the appropriate place based on which field was focused
if (targetField == FieldFocusState.FROM) {
viewModel.updateFromPlace(place)
} else {
viewModel.updateToPlace(place)
}
onCompletion()
}
}
} else if (hasLocationPermission && appPreferences.continuousLocationTracking.value) {
coroutineScope.launch {
viewModel.initializeDeparture()
}
}
}
}
Expand All @@ -189,7 +213,6 @@ private fun DirectionsScreenFullUI(
viewModel: DirectionsViewModel,
onPeekHeightChange: (Dp) -> Unit,
onBack: () -> Unit,
onFullExpansionRequired: () -> Job,
navController: NavController,
onFieldFocusStateChange: (FieldFocusState) -> Unit,
fieldFocusState: FieldFocusState,
Expand Down Expand Up @@ -324,7 +347,12 @@ private fun DirectionsRouteResults(
) {
val planState = viewModel.planState
if (viewModel.selectedRoutingMode == RoutingMode.PUBLIC_TRANSPORT) {
TransitRouteResults(planState = planState, navController = navController, viewModel = viewModel, appPreferences = appPreferences)
TransitRouteResults(
planState = planState,
navController = navController,
viewModel = viewModel,
appPreferences = appPreferences
)
} else {
NonTransitRouteResults(
routeState = routeState,
Expand Down Expand Up @@ -445,10 +473,10 @@ private fun NonTransitRouteResults(
private fun DirectionsScreenFocusedField(
viewModel: DirectionsViewModel,
fieldFocusState: FieldFocusState,
onFieldFocusStateChange: (FieldFocusState) -> Unit,
savedPlaces: List<Place>,
hasLocationPermission: Boolean,
onRequestLocationPermission: () -> Unit,
pendingLocationRequest: FieldFocusState?,
coroutineScope: CoroutineScope
) {
// Show only the focused field and search results when a field is focused
Expand All @@ -464,7 +492,11 @@ private fun DirectionsScreenFocusedField(
},
onTextChange = { viewModel.updateSearchQuery(it) },
onTextFieldFocusChange = { isFocused ->

if (isFocused) {
onFieldFocusStateChange(fieldFocusState)
} else {
onFieldFocusStateChange(FieldFocusState.NONE)
}
},
isFocused = true,
modifier = Modifier
Expand All @@ -479,19 +511,19 @@ private fun DirectionsScreenFocusedField(
savedPlaces = savedPlaces,
hasLocationPermission = hasLocationPermission,
onRequestLocationPermission = onRequestLocationPermission,
pendingLocationRequest = pendingLocationRequest,
coroutineScope = coroutineScope
coroutineScope = coroutineScope,
onFieldFocusStateChange = onFieldFocusStateChange,
)
}

@Composable
private fun FocusedFieldContent(
viewModel: DirectionsViewModel,
fieldFocusState: FieldFocusState,
onFieldFocusStateChange: (FieldFocusState) -> Unit,
savedPlaces: List<Place>,
hasLocationPermission: Boolean,
onRequestLocationPermission: () -> Unit,
pendingLocationRequest: FieldFocusState?,
coroutineScope: CoroutineScope
) {
when {
Expand All @@ -506,15 +538,16 @@ private fun FocusedFieldContent(
savedPlaces = savedPlaces,
hasLocationPermission = hasLocationPermission,
onRequestLocationPermission = onRequestLocationPermission,
pendingLocationRequest = pendingLocationRequest,
coroutineScope = coroutineScope
coroutineScope = coroutineScope,
onFieldFocusStateChange = onFieldFocusStateChange,
)
}

else -> {
SearchResultsContent(
viewModel = viewModel,
fieldFocusState = fieldFocusState
fieldFocusState = fieldFocusState,
onFieldFocusStateChange = onFieldFocusStateChange,
)
}
}
Expand All @@ -523,7 +556,7 @@ private fun FocusedFieldContent(
@Composable
private fun SearchingIndicator() {
Text(
text = "Searching...",
text = stringResource(string.searching),
modifier = Modifier
.fillMaxWidth()
.padding(dimensionResource(dimen.padding))
Expand All @@ -534,10 +567,10 @@ private fun SearchingIndicator() {
private fun QuickSuggestionsContent(
viewModel: DirectionsViewModel,
fieldFocusState: FieldFocusState,
onFieldFocusStateChange: (FieldFocusState) -> Unit,
savedPlaces: List<Place>,
hasLocationPermission: Boolean,
onRequestLocationPermission: () -> Unit,
pendingLocationRequest: FieldFocusState?,
coroutineScope: CoroutineScope
) {
QuickSuggestions(
Expand All @@ -546,11 +579,13 @@ private fun QuickSuggestionsContent(
fieldFocusState = fieldFocusState,
hasLocationPermission = hasLocationPermission,
onRequestLocationPermission = onRequestLocationPermission,
coroutineScope = coroutineScope
coroutineScope = coroutineScope,
onFieldFocusStateChange = onFieldFocusStateChange,
),
savedPlaces = savedPlaces,
onSavedPlaceSelected = { place ->
updatePlaceForField(viewModel, fieldFocusState, place)
onFieldFocusStateChange(FieldFocusState.NONE)
},
isGettingLocation = viewModel.isGettingLocation,
modifier = Modifier.fillMaxWidth()
Expand All @@ -560,13 +595,15 @@ private fun QuickSuggestionsContent(
@Composable
private fun SearchResultsContent(
viewModel: DirectionsViewModel,
onFieldFocusStateChange: (FieldFocusState) -> Unit,
fieldFocusState: FieldFocusState
) {
SearchResults(
viewModel = hiltViewModel(),
geocodeResults = deduplicateSearchResults(viewModel.geocodeResults.value),
onPlaceSelected = { place ->
updatePlaceForField(viewModel, fieldFocusState, place)
onFieldFocusStateChange(FieldFocusState.NONE)
},
modifier = Modifier.fillMaxWidth()
)
Expand All @@ -589,13 +626,15 @@ private fun handleMyLocationSelected(
fieldFocusState: FieldFocusState,
hasLocationPermission: Boolean,
onRequestLocationPermission: () -> Unit,
onFieldFocusStateChange: (FieldFocusState) -> Unit,
coroutineScope: CoroutineScope
): () -> Unit = {
if (hasLocationPermission) {
coroutineScope.launch {
val myLocationPlace = viewModel.getCurrentLocationAsPlace()
myLocationPlace?.let { place ->
updatePlaceForField(viewModel, fieldFocusState, place)
onFieldFocusStateChange(FieldFocusState.NONE)
}
}
} else {
Expand Down
1 change: 1 addition & 0 deletions cardinal-android/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -247,4 +247,5 @@
<string name="imperial">Imperial</string>
<string name="zoom_in">Zoom in</string>
<string name="zoom_out">Zoom out</string>
<string name="searching">Searching…</string>
</resources>
Loading