@ file : Suppress (" unused ", Ġ" Member Visibility Can Be Private ", Ġ" EXPERIMENT AL _ API _ USAGE ") Ċ Ċ package Ġkim . je ong hy eon . client ĊĊ Ċ import Ġio . ktor . http .* Ċ import Ġkim . je ong hy eon . annotation . Simple Arch Internal Ċ import Ġkim . je ong hy eon . net . Dee plink Error Ċ import Ġkim . je ong hy eon . net . Red irection Type Ċ import Ġkim . je ong hy eon . type .* Ċ import Ġkim . je ong hy eon . util . log Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ import Ġkotlin . experimental . Experimental Type Inference Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġdon 't Ġuse Ġvar Ġproperty . Ċ Ġ* Ġ Ġ- Ġnative Ġfreeze Ġall Ġfield Ġwhen Ġbackground Ġthread Ġis Ġrunning . Ċ Ġ* Ġif Ġsome Ġvariable Ġdata Ġis Ġrequired . Ġuse Ġ[ Flow ] Ġor Ġ[ Atomic Reference ] Ċ Ġ* Ċ Ġ* ĠTodo Ġ[ K SA - 1 4 0 ] ĠSupport ĠSaved State Ġon ĠAndroid Ċ Ġ* Ġ Ġonly Ġconfigured Ġdata Ġor Ġflow Ġwill Ġbe Ġsaved Ġand Ġrestored . Ċ Ġ* Ġ Ġthis Ġis Ġsame Ġapproach Ġwith Ġexisting Ġsaved State Handler Ċ Ġ*/ Ċ open Ġclass ĠBase ViewModel Ġ{ ĊĊĠĠĠ Ġopen Ġval Ġinit Status : ĠViewModel Flow < Status > Ġ= ĠviewModel Flow () ĊĠĠĠ Ġopen Ġval Ġstatus : ĠViewModel Flow < Status > Ġ= ĠviewModel Flow () ĊĊĠĠĠ Ġopen Ġval Ġtitle : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġval Ġis Initialized : ĠAtomic Reference < Boolean > Ġ= Ġatomic ( false ) ĊĠĠĠ Ġprivate Ġval Ġ_ init Flow : ĠViewModel Flow < Unit > Ġ= ĠviewModel Flow () ĊĠĠĠ Ġval Ġinit Flow : ĠFlow < Unit > Ġ= Ġ_ init Flow ĊĊĠĠĠ Ġval Ġscope : ĠViewModel Scope Ġby Ġlazy Ġ{ ĠViewModel Scope () Ġ} ĊĊĠĠĠ Ġval Ġscreen Result : ĠViewModel Flow < Screen Result > Ġ= ĠviewModel Flow () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġtodo ĠSupport ĠToast . ĊĠĠĠĠ Ġ* Ġ Ġas Ġit Ġshould Ġbe Ġshown Ġwhen Ġscreen Ġis Ġappeared . ĊĠĠĠĠ Ġ* Ġ Ġso , Ġchange Ġtext Ġto Ġnull Ġon Ġui Ġside . ĊĠĠĠĠ Ġ* Ġ Ġas Ġtoast Ġis Ġshown Ġon Ġall Ġscreen Ġinstead Ġof Ġshowing Ġonly Ġone Ġscreen . ĊĠĠĠĠ Ġ* Ġ Ġthis Ġseems Ġto Ġhave Ġto Ġbe Ġcollected Ġby ĠBase Activity . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtoast Text : ĠViewModel Flow < String > Ġ= ĠviewModel Flow () ĊĊĠĠĠ Ġ// todo Ġcollect Ġthis , Ġand Ġroot Ġscreen Ġignore Ġback Ġbutton Ġevent . ĊĠĠĠ Ġval Ġcan Go Back : ĠViewModel Flow < Boolean > Ġ= ĠviewModel Flow ( true ) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġif Ġneed Ġcustom izing Ġhandling Ġdee plink . Ġoverride Ġthis . ĊĠĠĠĠ Ġ* Ġex ) Ġshow Ġsn ackbar Ġbefore Ġnavigation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġhandle Dee plink () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Status . handle Dee plink () ĊĠĠĠĠĠĠĠ Ġstatus . handle Dee plink () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġuse Ġthis Ġfor Ġcustom Ġresource Ġto Ġhandle Ġdee plink ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠFlow < Resource <* >> . handle Dee plink () Ġ= Ġcollect On ViewModel Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġdee plink Info Ġ= Ġresource . error OrNull Of < Dee plink Error >() ?. dee plink Info Ġ?: Ġreturn @ collect On ViewModel ĊĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġnavigate To Dee plink For Result ( dee plink Info . url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . i ("[ handle Dee plink ] Ġ$ result , Ġ$ dee plink Info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result . is Ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dee plink Info . red irection Info . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRed irection Type . retry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource . retry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRed irection Type . red irection Url Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Dee plink ( dee plink Info . red irection Info . url !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRed irection Type . none Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġnothing ( show Ġerror Ġui , Ġand Ġwhen Ġuser Ġclick Ġretry Ġbutton , Ġcall Ġapi Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate ( viewModel : ĠBase ViewModel ): ĠBoolean Ġ= ĠNavigator . navigate ( viewModel ) ĊĊĠĠĠ Ġ// todo Ġthis Ġdoesn 't Ġsupport Ġsaved State . ĊĠĠĠ Ġ// Ġfor Ġnavigation Ġwith Ġsupporting Ġsaved State , Ġadd Ġdifferent Ġmechanism . ĊĠĠĠ Ġ// Ġbut , Ġas Ġthis Ġis Ġsimple Ġthan Ġthe Ġmechanism . Ġif Ġthe Ġsaved State Ġis Ġnot Ġrequired , Ġjust Ġuse Ġthis . ĊĠĠĠ Ġsuspend Ġfun Ġnavigate For Result ( viewModel : ĠBase ViewModel ): ĠScreen Result Ġ= Ġsuspend Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠ ĠviewModel . screen Result . collect On ViewModel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! navigate ( viewModel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume With Exception ( IllegalStateException (" can 't Ġnavigate Ġto Ġsame ĠViewModel ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate To Dee plink ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( Dee plink Navigator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Dee plink From Internal ( Dee plink Navigation ( url , Ġnull )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġnavigate To Dee plink For Result ( url : ĠString ): ĠScreen Result Ġ= Ġsuspend Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠ Ġwith ( Dee plink Navigator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Dee plink From Internal ( Dee plink Navigation ( url , Ġobject Ġ: ĠDee plink Result Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Dee plink Result ( result : ĠScreen Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġwhen ĠScreen Ġis Ġcreated , Ġbut Ġnot Ġyet Ġdrawn . ĠviewModel 's Ġinit Ġ{} Ġis Ġinvoked . ĊĠĠĠĠ Ġ* ĠIt 's Ġbetter Ġto Ġinitialize Ġdata Ġwhen ĠScreen Ġis Ġdrawn . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Initialized () Ġ{} ĊĊĠĠĠ Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( screen Result . value OrNull Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Result . value Ġ= ĠScreen Result ( Screen Result . RESULT _ CODE _ CANCEL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġthis Ġis Ġsometimes Ġnot Ġcalled Ġdirectly Ġon Ġios ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġon Cle ared () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . close () ĊĠĠĠĠĠĠĠ Ġon Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Dee plink Received ( url : ĠUrl ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo Back () Ġ{ ĊĠĠĠĠĠĠĠ ĠNavigator . back Up To ( this , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo Back With Ok ( data : ĠAny ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgo Back ( Screen Result ( Screen Result . RESULT _ CODE _ OK , Ġdata )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo Back ( result : ĠScreen Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . screen Result . value Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġgo Back () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoast ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtoast Text . value Ġ= Ġmessage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠviewModel Flow (): ĠViewModel Flow < T > Ġ= ĠviewModel Flow < T >( this ) ĊĠĠĠ Ġfun Ġ< T > ĠviewModel Flow ( initial Value : ĠT ): ĠViewModel Flow < T > Ġ= ĠviewModel Flow < T >( this , Ġinitial Value ) ĊĊĊĠĠĠ Ġfun Ġlaunch ( block : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit ): ĠJob Ġ= Ġscope . launch ( block Ġ= Ġblock ) ĊĊĠĠĠ Ġfun Ġ< T > ĠFlow < T >. assign ( result : ĠMutable Shared Flow < Resource < T >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġassign ( scope , Ġresult ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠFlow < T >. assign ( data : ĠMutable Shared Flow < T >, Ġstatus : ĠMutable Shared Flow < Status >) Ġ{ ĊĠĠĠĠĠĠĠ Ġassign ( scope , Ġdata , Ġstatus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠMutable Shared Flow < Resource < T >> . load ( work : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Resource ( scope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠViewModel Flow < T >. load ( status : ĠViewModel Flow < Status >, Ġwork : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Resource ( scope , Ġstatus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠViewModel Flow < Resource < T >> . load With Status ( ĊĠĠĠĠĠĠĠ Ġstatus : ĠMutable Shared Flow < Status >, ĊĠĠĠĠĠĠĠ Ġwork : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Resource With Status ( scope , Ġstatus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠViewModel Flow < Resource < T >> . load In Idle ( work : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value OrNull . isLoading ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġload Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠViewModel Flow < T >. load In Idle ( status : ĠViewModel Flow < Status >, Ġwork : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status . value OrNull . isLoading ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġload ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġload In Idle ( work : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus . load In Idle ( work ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠViewModel Flow < Resource < T >> . load De bounce ( delay Millis : ĠLong , Ġwork : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue OrNull ?. on Loading Ġ{ cancel , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( delay Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠViewModel Flow < T >. load De bounce ( delay Millis : ĠLong , Ġstatus : ĠViewModel Flow < Status >, Ġwork : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus . value OrNull ?. on Loading Ġ{ cancel , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( delay Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . work () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġload De bounce ( delay Millis : ĠLong , Ġwork : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus . load De bounce ( delay Millis , Ġwork ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠFlow < T >. to Data ( status : ĠMutable Shared Flow < Status >? Ġ= Ġnull ): ĠViewModel Flow < T > Ġ= Ġto Data ( this @ Base ViewModel , Ġscope , Ġstatus ) ĊĊĠĠĠ Ġfun Ġ< T > ĠFlow < T >. to Resource (): ĠViewModel Flow < Resource < T >> Ġ= Ġto Resource ( this @ Base ViewModel , Ġscope ) ĊĊĠĠĠ Ġfun Ġ< T > ĠFlow < T >. to Status (): ĠViewModel Flow < Status > Ġ= Ġto Status ( this @ Base ViewModel , Ġscope ) ĊĊĠĠĠ Ġ@ Opt In ( Experimental Type Inference :: class ) ĊĠĠĠ Ġinline Ġfun Ġ< T , ĠU > ĠViewModel Flow < T >. with Source ( ĊĠĠĠĠĠĠĠ Ġsource : ĠFlow < U >, ĊĠĠĠĠĠĠĠ Ġ@ Builder Inference Ġcross inline Ġtransform : Ġsuspend ĠFlow Collector < T >. ( value : ĠU ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠViewModel Flow < T > Ġ= ĠViewModel Flow ( this @ Base ViewModel , Ġwith Source ( scope , Ġsource , Ġtransform )) ĊĊĠĠĠ Ġfun Ġ< T > ĠViewModel Flow < T >. with Source ( ĊĠĠĠĠĠĠĠ Ġsource : ĠFlow < T > ĊĠĠĠ Ġ): ĠViewModel Flow < T > Ġ= ĠViewModel Flow ( this @ Base ViewModel , Ġwith Source ( scope , Ġsource )) ĊĊĠĠĠ Ġfun Ġ< T , ĠR > ĠFlow < T >. map In Idle ( transform Data : Ġsuspend Ġ( value : ĠT ) Ġ-> ĠR ): ĠFlow < R > Ġ= Ġmap In Idle ( transform Data ) ĊĊĠĠĠ Ġfun Ġ< T , ĠR > ĠFlow < T >. map Cancel Running ( transform Data : Ġsuspend Ġ( value : ĠT ) Ġ-> ĠR ): ĠFlow < R > Ġ= Ġmap Cancel Running ( scope , Ġtransform Data ) ĊĊĠĠĠ Ġ@ Opt In ( Experimental Type Inference :: class ) ĊĠĠĠ Ġfun Ġ< T , ĠR > ĠFlow < T >. transform In Idle (@ Builder Inference Ġtransform Data : Ġsuspend ĠFlow Collector < R >. ( value : ĠT ) Ġ-> ĠUnit ): ĠFlow < R > Ġ= Ġtransform In Idle ( scope , Ġtransform Data ) ĊĊĠĠĠ Ġ@ Opt In ( Experimental Type Inference :: class ) ĊĠĠĠ Ġfun Ġ< T , ĠR > ĠFlow < T >. transform Cancel Running (@ Builder Inference Ġtransform Data : Ġsuspend ĠFlow Collector < R >. ( value : ĠT ) Ġ-> ĠUnit ): ĠFlow < R > Ġ= Ġtransform Cancel Running ( scope , Ġtransform Data ) ĊĊĠĠĠ Ġfun Ġ< T > ĠFlow < T >. collect On ViewModel ( action : Ġsuspend Ġ( value : ĠT ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect ( action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Simple Arch Internal ĊĠĠĠ Ġfun Ġon Compose () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isInitialized . get AndSet ( true )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Dee plink () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ init Flow . call () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Initialized () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Simple Arch Internal (" used Ġon ĠIOS Ġbase Ġcode . Ġdon 't Ġuse Ġthese Ġcode ") ĊĠĠĠ Ġval Ġinitialized : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġis Initialized . value ĊĠĠĠ Ġ@ Simple Arch Internal (" used Ġon ĠIOS Ġbase Ġcode . Ġdon 't Ġuse Ġthese Ġcode ") ĊĠĠĠ Ġval Ġchange Count Ġ= ĠviewModel Flow ( 0 ) ĊĊĠĠĠ Ġ@ Simple Arch Internal (" used Ġon ĠIOS Ġbase Ġcode . Ġdon 't Ġuse Ġthese Ġcode ") ĊĠĠĠ Ġval Ġis W atched : ĠAtomic Reference < Boolean > Ġ= Ġatomic ( false ) ĊĊĠĠĠ Ġ@ Simple Arch Internal (" used Ġon ĠIOS Ġbase Ġcode . Ġdon 't Ġuse Ġthese Ġcode ") ĊĠĠĠ Ġfun Ġwatch Changes ( action : Ġ( Any ?) Ġ-> ĠUnit ): ĠViewModel Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġ// each Ġscreen Ġis Ġcreated Ġwhenever Ġscreen Ġis Ġchanged . Ġeven ĠviewModel Ġalready Ġexists . ĊĠĠĠĠĠĠĠ Ġ// so , Ġcoroutine Scope Ġshould Ġfollow ĠScreen 's Ġlifecycle ĊĠĠĠĠĠĠĠ Ġ// so , Ġon Ap pear , Ġcreate Ġscope . ĊĠĠĠĠĠĠĠ Ġ// on Dis appear , Ġclose Ġthe Ġscope . ĊĠĠĠĠĠĠĠ Ġval Ġscreen Scope Ġ= ĠViewModel Scope () ĊĠĠĠĠĠĠĠ Ġscreen Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Count . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġscreen Scope ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Simple Arch Internal (" used Ġon ĠIOS Ġbase Ġcode . Ġdon 't Ġuse Ġthese Ġcode ") ĊĠĠĠ Ġval Ġflow Set Ġ= Ġatomic ( set Of < ViewModel Flow <* >> ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġas Ġthis Ġis Ġnot Ġrecognized Ġon Ġswift . Ġlet ĠBase ViewModel Ġto Ġrefer Ġthis . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Simple Arch Internal (" used Ġon ĠIOS Ġbase Ġcode . Ġdon 't Ġuse Ġthese Ġcode ") ĊĠĠĠ Ġval Ġios Ui Manager : ĠUi Manager Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" don 't Ġcall Ġthis ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠScreen Result ( val ĠresultCode : ĠInt , Ġval Ġdata : ĠAny ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ CODE _ OK Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ CODE _ CANCEL Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Ok Ġget () Ġ= ĠresultCode Ġ== ĠRESULT _ CODE _ OK ĊĠĠĠ Ġval Ġis Cancel Ġget () Ġ= ĠresultCode Ġ== ĠRESULT _ CODE _ CANCEL ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T > Ġdata Of (): ĠT Ġ= Ġdata Ġas ĠT ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġdata Of (@ Suppress (" UNUSED _ PARAMETER ") Ġtype : ĠK Class < T >): ĠT Ġ= Ġdata Ġas ĠT Ċ } Ċ Ċ data Ġclass ĠDee plink Navigation ( val Ġurl : ĠString , Ġval Ġresult Listener : ĠDee plink Result Listener ? Ġ= Ġnull ) Ċ Ċ interface ĠDee plink Result Listener Ġ{ ĊĠĠĠ Ġfun Ġon Dee plink Result ( result : ĠScreen Result ) Ċ }