Skip to content

Commit 1093c3d

Browse files
committed
Fix crash when app is backgrounded with EventDataTransferManager
1 parent ce00030 commit 1093c3d

File tree

6 files changed

+50
-28
lines changed

6 files changed

+50
-28
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ android {
1616
minSdk = 30
1717
targetSdk = 34
1818
versionCode = 1
19-
versionName = "1.0.1"
19+
versionName = "1.0.2"
2020

2121
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2222
vectorDrawables {

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/EventDivisionView.kt

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@ import androidx.compose.foundation.layout.Box
66
import androidx.compose.foundation.layout.fillMaxSize
77
import androidx.compose.foundation.layout.padding
88
import androidx.compose.material.icons.Icons
9-
import androidx.compose.material.icons.filled.*
10-
import androidx.compose.material.icons.outlined.*
9+
import androidx.compose.material.icons.filled.AccessTimeFilled
10+
import androidx.compose.material.icons.filled.EmojiEvents
11+
import androidx.compose.material.icons.filled.FormatListNumbered
12+
import androidx.compose.material.icons.filled.People
13+
import androidx.compose.material.icons.outlined.AccessTime
14+
import androidx.compose.material.icons.outlined.EmojiEvents
15+
import androidx.compose.material.icons.outlined.PeopleOutline
1116
import androidx.compose.material3.MaterialTheme
1217
import androidx.compose.material3.NavigationBar
1318
import androidx.compose.material3.NavigationBarItem
1419
import androidx.compose.material3.Scaffold
1520
import androidx.compose.material3.Text
1621
import androidx.compose.runtime.Composable
22+
import androidx.compose.runtime.LaunchedEffect
1723
import androidx.compose.runtime.SideEffect
1824
import androidx.compose.runtime.getValue
1925
import androidx.compose.runtime.mutableIntStateOf
@@ -32,7 +38,10 @@ import androidx.navigation.NavController
3238
import androidx.navigation.compose.currentBackStackEntryAsState
3339
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
3440
import com.ramcosta.composedestinations.annotation.Destination
35-
import com.sunkensplashstudios.VRCRoboScout.destinations.*
41+
import com.sunkensplashstudios.VRCRoboScout.destinations.EventDivisionAwardsViewDestination
42+
import com.sunkensplashstudios.VRCRoboScout.destinations.EventDivisionMatchesViewDestination
43+
import com.sunkensplashstudios.VRCRoboScout.destinations.EventDivisionRankingsViewDestination
44+
import com.sunkensplashstudios.VRCRoboScout.destinations.EventTeamsViewDestination
3645

3746
class EventDivisionViewModel: ViewModel() {
3847
var event by mutableStateOf(Event())
@@ -96,16 +105,15 @@ fun DivisionTabView(tabBarItems: List<TabBarItem>, navController: NavController,
96105
@OptIn(ExperimentalMaterialNavigationApi::class, ExperimentalAnimationApi::class)
97106
@Destination
98107
@Composable
99-
fun EventDivisionView(eventDivisionViewModel: EventDivisionViewModel = viewModel(), navController: NavController, event: Event, division: Division) {
108+
fun EventDivisionView(eventId: Int, division: Division, eventDivisionViewModel: EventDivisionViewModel = viewModel(), navController: NavController) {
100109

101-
/*val divisionViewModels = mapOf(
102-
"event_division_matches_view" to viewModel<EventDivisionMatchesViewModel>(),
103-
"event_division_rankings_view" to viewModel<EventDivisionRankingsViewModel>(),
104-
"event_division_awards_view" to viewModel<EventDivisionAwardsViewModel>()
105-
)*/
110+
LaunchedEffect(Unit) {
111+
eventDivisionViewModel.event = eventDataTransferManager.getEvent(eventId) ?: Event(eventId, false)
112+
eventDivisionViewModel.division = division
113+
}
106114

107115
// setting up the individual tabs
108-
val teamsTab = TabBarItem(title = "Teams", direction = EventTeamsViewDestination(eventDivisionViewModel.event, eventDivisionViewModel.division), selectedIcon = Icons.Filled.People, unselectedIcon = Icons.Outlined.PeopleOutline)
116+
val teamsTab = TabBarItem(title = "Teams", direction = EventTeamsViewDestination(eventDivisionViewModel.event.id, eventDivisionViewModel.division), selectedIcon = Icons.Filled.People, unselectedIcon = Icons.Outlined.PeopleOutline)
109117
val matchListTab = TabBarItem(title = "Match List", direction = EventDivisionMatchesViewDestination(eventDivisionViewModel.event, eventDivisionViewModel.division), selectedIcon = Icons.Filled.AccessTimeFilled, unselectedIcon = Icons.Outlined.AccessTime)
110118
val rankingsTab = TabBarItem(title = "Rankings", direction = EventDivisionRankingsViewDestination(eventDivisionViewModel.event, eventDivisionViewModel.division), selectedIcon = Icons.Filled.FormatListNumbered, unselectedIcon = Icons.Filled.FormatListNumbered)
111119
val awardsTab = TabBarItem(title = "Awards", direction = EventDivisionAwardsViewDestination(eventDivisionViewModel.event, eventDivisionViewModel.division), selectedIcon = Icons.Filled.EmojiEvents, unselectedIcon = Icons.Outlined.EmojiEvents)
@@ -158,29 +166,29 @@ fun EventDivisionView(eventDivisionViewModel: EventDivisionViewModel = viewModel
158166
0 -> {
159167
EventTeamsView(
160168
navController = navController,
161-
event = event,
169+
eventId = eventId,
162170
division = division
163171
)
164172
}
165173
1 -> {
166174
EventDivisionMatchesView(
167175
navController = navController,
168-
event = event,
176+
event = eventDivisionViewModel.event,
169177
division = division,
170178
//eventDivisionMatchesViewModel = divisionViewModels["event_division_matches_view"] as EventDivisionMatchesViewModel
171179
)
172180
}
173181
2 -> {
174182
EventDivisionRankingsView(
175-
event = event,
183+
event = eventDivisionViewModel.event,
176184
division = division,
177185
navController = navController,
178186
//eventDivisionRankingsViewModel = divisionViewModels["event_division_rankings_view"] as EventDivisionRankingsViewModel
179187
)
180188
}
181189
3 -> {
182190
EventDivisionAwardsView(
183-
event = event,
191+
event = eventDivisionViewModel.event,
184192
division = division,
185193
navController = navController,
186194
//eventDivisionAwardsViewModel = divisionViewModels["event_division_awards_view"] as EventDivisionAwardsViewModel

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/EventTeamsView.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,24 @@ import androidx.navigation.NavController
4444
import com.ramcosta.composedestinations.annotation.Destination
4545
import com.ramcosta.composedestinations.navigation.navigate
4646
import com.sunkensplashstudios.VRCRoboScout.destinations.EventTeamMatchesViewDestination
47-
import com.sunkensplashstudios.VRCRoboScout.ui.theme.*
48-
47+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.onTopContainer
48+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.topContainer
4949
import kotlinx.coroutines.CoroutineScope
5050
import kotlinx.coroutines.Dispatchers
5151
import kotlinx.coroutines.launch
5252
import kotlinx.coroutines.withContext
5353

5454
class EventTeamsViewModel: ViewModel() {
55-
var event by mutableStateOf(Event())
5655
var division by mutableStateOf(Division())
5756
var teams by mutableStateOf(listOf<Team>())
5857
}
5958

6059
@OptIn(ExperimentalMaterial3Api::class)
6160
@Destination
6261
@Composable
63-
fun EventTeamsView(event: Event, eventTeamsViewModel: EventTeamsViewModel = viewModel(), navController: NavController, division: Division? = null) {
62+
fun EventTeamsView(eventId: Int, eventTeamsViewModel: EventTeamsViewModel = viewModel(), navController: NavController, division: Division? = null) {
6463

6564
LaunchedEffect(Unit) {
66-
eventTeamsViewModel.event = event
6765
eventTeamsViewModel.division = division ?: Division()
6866
}
6967

@@ -95,6 +93,7 @@ fun EventTeamsView(event: Event, eventTeamsViewModel: EventTeamsViewModel = view
9593

9694
fun fetchTeamsList() {
9795
CoroutineScope(Dispatchers.Default).launch {
96+
val event = eventDataTransferManager.getEvent(eventId) ?: Event(eventId, false)
9897
if (division != null) {
9998
event.fetchTeams()
10099
event.fetchRankings(division)
@@ -163,7 +162,7 @@ fun EventTeamsView(event: Event, eventTeamsViewModel: EventTeamsViewModel = view
163162
.fillMaxWidth()
164163
.clickable {
165164
navController.navigate(
166-
EventTeamMatchesViewDestination(event, team)
165+
EventTeamMatchesViewDestination(Event(eventId, false), team)
167166
)
168167
},
169168
verticalAlignment = Alignment.CenterVertically

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/EventView.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ fun EventView(eventViewModel: EventViewModel = viewModel(), navController: NavCo
168168
.padding(padding)
169169
.fillMaxSize()
170170
) {
171-
getEventViewModel()
172171
if (eventViewModel.loading) {
173172
Column(
174173
modifier = Modifier.fillMaxSize(),
@@ -228,8 +227,9 @@ fun EventView(eventViewModel: EventViewModel = viewModel(), navController: NavCo
228227
horizontalArrangement = Arrangement.SpaceBetween,
229228
verticalAlignment = Alignment.CenterVertically,
230229
modifier = Modifier.clickable {
230+
eventDataTransferManager.putEvent(eventViewModel.event)
231231
navController.navigate(
232-
EventTeamsViewDestination(eventViewModel.event)
232+
EventTeamsViewDestination(eventViewModel.event.id)
233233
)
234234
}
235235
) {
@@ -331,8 +331,9 @@ fun EventView(eventViewModel: EventViewModel = viewModel(), navController: NavCo
331331
horizontalArrangement = Arrangement.SpaceBetween,
332332
verticalAlignment = Alignment.CenterVertically,
333333
modifier = Modifier.clickable {
334+
eventDataTransferManager.putEvent(eventViewModel.event)
334335
navController.navigate(
335-
EventDivisionViewDestination(eventViewModel.event, division)
336+
EventDivisionViewDestination(eventViewModel.event.id, division)
336337
)
337338
}
338339
) {

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/RoboScoutAPI.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ class RoboScoutAPI {
211211
}
212212
}
213213
catch (e: java.text.ParseException) {
214-
println("Could not parse date: $e")
215214
return null
216215
}
217216
}

app/src/main/java/com/sunkensplashstudios/VRCRoboScout/RootActivity.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ import androidx.navigation.compose.currentBackStackEntryAsState
5858
import androidx.navigation.compose.rememberNavController
5959
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
6060
import com.ramcosta.composedestinations.DestinationsNavHost
61-
import com.ramcosta.composedestinations.animations.defaults.RootNavGraphDefaultAnimations
6261
import com.ramcosta.composedestinations.animations.rememberAnimatedNavHostEngine
6362
import com.ramcosta.composedestinations.manualcomposablecalls.composable
6463
import com.ramcosta.composedestinations.navigation.navigate
@@ -69,8 +68,9 @@ import com.sunkensplashstudios.VRCRoboScout.destinations.SettingsViewDestination
6968
import com.sunkensplashstudios.VRCRoboScout.destinations.TrueSkillViewDestination
7069
import com.sunkensplashstudios.VRCRoboScout.destinations.WorldSkillsViewDestination
7170
import com.sunkensplashstudios.VRCRoboScout.ui.theme.VRCRoboScoutTheme
72-
import com.sunkensplashstudios.VRCRoboScout.ui.theme.*
73-
71+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.button
72+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.onTopContainer
73+
import com.sunkensplashstudios.VRCRoboScout.ui.theme.topContainer
7474
import kotlinx.coroutines.CoroutineScope
7575
import kotlinx.coroutines.Dispatchers
7676
import kotlinx.coroutines.launch
@@ -168,6 +168,20 @@ class UserSettings(context: Context) {
168168
}
169169
}
170170

171+
class EventDataTransferManager {
172+
private var events: MutableMap<Int, Event> = mutableMapOf()
173+
174+
fun putEvent(event: Event) {
175+
events[event.id] = event
176+
}
177+
178+
fun getEvent(id: Int): Event? {
179+
val event = events[id]
180+
events.remove(id)
181+
return event
182+
}
183+
}
184+
171185
class EventViewModelStore {
172186
val eventViewModels = mutableMapOf<String, EventViewModel>()
173187

@@ -186,6 +200,7 @@ class EventViewModelStore {
186200
}
187201

188202
val eventViewModelStore = EventViewModelStore()
203+
val eventDataTransferManager = EventDataTransferManager()
189204

190205
data class TabBarItem(
191206
val title: String,

0 commit comments

Comments
 (0)