package Ġcom . github . frag ivity Ċ Ċ import Ġandroid . os . Parcelable Ċ import Ġandroidx . fragment . app . Frag ivity Fragment Destination Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Destination Ċ import Ġandroidx . navigation . Nav Graph Builder Ċ import Ġandroidx . navigation . fragment . Dialog Fragment Navigator Ċ import Ġandroidx . navigation . fragment . Fragment Navigator Ċ import Ġandroidx . navigation . fragment . Nav Host Fragment Ċ import Ġkotlinx . parcel ize . Parcel ize Ċ Ċ val ĠNav Host Fragment . node Saver : ĠRestore Node Saver ĊĠĠĠ Ġget () Ġ= ĠViewModel Provider ( this , Ġdefault ViewModel Provider Factory ) ĊĠĠĠĠĠĠĠ Ġ. get ( Restore Node Saver Impl :: class . java ) Ċ Ċ internal Ġval ĠRestore Node Saver . start NodeId : ĠInt ? ĊĠĠĠ Ġget () Ġ= Ġ( this Ġas ĠRestore Node Saver Impl ). start NodeId Ċ Ċ @ Jvm Synt hetic Ċ internal Ġfun ĠRestore Node Saver . restore Nodes ( ĊĠĠĠ Ġnav Controller : ĠNav Controller , ĊĠĠĠ Ġgraph Builder : ĠNav Graph Builder Ċ ) Ġ{ ĊĠĠĠ Ġ( this Ġas ĠRestore Node Saver Impl ). restore Nodes ( nav Controller , Ġgraph Builder ) Ċ } Ċ Ċ sealed Ġinterface ĠRestore Node Saver Ġ: ĠNode Saver Ċ Ċ class ĠRestore Node Saver Impl ( ĊĠĠĠ Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle Ċ ) Ġ: ĠViewModel (), ĠRestore Node Saver Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġstart NodeId : ĠInt ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsaved State Handle . get < Int >( NAV _ DEST _ START _ NODE ) ĊĊĠĠĠ Ġprivate Ġval Ġnav Dest Sequence : ĠSequence < String > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsaved State Handle . keys (). as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . startsWith ( NAV _ DEST _ PREFIX ) Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġrestore Nodes ( nav Controller : ĠNav Controller , Ġgraph Builder : ĠNav Graph Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnav Dest Sequence ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġsaved State Handle . get < Nav Destination Bundle >( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Destination ( nav Controller ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġgraph Builder . add Destination ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Node ( node : ĠNav Destination ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠNAV _ DEST _ PREFIX Ġ+ Ġnode . id ĊĠĠĠĠĠĠĠ Ġsaved State Handle . set ( key , Ġnode . to Bundle ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Node ( node : ĠNav Destination ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠNAV _ DEST _ PREFIX Ġ+ Ġnode . id ĊĠĠĠĠĠĠĠ Ġif Ġ( saved State Handle . contains ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved State Handle . remove < Nav Destination Bundle >( key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Start Node ( nodeId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsaved State Handle . set ( NAV _ DEST _ START _ NODE , ĠnodeId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġnav Dest Sequence . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved State Handle . remove < Nav Destination Bundle >( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNAV _ DEST _ PREFIX Ġ= Ġ" Nav Dest Key -" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNAV _ DEST _ START _ NODE Ġ= Ġ" Nav Dest Key # Start NodeId " ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠNav Destination Bundle . to Destination ( nav Controller : ĠNav Controller ): ĠNav Destination Ġ{ ĊĠĠĠ Ġif Ġ( className . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= ĠClass . forName ( className ) Ġas ĠClass < Fragment > ĊĠĠĠĠĠĠĠ Ġreturn Ġnav Controller . createNode ( id , Ġclazz . kotlin ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnav Controller . createNode ( id , Ġnull , Ġlabel ) Ċ } Ċ Ċ private Ġfun ĠNav Destination . to Bundle (): ĠNav Destination Bundle Ġ{ ĊĠĠĠ Ġval Ġclazz Name Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠF rag ivity Fragment Destination Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ Ġis ĠFragment Navigator . Destination Ġ-> ĠclassName ĊĠĠĠĠĠĠĠ Ġis ĠDialog Fragment Navigator . Destination Ġ-> ĠclassName ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Invalid ĠDestination ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠNav Destination Bundle ( id , Ġclazz Name , Ġlabel ) Ċ } Ċ Ċ @ Parcel ize Ċ private Ġdata Ġclass ĠNav Destination Bundle ( ĊĠĠĠ Ġval Ġid : ĠInt , ĊĠĠĠ Ġval ĠclassName : ĠString , ĊĠĠĠ Ġval Ġlabel : ĠCharSequence ? Ċ ) Ġ: ĠParcel able Ċ