package Ġcom . ro uset ime . android _ startup Ċ Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroidx . core . os . Trace Compat Ċ import Ġcom . ro uset ime . android _ startup . exec ption . Startup Exception Ċ import Ġcom . ro uset ime . android _ startup . extensions . get Unique Key Ċ import Ġcom . ro uset ime . android _ startup . manager . Startup CacheManager Ċ import Ġcom . ro uset ime . android _ startup . model . Startup Provider Store Ċ import Ġcom . ro uset ime . android _ startup . provider . Startup Provider Config Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġid is fk j Ġon Ġ 2 0 2 0 / 8 / 7 . Ċ Ġ* ĠEmail : Ġid is fk j @ gmail . com . Ċ Ġ*/ Ċ class ĠStartup Initializer Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġby Ġlazy Ġ{ ĠStartup Initializer () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġdiscover And Initialize ( context : ĠContext , Ġprovider Name : ĠString ): ĠStartup Provider Store Ġ{ ĊĊĠĠĠĠĠĠĠ ĠTrace Compat . begin Section ( Startup Initializer :: class . java . simple Name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Android Startup <* >>() ĊĠĠĠĠĠĠĠ Ġval Ġinitialize Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġinitialized Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġvar Ġconfig : ĠStartup Provider Config ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠComponent Name ( context . packageName , Ġprovider Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Info Ġ= Ġcontext . package Manager . get Provider Info ( provider , ĠPackage Manager . GET _ META _ DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstartup Ġ= Ġcontext . getString ( R . string . android _ startup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Config Ġ= Ġcontext . getString ( R . string . android _ startup _ provider _ config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Info . metaData ?. let Ġ{ ĠmetaData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData . keySet (). forEach Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠmetaData [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= ĠClass . forName ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( startup Ġ== Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Android Startup :: class . java . isAssignableFrom ( clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Initialize (( clazz . getDeclared Constructor (). newInstance () Ġas ĠAndroid Startup < *> ), Ġresult , Ġinitialize , Ġinitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( provider Config Ġ== Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Startup Provider Config :: class . java . isAssignableFrom ( clazz )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= Ġclazz . getDeclared Constructor (). newInstance () Ġas ? ĠStartup Provider Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave Ġinitialized Ġconfig ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStartup CacheManager . instance . save Config ( config ?. getConfig ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStartup Exception ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTrace Compat . end Section () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠStartup Provider Store ( result , Ġconfig ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Initialize ( ĊĠĠĠĠĠĠĠ Ġstartup : ĠAndroid Startup <* >, ĊĠĠĠĠĠĠĠ Ġresult : ĠMutable List < Android Startup <* >>, ĊĠĠĠĠĠĠĠ Ġinitialize : ĠMutable List < String >, ĊĠĠĠĠĠĠĠ Ġinitialized : ĠMutable List < String > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunique Key Ġ= Ġstartup :: class . java . get Unique Key () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initialize . contains ( unique Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" have Ġcircle Ġdependencies .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! initialized . contains ( unique Key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize . add ( unique Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( startup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstartup . dependencies ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Initialize ( it . getDeclared Constructor (). newInstance () Ġas ĠAndroid Startup <* >, Ġresult , Ġinitialize , Ġinitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize . remove ( unique Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialized . add ( unique Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠStartup Exception ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }