1 package leakcanary.internal.navigation 2 3 import android.os.Parcel 4 import android.os.Parcelable 5 import android.util.SparseArray 6 import android.view.View 7 8 internal class BackstackFrame : Parcelable { 9 10 val screen: Screen 11 private val viewState: SparseArray<Parcelable>? 12 13 private constructor( 14 source: Parcel 15 ) { 16 this.screen = source.readSerializable() as Screen 17 @Suppress("UNCHECKED_CAST") 18 this.viewState = source.readSparseArray(javaClass.classLoader) 19 } 20 21 constructor( 22 screen: Screen 23 ) { 24 this.screen = screen 25 viewState = null 26 } 27 28 constructor( 29 screen: Screen, 30 view: View 31 ) { 32 this.screen = screen 33 viewState = SparseArray() 34 view.saveHierarchyState(viewState) 35 } 36 restorenull37 fun restore(view: View) { 38 if (viewState != null) { 39 view.restoreHierarchyState(viewState) 40 } 41 } 42 describeContentsnull43 override fun describeContents() = 0 44 45 @Suppress("UNCHECKED_CAST") 46 override fun writeToParcel( 47 dest: Parcel, 48 flags: Int 49 ) { 50 dest.writeSerializable(screen) 51 dest.writeSparseArray(viewState as SparseArray<Any>?) 52 } 53 54 companion object { 55 @Suppress("UNCHECKED_CAST") 56 @JvmField val CREATOR = object : Parcelable.Creator<BackstackFrame> { createFromParcelnull57 override fun createFromParcel(source: Parcel): BackstackFrame { 58 return BackstackFrame(source) 59 } 60 newArraynull61 override fun newArray(size: Int): Array<BackstackFrame?> { 62 return arrayOfNulls(size) 63 } 64 } 65 } 66 } 67