Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace gson.tojson with Parcelable implementation #1124

Merged
merged 6 commits into from
Aug 4, 2023
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
38 changes: 27 additions & 11 deletions app/src/main/java/com/jerboa/JerboaAppState.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.jerboa

import android.os.Parcelable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.Stable
Expand All @@ -22,6 +23,7 @@ import com.jerboa.ui.components.common.Route
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.parcelize.Parcelize
import java.net.URLEncoder
import java.nio.charset.StandardCharsets

Expand Down Expand Up @@ -156,8 +158,8 @@ class JerboaAppState(
}
}

fun<T> addReturn(key: String, value: T) {
navController.previousBackStackEntry?.savedStateHandle?.set(key, gson.toJson(value))
fun addReturn(key: String, value: Parcelable) {
navController.previousBackStackEntry?.savedStateHandle?.set(key, value)
}

fun getBackStackEntry(route: String): NavBackStackEntry {
Expand Down Expand Up @@ -216,34 +218,48 @@ fun<D> JerboaAppState.rootChannel(): RouteChannel<D> {
return viewModel(root)
}

@Parcelize
data class NullableWrapper<T : Parcelable?>(val data: T) : Parcelable

@Composable
inline fun <reified D> JerboaAppState.takeDepsFromRoot(): State<D> {
// HACK: the autogen types aren't serializable or parcelable. If they were we don't
// have to do this manual conversion to json and back.
// TODO: Fix this once autogen types are serializable or parcelable
inline fun <reified D : Parcelable> JerboaAppState.takeDepsFromRoot(): State<D> {
val deps = rootChannel<D>().take()

// This will survive process death
val depsSaved = rememberSaveable { deps!! }

// After process death, deps will be null
return remember(depsSaved) {
derivedStateOf {
deps ?: depsSaved
}
}
}

@Composable
inline fun <reified D : Parcelable?> JerboaAppState.takeNullableDepsFromRoot(): State<D?> {
val deps = rootChannel<D>().take()

// This will survive process death
val depsJson = rememberSaveable { gson.toJson(deps) }
val depsSaved = rememberSaveable { NullableWrapper(deps) }

// After process death, deps will be null
return remember(depsJson) {
return remember(depsSaved) {
derivedStateOf {
deps ?: gson.fromJson(depsJson, D::class.java)
deps ?: depsSaved.data
}
}
}

@Composable
inline fun<reified T> JerboaAppState.ConsumeReturn(
inline fun<reified T : Parcelable> JerboaAppState.ConsumeReturn(
key: String,
crossinline consumeBlock: (T) -> Unit,
) {
LaunchedEffect(key) {
val savedStateHandle = navController.currentBackStackEntry?.savedStateHandle
if (savedStateHandle?.contains(key) == true) {
consumeBlock(gson.fromJson(savedStateHandle.get<String>(key), T::class.java))
savedStateHandle.get<T>(key)?.also(consumeBlock)
savedStateHandle.remove<String>(key)
}
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/jerboa/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ class MainActivity : AppCompatActivity() {
} else {
body = text
}
val community by appState.takeDepsFromRoot<Community?>()
val community by appState.takeNullableDepsFromRoot<Community?>()

CreatePostActivity(
appState = appState,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ fun PostActivity(
navigationIcon = {
IconButton(
modifier = Modifier.testTag("jerboa:back"),
onClick = appState::popBackStack,
onClick = appState::navigateUp,
) {
Icon(
Icons.Outlined.ArrowBack,
Expand Down