diff --git a/core-ui/build.gradle.kts b/core-ui/build.gradle.kts index a13407fe06..09e06c493a 100644 --- a/core-ui/build.gradle.kts +++ b/core-ui/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("signal-library") alias(libs.plugins.compose.compiler) + alias(libs.plugins.kotlinx.serialization) } android { @@ -30,4 +31,5 @@ dependencies { api(libs.androidx.compose.ui.tooling.preview) debugApi(libs.androidx.compose.ui.tooling.core) api(libs.androidx.fragment.compose) + implementation(libs.kotlinx.serialization.json) } diff --git a/core-ui/src/main/java/org/signal/core/ui/compose/TriggerAlignedPopup.kt b/core-ui/src/main/java/org/signal/core/ui/compose/TriggerAlignedPopup.kt index 876577cb3c..7c50a1a3fb 100644 --- a/core-ui/src/main/java/org/signal/core/ui/compose/TriggerAlignedPopup.kt +++ b/core-ui/src/main/java/org/signal/core/ui/compose/TriggerAlignedPopup.kt @@ -27,6 +27,9 @@ import androidx.compose.ui.window.DialogWindowProvider import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupPositionProvider import androidx.compose.ui.window.PopupProperties +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import org.signal.core.ui.compose.TriggerAlignedPopupState.Companion.popupTrigger import kotlin.math.max import kotlin.math.min @@ -57,17 +60,35 @@ class TriggerAlignedPopupState private constructor( companion object { + @Serializable + data class SaveState( + val display: Boolean, + val left: Int, + val top: Int, + val right: Int, + val bottom: Int + ) + @Composable fun rememberTriggerAlignedPopupState(): TriggerAlignedPopupState { return rememberSaveable( saver = Saver( save = { - it.display to it.triggerBounds + Json.encodeToString( + SaveState( + display = it.display, + left = it.triggerBounds.left, + right = it.triggerBounds.right, + top = it.triggerBounds.top, + bottom = it.triggerBounds.bottom + ) + ) }, restore = { + val saveState: SaveState = Json.decodeFromString(it) TriggerAlignedPopupState( - it.first, - it.second + saveState.display, + IntRect(saveState.left, saveState.top, saveState.right, saveState.bottom) ) } )