From 11a6113b4f8657f4bb9c125c0ad55b3e9c723f55 Mon Sep 17 00:00:00 2001 From: Avently <7953703+avently@users.noreply.github.com> Date: Mon, 12 Dec 2022 15:37:11 +0300 Subject: [PATCH] android: Fix crash on multiple selection of images --- .../chat/simplex/app/views/helpers/Enums.kt | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Enums.kt b/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Enums.kt index a7ed87d761..bf083c6e81 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Enums.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/helpers/Enums.kt @@ -1,7 +1,8 @@ package chat.simplex.app.views.helpers -import android.graphics.Bitmap import android.net.Uri +import android.os.Parcel +import android.os.Parcelable import androidx.compose.runtime.saveable.Saver import kotlinx.coroutines.flow.MutableStateFlow @@ -32,7 +33,40 @@ enum class NewChatSheetState { } } -sealed class UploadContent { - data class SimpleImage(val uri: Uri): UploadContent() - data class AnimatedImage(val uri: Uri): UploadContent() +/** + * [Parcelable] implementation is needed to prevent a crash. Without it this situation produce a crash: + * - select images in SendMsgView + * - do this again without sending or dismissing previous selection + * */ +sealed class UploadContent: Parcelable { + data class SimpleImage(val uri: Uri): UploadContent(), Parcelable { + constructor(parcel: Parcel): this(parcel.readParcelable(Uri::class.java.classLoader) as Uri) + override fun describeContents(): Int = 0 + override fun writeToParcel(dest: Parcel?, flags: Int) { + dest?.writeParcelable(uri, 0) + } + companion object CREATOR: Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): SimpleImage { + return SimpleImage(parcel) + } + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + } + data class AnimatedImage(val uri: Uri): UploadContent(), Parcelable { + constructor(parcel: Parcel): this(parcel.readParcelable(Uri::class.java.classLoader) as Uri) + override fun describeContents(): Int = 0 + override fun writeToParcel(dest: Parcel?, flags: Int) { + dest?.writeParcelable(uri, 0) + } + companion object CREATOR: Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): AnimatedImage { + return AnimatedImage(parcel) + } + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + } }