/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 Ġ Ġz hou ha oo Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . zh ou ha oo . common . util Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġcom . zh ou ha oo . common . interfaces . AppConfig Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġz hou Ġon Ġ 1 8 / 1 / 2 5 . Ċ Ġ*/ Ċ class ĠManifest Parser Ġconstructor ( private Ġvar Ġcontext : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcommon Config Ġ= Ġ" Common Config " ĊĊĠĠĠ Ġfun Ġparse (): ĠList < AppConfig > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmodules Ġ= ĠArrayList < AppConfig >() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġapp Info Ġ= Ġcontext . package Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getApplication Info ( context . packageName , ĠPackage Manager . GET _ META _ DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠmetaData Ġ= Ġapp Info . metaData ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metaData Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData . keySet (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( common Config Ġ== ĠmetaData . get ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . add ( parse Config ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unable Ġto Ġfind Ġmetadata Ġto Ġparse ĠCommon Config ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmodules ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġparse Config ( className : ĠString ): ĠApp Config Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclazz : ĠClass < *> ? ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Ġ= ĠClass . forName ( className ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unable Ġto Ġfind ĠApp Config Ġimplementation ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġconfig : ĠAny ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= Ġclazz . newInstance () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInstanti ation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ ĠRuntimeException (" Unable Ġto Ġinstantiate ĠApp Config Ġimplementation Ġfor Ġ$ clazz ", Ġe ); ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ ĠRuntimeException (" Unable Ġto Ġinstantiate ĠApp Config Ġimplementation Ġfor Ġ$ clazz ", Ġe ); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( config Ġ! is ĠApp Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Expected Ġinstanceof ĠApp Config , Ġbut Ġfound : Ġ$ config ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconfig ĊĠĠĠ Ġ} Ċ }