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