package Ġcom . bq . arch _ example Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Restrict To Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . bq . arch _ example . domain . moves . Mov esModule Ċ import Ġcom . bq . arch _ example . domain . pokemon . Po ke Module Ċ import Ġcom . bq . arch _ example . network . Network Module Ċ import Ġcom . bq . arch _ example . ui . ViewModels Module Ċ import Ġmini . Dispatcher Ċ import Ġmini . Logger Interceptor Ċ import Ġmini . Mini Gen Ċ import Ġmini . Store Ċ import Ġmini . kode in . android . K ode in ViewModel Factory Ċ import Ġorg . kode in . di . K ode in Ċ import Ġorg . kode in . di . K ode in Aware Ċ import Ġorg . kode in . di . conf . Configurable K ode in Ċ import Ġorg . kode in . di . direct Ċ import Ġorg . kode in . di . generic . bind Ċ import Ġorg . kode in . di . generic . instance Ċ import Ġorg . kode in . di . generic . set Binding Ċ import Ġorg . kode in . di . generic . singleton Ċ import Ġjava . io . Closeable Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ private Ġvar Ġapp Instance : ĠApp Ġby ĠDeleg ates . notNull () Ċ val Ġapp : ĠApp Ġget () Ġ= Ġapp Instance Ċ private Ġval Ġdispatcher Ġ= ĠMini Gen . new Dispatcher () Ċ Ċ class ĠApp Ġ: ĠApplication (), ĠK ode in Aware Ġ{ ĊĠĠĠ Ġoverride Ġval Ġk ode in Ġ= ĠConfigur able K ode in ( mutable Ġ= Ġtrue ) ĊĊĠĠĠ Ġprivate Ġvar Ġtest Module : ĠK ode in . Module ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdispatcher : ĠDispatcher ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstores : ĠList < Store <* >> ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstore Subscriptions : ĠClose able ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Instance Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġdependency Ġinjection ĊĠĠĠĠĠĠĠ Ġinitialize Injection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinitialize Injection () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġeverything ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: store Subscriptions . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore Subscriptions . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this :: stores . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstores . forEach Ġ{ Ġit . close () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġk ode in . clear () ĊĊĠĠĠĠĠĠĠ Ġwith ( kode in ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst , Ġadd Ġall Ġdependencies ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Imports ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Module . create (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNetwork Module . create (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPo ke Module . create (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMov esModule . create (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Models Module . create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( test Module Ġ!= Ġnull ) Ġadd Import ( test Module !! , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstores Ġ= Ġk ode in . direct . instance < Set < Store <* >>> (). toList () ĊĠĠĠĠĠĠĠ Ġdispatcher Ġ= Ġk ode in . direct . instance () ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize ĠMini ĊĠĠĠĠĠĠĠ Ġstore Subscriptions Ġ= ĠMini Gen . subscribe ( dispatcher , Ġstores ) ĊĠĠĠĠĠĠĠ Ġstores . forEach Ġ{ Ġstore Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore . initialize () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdispatcher . add Interceptor ( Logger Interceptor ( stores , Ġ{ Ġtag , Ġmsg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Restrict To ( Restrict To . Scope . TESTS ) ĊĠĠĠ Ġfun Ġset Test Module ( init : ĠK ode in . Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Module Ġ= ĠK ode in . Module ( name Ġ= Ġ" test ", Ġallow Sil ent Override Ġ= Ġtrue , Ġinit Ġ= Ġinit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Restrict To ( Restrict To . Scope . TESTS ) ĊĠĠĠ Ġfun Ġclear Test Module () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Module Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠApp Module Ġ{ ĊĠĠĠ Ġfun Ġcreate () Ġ= ĠK ode in . Module (" app ") Ġ{ ĊĠĠĠĠĠĠĠ Ġbind < Application >() Ġwith Ġsingleton Ġ{ Ġapp Ġ} ĊĠĠĠĠĠĠĠ Ġbind < Dispatcher >() Ġwith Ġsingleton Ġ{ Ġdispatcher Ġ} ĊĠĠĠĠĠĠĠ Ġbind () Ġfrom Ġset Binding < Store <* >>() ĊĊĠĠĠĠĠĠĠ Ġbind < ViewModel Provider . Factory >() Ġwith Ġsingleton Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK ode in ViewModel Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk ode in . direct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġfun ĠConfigur able K ode in . add Imports ( allow Override : ĠBoolean , Ġvar arg Ġmodule Info : ĠK ode in . Module ) Ġ{ ĊĠĠĠ Ġmodule Info . forEach Ġ{ Ġadd Import ( it , Ġallow Override ) Ġ} Ċ }