package ly.img.camera.reactnative.module.model import android.os.Parcel import android.os.Parcelable import ly.img.camera.reactnative.module.model.CameraResult.CREATOR.readMap import ly.img.camera.reactnative.module.model.CameraResult.CREATOR.writeMap /** * The result type for a camera recording session in standard mode. * * @property recordings The recordings of the camera session. */ data class CameraRecording( val recordings: List?, ) : Parcelable { /** * Creates a new instance from a given [Parcel]. * @param parcel The [Parcel]. */ constructor(parcel: Parcel) : this( parcel.createTypedArrayList(Recording), ) constructor(record: ly.img.camera.core.CameraResult.Record) : this( record.recordings.map { Recording(it) }, ) override fun writeToParcel( parcel: Parcel, flags: Int, ) { parcel.writeTypedList(recordings) } override fun describeContents(): Int = 0 companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): CameraResult = CameraResult(parcel) override fun newArray(size: Int): Array = arrayOfNulls(size) } fun toMap(): Map = mapOf( "recordings" to recordings?.map { it.toMap() }, ) } /** * A class representing the result of a camera session. * * @property recording The result for the camera session in standard mode. * @property metadata The associated metadata. */ data class CameraResult( val recording: CameraRecording?, val metadata: Map = emptyMap(), ) : Parcelable { /** * Creates a new instance from a given [Parcel]. * @param parcel The [Parcel]. */ constructor(parcel: Parcel) : this( CameraRecording(parcel), readMap(parcel), ) constructor(record: ly.img.camera.core.CameraResult.Record) : this( CameraRecording(record), emptyMap(), ) override fun writeToParcel( parcel: Parcel, flags: Int, ) { recording?.writeToParcel(parcel, flags) writeMap(parcel, metadata, flags) } override fun describeContents(): Int = 0 companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): CameraResult = CameraResult(parcel) override fun newArray(size: Int): Array = arrayOfNulls(size) private fun writeMap( parcel: Parcel, map: Map, flags: Int, ) { parcel.writeInt(map.size) for ((key, value) in map) { parcel.writeString(key) parcel.writeValue(value) } } private fun readMap(parcel: Parcel): Map { val size = parcel.readInt() val map = mutableMapOf() repeat(size) { val key = parcel.readString() val value = parcel.readValue(this::class.java.classLoader) key ?: throw (IllegalStateException("Key must not be null.")) value ?: throw (IllegalStateException("Value must not be null.")) map[key] = value } return map } } fun toMap(): Map = mapOf( "recording" to recording?.toMap(), "metadata" to metadata, ) }