|
| 1 | +/* |
| 2 | + * Copyright 2020 Google LLC. |
| 3 | + * |
| 4 | + * This code may only be used under the BSD style license found at |
| 5 | + * http://polymer.github.io/LICENSE.txt |
| 6 | + * |
| 7 | + * Code distributed by Google as part of this project is also subject to an additional IP rights |
| 8 | + * grant found at |
| 9 | + * http://polymer.github.io/PATENTS.txt |
| 10 | + */ |
| 11 | + |
| 12 | +package arcs.android.crdt |
| 13 | + |
| 14 | +import android.os.Parcel |
| 15 | +import android.os.Parcelable |
| 16 | +import arcs.android.util.writeProto |
| 17 | +import arcs.core.storage.Reference |
| 18 | +import arcs.core.storage.StorageKeyParser |
| 19 | + |
| 20 | +/** Parcelable version of [Reference]. */ |
| 21 | +data class ParcelableReference(override val actual: Reference) : ParcelableReferencable { |
| 22 | + override fun writeToParcel(parcel: Parcel, flags: Int) { |
| 23 | + super.writeToParcel(parcel, flags) |
| 24 | + parcel.writeString(actual.id) |
| 25 | + parcel.writeString(actual.storageKey.toString()) |
| 26 | + actual.version?.let { |
| 27 | + parcel.writeProto(it.toProto()) |
| 28 | + } ?: { |
| 29 | + parcel.writeTypedObject(null, flags) |
| 30 | + }() |
| 31 | + } |
| 32 | + |
| 33 | + override fun describeContents(): Int = 0 |
| 34 | + |
| 35 | + /* Don't use this directly, instead use ParcelableReferencable. */ |
| 36 | + internal companion object CREATOR : Parcelable.Creator<ParcelableReference> { |
| 37 | + override fun createFromParcel(parcel: Parcel): ParcelableReference { |
| 38 | + val id = requireNotNull(parcel.readString()) { |
| 39 | + "Required id not found in parcel for ParcelableReference" |
| 40 | + } |
| 41 | + val storageKeyString = requireNotNull(parcel.readString()) { |
| 42 | + "Required storageKey not found in parcel for ParcelableReference" |
| 43 | + } |
| 44 | + val versionMap = parcel.readVersionMap()?.takeIf { it.isNotEmpty() } |
| 45 | + |
| 46 | + return ParcelableReference( |
| 47 | + Reference(id, StorageKeyParser.parse(storageKeyString), versionMap) |
| 48 | + ) |
| 49 | + } |
| 50 | + |
| 51 | + override fun newArray(size: Int): Array<ParcelableReference?> = arrayOfNulls(size) |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +/** Writes the [Reference] to the receiving [Parcel]. */ |
| 56 | +fun Parcel.writeReference(reference: Reference, flags: Int) = |
| 57 | + writeTypedObject(ParcelableReference(reference), flags) |
0 commit comments