package Ġcom . z ulu . android Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠNavigation Manager Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġactivity : ĠAppCompatActivity , ĊĠĠĠ Ġ@ Id Res Ġprivate Ġval Ġplaceholder Id : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġinitial Screen Name : ĠString Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġfragment Manager : ĠFragment Manager ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġactivity . support FragmentManager ĊĊĠĠĠ Ġprivate Ġval Ġstate Handler : ĠState Handler ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresolve Screen State Handler () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnavigation Stack : ĠArrayList < Navigation State > ĊĊĠĠĠ Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Stack Ġ= Ġit . get Parcelable ArrayList ( NAV IG ATION _ STACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Handler . initialize ( activity , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Stack Ġ= Ġarray ListOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Handler . initialize ( activity , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠNavigation Data ( initial Screen Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠDefault Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġdata . to Bundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Stack . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Stack . add ( Navigation State ( data . id , Ġdata . name )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( placeholder Id , Ġfragment , Ġdata . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Save InstanceState ( state : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . put Parcelable ArrayList ( NAV IG ATION _ STACK , Ġnavigation Stack ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Navigation State Ġ= Ġnavigation Stack . last () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġfragment Manager . find Fragment By Tag ( current Navigation State . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Fragment Ġis ĠDefault Fragment Ġ&& Ġcurrent Fragment . on Back Pressed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( navigation Stack . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgo Back () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate ( screen Name : ĠString , Ġmode : ĠNavigation Mode Ġ= ĠNavigation Mode . DEFAULT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigate ( screen Name , Ġnull , Ġmode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate ( screen Name : ĠString , Ġparams : ĠAny ?, Ġmode : ĠNavigation Mode Ġ= ĠNavigation Mode . DEFAULT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Mode . REPLACE Ġ-> Ġnavigate Replace ( screen Name , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Mode . CLEAR _ TOP Ġ-> Ġnavigate Clear Top ( screen Name , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Mode . CLEAR _ STACK Ġ-> Ġnavigate Clear Stack ( screen Name , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnavigate Default ( screen Name , Ġparams ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate Default ( screen Name : ĠString , Ġparams : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠNavigation Data ( screen Name , Ġparams ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Navigation State Ġ= Ġnavigation Stack . last () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġfragment Manager . find Fragment By Tag ( current Navigation State . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Navigation State Ġ= ĠNavigation State ( data . id , Ġdata . name ) ĊĠĠĠĠĠĠĠ Ġval Ġnext Fragment Ġ= ĠDefault Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġdata . to Bundle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnavigation Stack . add ( next Navigation State ) ĊĊĠĠĠĠĠĠĠ Ġfragment Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. detach ( current Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( placeholder Id , Ġnext Fragment , Ġdata . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate Replace ( screen Name : ĠString , Ġparams : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠNavigation Data ( screen Name , Ġparams ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Navigation State Ġ= Ġnavigation Stack . last () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġfragment Manager . find Fragment By Tag ( current Navigation State . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠ Ġnavigation Stack . remove At ( navigation Stack . last Index ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Navigation State Ġ= ĠNavigation State ( data . id , Ġdata . name ) ĊĠĠĠĠĠĠĠ Ġval Ġnext Fragment Ġ= ĠDefault Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġdata . to Bundle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnavigation Stack . add ( next Navigation State ) ĊĊĠĠĠĠĠĠĠ Ġfragment Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove ( current Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( placeholder Id , Ġnext Fragment , Ġdata . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate Clear Top ( screen Name : ĠString , Ġparams : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġnavigation Stack . indexOf Last Ġ{ Ġit . name Ġ== Ġscreen Name Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠNavigation Data ( screen Name , Ġparams ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= Ġfragment Manager . beginTransaction () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackward Count Ġ= Ġnavigation Stack . size Ġ- Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. backward Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Navigation State Ġ= Ġnavigation Stack . remove At ( navigation Stack . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġfragment Manager . find Fragment By Tag ( current Navigation State . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . remove ( current Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Navigation State Ġ= ĠNavigation State ( data . id , Ġdata . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Fragment Ġ= ĠDefault Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġdata . to Bundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Stack . add ( next Navigation State ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . replace ( placeholder Id , Ġnext Fragment , Ġdata . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . commit () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate Default ( screen Name , Ġparams ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate Clear Stack ( screen Name : ĠString , Ġparams : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠNavigation Data ( screen Name , Ġparams ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= Ġfragment Manager . beginTransaction () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġnavigation Stack . last Index Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Navigation State Ġ= Ġnavigation Stack [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġfragment Manager . find Fragment By Tag ( current Navigation State . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . detach ( current Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnavigation Stack . clear () ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Navigation State Ġ= ĠNavigation State ( data . id , Ġdata . name ) ĊĠĠĠĠĠĠĠ Ġval Ġnext Fragment Ġ= ĠDefault Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġdata . to Bundle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnavigation Stack . add ( next Navigation State ) ĊĊĠĠĠĠĠĠĠ Ġfragment Transaction . replace ( placeholder Id , Ġnext Fragment , Ġdata . id ) ĊĠĠĠĠĠĠĠ Ġfragment Transaction . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo Back ( params : ĠAny ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgo Back ( null , Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgo Back ( screen Name : ĠString ?, Ġparams : ĠAny ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( screen Name Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Stack . drop Last ( 1 ). indexOf Last Ġ{ Ġit . name Ġ== Ġscreen Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Stack . last Index Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( screen Name Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" No Ġscreen Ġfound Ġin Ġnavigation Ġstack : Ġ$ screen Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Navigation Ġstack Ġis Ġempty ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Screen Result ( params ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= Ġfragment Manager . beginTransaction () ĊĊĠĠĠĠĠĠĠ Ġval Ġbackward Count Ġ= Ġnavigation Stack . last Index Ġ- Ġindex ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. backward Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Navigation State Ġ= Ġnavigation Stack . remove At ( navigation Stack . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Fragment Ġ= Ġfragment Manager . find Fragment By Tag ( current Navigation State . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Transaction . remove ( current Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnext Navigation State Ġ= Ġnavigation Stack . last () ĊĠĠĠĠĠĠĠ Ġval Ġnext Fragment Ġ= Ġfragment Manager . find Fragment By Tag ( next Navigation State . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Invalid Ġnavigation Ġstate ") ĊĊĠĠĠĠĠĠĠ Ġfragment Transaction . attach ( next Fragment ) ĊĠĠĠĠĠĠĠ Ġfragment Transaction . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġshould Handle Screen Result (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate Handler . contains ( SCREEN _ RESULT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset Screen Result ( params : ĠAny ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Handler . save ( SCREEN _ RESULT , Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġget Screen Result (): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate Handler . restore ( SCREEN _ RESULT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġcan Go Back (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnavigation Stack . size Ġ> Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNAV IG ATION _ STACK Ġ= Ġ" navigation - stack " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSCREEN _ RESULT Ġ= Ġ" screen - result " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġobject Converter : ĠObject Converter ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstate Handler : ĠState Handler ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġscreen Factories : ĠHashMap < String , ĠScreen Factory > Ġ= Ġhash Map Of () ĊĊĠĠĠĠĠĠĠ Ġfun Ġregister Object Converter ( object Converter : ĠObject Converter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . object Converter Ġ= Ġobject Converter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresolve Object Converter (): ĠObject Converter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( object Converter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠClass . forName (" com . z ulu . android . Default Object Converter ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Converter Ġ= Ġtype . newInstance () Ġas ĠObject Converter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Converter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġregister Screen State Handler ( state Handler : ĠState Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Handler Ġ= Ġstate Handler ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresolve Screen State Handler (): ĠState Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Handler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠClass . forName (" com . z ulu . android . Default State Handler ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Handler Ġ= Ġtype . newInstance () Ġas ĠState Handler ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Handler ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġregister Screen ( factory : ĠScreen Factory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Factories [ factory . name ] Ġ= Ġfactory ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠScreen Factory > Ġregister Screen ( type : ĠK Class < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Screen ( type . java . newInstance ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠScreen Factory > Ġregister Screen () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Screen ( T :: class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġresolve Screen ( screen Context : ĠScreen Context ): ĠScreen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Factories [ screen Context . name ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . create ( screen Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }