Skip to content

Commit caccd0a

Browse files
committed
feat: open departures / directions when clicking on widget
1 parent 716bf0a commit caccd0a

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ plugins {
44
alias(libs.plugins.kotlin.compose)
55
kotlin("plugin.serialization") version "2.1.21"
66
id("com.google.protobuf") version "0.9.5"
7+
id("kotlin-parcelize")
78
}
89

910
android {

app/src/main/java/net/youapps/transport/MainActivity.kt

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
66
import androidx.activity.enableEdgeToEdge
77
import androidx.activity.viewModels
8+
import androidx.compose.runtime.LaunchedEffect
89
import androidx.navigation.compose.NavHost
910
import androidx.navigation.compose.composable
1011
import androidx.navigation.compose.rememberNavController
@@ -20,6 +21,8 @@ import net.youapps.transport.screens.HomeScreen
2021
import net.youapps.transport.screens.SettingsScreen
2122
import net.youapps.transport.screens.TripDetailsScreen
2223
import net.youapps.transport.ui.theme.TransportYouTheme
24+
import androidx.compose.runtime.collectAsState
25+
import androidx.core.content.IntentCompat
2326

2427
class MainActivity : ComponentActivity() {
2528
val departuresModel: DeparturesModel by viewModels { DeparturesModel.Factory }
@@ -32,10 +35,39 @@ class MainActivity : ComponentActivity() {
3235
super.onCreate(savedInstanceState)
3336
enableEdgeToEdge()
3437

38+
39+
val initialLocationForDepartures =
40+
IntentCompat.getParcelableExtra(
41+
intent, DEPARTURES_FROM_INTENT_KEY,
42+
NavRoutes.DeparturesFromLocation::class.java
43+
)
44+
45+
val initialOriginForDirections =
46+
IntentCompat.getParcelableExtra(
47+
intent, DIRECTIONS_FROM_KEY,
48+
NavRoutes.DeparturesFromLocation::class.java
49+
)
50+
51+
val initialDestinationForDirections =
52+
IntentCompat.getParcelableExtra(
53+
intent, DIRECTIONS_TO_KEY,
54+
NavRoutes.DeparturesFromLocation::class.java
55+
)
56+
3557
setContent {
3658
TransportYouTheme {
3759
val navController = rememberNavController()
3860

61+
LaunchedEffect(Unit) {
62+
if (initialLocationForDepartures != null) {
63+
navController.navigate(initialLocationForDepartures)
64+
} else if (initialDestinationForDirections != null && initialOriginForDirections != null) {
65+
directionsModel.origin.value = initialOriginForDirections.toLocation()
66+
directionsModel.destination.value = initialDestinationForDirections.toLocation()
67+
navController.navigate(NavRoutes.Directions)
68+
}
69+
}
70+
3971
NavHost(navController = navController, startDestination = NavRoutes.Home) {
4072
composable<NavRoutes.DeparturesFromLocation> { backStackEntry ->
4173
val departuresScreen: NavRoutes.DeparturesFromLocation =
@@ -55,7 +87,8 @@ class MainActivity : ComponentActivity() {
5587
composable<NavRoutes.TripDetails> { backStackEntry ->
5688
val tripDetails: NavRoutes.TripDetails = backStackEntry.toRoute()
5789

58-
val tripWrapper = directionsModel.trips.value.find { it.id == tripDetails.tripId }!!
90+
val tripWrapper = directionsModel.trips.collectAsState().value
91+
.find { it.id == tripDetails.tripId }!!
5992
TripDetailsScreen(navController, directionsModel, tripWrapper.trip)
6093
}
6194

@@ -70,4 +103,10 @@ class MainActivity : ComponentActivity() {
70103
}
71104
}
72105
}
106+
107+
companion object {
108+
const val DEPARTURES_FROM_INTENT_KEY = "departures_from"
109+
const val DIRECTIONS_FROM_KEY = "directions_from"
110+
const val DIRECTIONS_TO_KEY = "directions_to"
111+
}
73112
}

app/src/main/java/net/youapps/transport/NavRoutes.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package net.youapps.transport
22

3+
import android.os.Parcelable
34
import de.schildbach.pte.dto.Location
45
import de.schildbach.pte.dto.LocationType
56
import de.schildbach.pte.dto.Point
67
import de.schildbach.pte.dto.Product
8+
import kotlinx.parcelize.Parcelize
79
import kotlinx.serialization.Serializable
810

911
object NavRoutes {
@@ -14,6 +16,7 @@ object NavRoutes {
1416
object Directions
1517

1618
@Serializable
19+
@Parcelize
1720
data class DeparturesFromLocation(
1821
val type: LocationType? = null,
1922
val id: String? = null,
@@ -22,7 +25,7 @@ object NavRoutes {
2225
val place: String? = null,
2326
val name: String? = null,
2427
val products: List<String>? = null
25-
) {
28+
): Parcelable {
2629
constructor(location: Location) : this(
2730
location.type,
2831
location.id,

app/src/main/java/net/youapps/transport/widget/DeparturesWidget.kt

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ import androidx.glance.GlanceModifier
2020
import androidx.glance.GlanceTheme
2121
import androidx.glance.ImageProvider
2222
import androidx.glance.LocalContext
23+
import androidx.glance.action.clickable
2324
import androidx.glance.appwidget.GlanceAppWidget
2425
import androidx.glance.appwidget.GlanceAppWidgetManager
26+
import androidx.glance.appwidget.action.actionStartActivity
2527
import androidx.glance.appwidget.components.CircleIconButton
2628
import androidx.glance.appwidget.components.Scaffold
2729
import androidx.glance.appwidget.components.TitleBar
30+
import androidx.glance.appwidget.cornerRadius
2831
import androidx.glance.appwidget.lazy.LazyColumn
2932
import androidx.glance.appwidget.lazy.items
3033
import androidx.glance.appwidget.provideContent
@@ -39,9 +42,12 @@ import androidx.glance.text.FontWeight
3942
import androidx.glance.text.Text
4043
import androidx.glance.text.TextStyle
4144
import de.schildbach.pte.dto.Departure
45+
import de.schildbach.pte.dto.LocationType
4246
import kotlinx.coroutines.Dispatchers
4347
import kotlinx.coroutines.launch
4448
import kotlinx.coroutines.withContext
49+
import net.youapps.transport.MainActivity
50+
import net.youapps.transport.NavRoutes
4551
import net.youapps.transport.R
4652
import net.youapps.transport.TransportYouApp
4753
import net.youapps.transport.components.directions.DEMO_DEPARTURE
@@ -118,9 +124,16 @@ class DeparturesWidget : GlanceAppWidget() {
118124
onRefresh: () -> Unit,
119125
onConfigureClicked: () -> Unit
120126
) {
121-
val scope = rememberCoroutineScope()
122127
val context = LocalContext.current
123128

129+
val startLocation = remember {
130+
NavRoutes.DeparturesFromLocation(
131+
type = LocationType.STATION,
132+
id = locationId,
133+
name = locationName,
134+
)
135+
}
136+
124137
Scaffold {
125138
Column(
126139
modifier = GlanceModifier
@@ -129,6 +142,18 @@ class DeparturesWidget : GlanceAppWidget() {
129142
horizontalAlignment = Alignment.CenterHorizontally,
130143
) {
131144
TitleBar(
145+
modifier = GlanceModifier
146+
.cornerRadius(12.dp)
147+
.clickable(
148+
actionStartActivity(
149+
Intent(context, MainActivity::class.java)
150+
.apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }
151+
.putExtra(
152+
MainActivity.DEPARTURES_FROM_INTENT_KEY,
153+
startLocation
154+
)
155+
)
156+
),
132157
startIcon = ImageProvider(R.drawable.ic_app_full_size),
133158
title = locationName
134159
) {
@@ -167,7 +192,18 @@ class DeparturesWidget : GlanceAppWidget() {
167192
LazyColumn {
168193
items(departures) { departure ->
169194
GlanceDepartureItem(departure) {
170-
// TODO("open directions in app")
195+
val intent = Intent(context, MainActivity::class.java)
196+
.apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }
197+
.putExtra(MainActivity.DIRECTIONS_FROM_KEY, startLocation)
198+
.putExtra(
199+
MainActivity.DIRECTIONS_TO_KEY,
200+
NavRoutes.DeparturesFromLocation(
201+
type = LocationType.STATION,
202+
id = departure.destination?.id,
203+
name = departure.destination?.uniqueShortName(),
204+
)
205+
)
206+
context.startActivity(intent)
171207
}
172208
}
173209

0 commit comments

Comments
 (0)