/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 . ĠL ou is ĠC ogn ault ĠA y ev a ĠDer man Ċ Ġ* Ċ Ġ* Ġ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 Ġsplit ties . init Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Application Ċ import Ġandroid . app . Service Ċ import Ġandroid . app . backup . Backup Agent Ċ import Ġandroid . content . Content Provider Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . view . Context Theme Wrapper Ċ Ċ /** Ċ Ġ* Ġ** WARNING ! ** ĠPlease , Ġdo Ġnot Ġuse Ġthis Ġcontext Ġif Ġyou Ġrely Ġon Ġa Ġscoped Ġ[ Context ] Ġsuch Ġas Ġaccessing Ċ Ġ* Ġthe med Ġresources Ġfrom Ġan Ġ[ Activity ] Ġor Ġa Ġ[ Context Theme Wrapper ]. Ċ Ġ* Ċ Ġ* ĠThis Ġ[ Context ] Ġwhich Ġby Ġdefault Ġis Ġan Ġinstance Ġof Ġyour Ġ[ Application ] Ġclass Ġis Ġinitialized Ġbefore Ċ Ġ* Ġ[ Application . onCreate ] Ġis Ġcalled Ġ( but Ġafter Ġyour Ġ[ Application ]' s Ġconstructor Ġhas Ġrun ) Ġthanks Ġto Ċ Ġ* Ġ[ App Ctx Init Provider ] Ġwhich Ġis Ġinitialized Ġby ĠAndroid Ġas Ġearly Ġas Ġpossible Ġwhen Ġyour Ġapp 's Ċ Ġ* Ġprocess Ġis Ġcreated . Ċ Ġ*/ Ċ val Ġapp Ctx : ĠContext Ġget () Ġ= Ġinternal Ctx Ġ?: Ġinit AndGet App Ctx With Reflection () Ċ Ċ @ Suppress Lint (" Static Field Leak ") Ċ private Ġvar Ġinternal Ctx : ĠContext ? Ġ= Ġnull Ċ Ċ /** Ċ Ġ* Ġ** Usage Ġof Ġthis Ġmethod Ġis Ġdis cour aged ** Ġbecause Ġthe Ġ[ app Ctx ] Ġshould Ġbe Ġautomatically Ġinitialized Ċ Ġ* Ġand Ġsetting Ġit Ġto Ġa Ġcustom ĠContext Ġmay Ġcause Ġun predict able Ġbehavior Ġin Ġsome Ġparts Ġof Ġthe Ġapp , Ċ Ġ* Ġespecially Ġif Ġsome Ġlibraries Ġrely Ġon Ġthe Ġtrue Ġapplication Context . Ċ Ġ* Ċ Ġ* Ġ** However **, Ġif Ġyour Ġapp Ġneeds Ġto Ġuse Ġ[ app Ctx ] Ġoutside Ġof Ġthe Ġdefault Ġprocess Ġand Ġthe Ġreflection Ċ Ġ* Ġmethod Ġthrows Ġan Ġexception Ġon Ġsome Ġdevices , Ġyou Ġmay Ġfind Ġuseful Ġto Ġcall Ġthis Ġmethod Ġfrom Ġyour Ċ Ġ* Ġ[ Application . onCreate ]. ĠThis Ġmethod Ġmay Ġalso Ġbe Ġuseful Ġif Ġyou Ġneed Ġchange Ġthe Ġ[ app Ctx ] Ġvalue Ġwith Ċ Ġ* Ġone Ġfrom Ġa Ġconfiguration Ġcontext Ġwith Ġan Ġover rid en Ġlocale Ġfor Ġexample . Ċ Ġ* Ċ Ġ* Ġ** If Ġyou Ġever Ġuse Ġthis Ġmethod Ġbecause Ġof Ġnon - default Ġprocess , Ġand Ġthrowing Ġreflection Ġinit , Ċ Ġ* Ġbe Ġsure Ġto Ġcall Ġthis Ġmethod Ġbefore Ġyou Ġtry Ġto Ġaccess Ġ[ app Ctx ] Ġor Ġ[ direct Boot Ctx ]. ** Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthe Ġinput Ġ[ Context ] Ġis Ġchecked Ġfor Ġmemory Ġleak Ġability , Ġand Ġwill Ġthrow Ġif Ġyou Ġtry Ġto Ċ Ġ* Ġpass Ġan Ġ[ Activity ], Ġa Ġ[ Service ], Ġa Ġ[ Backup Agent ], Ġa Ġ[ Context ] Ġfrom Ġanother Ġapp Ġor Ċ Ġ* Ġa Ġ[ Context Wrapper ] Ġbased Ġon Ġthese Ġclasses . Ċ Ġ* Ċ Ġ* Ġ@ see Ġapp Ctx Ċ Ġ* Ġ@ see Ġcan Leak Memory Ċ Ġ* Ġ@ see ĠContext . create Configuration Context Ċ Ġ*/ Ċ fun ĠContext . inject As App Ctx () Ġ{ ĊĠĠĠ Ġrequire (! can Leak Memory ()) Ġ{ Ġ" The Ġpassed ĠContext ($ this ) Ġwould Ġleak Ġmemory !" Ġ} ĊĠĠĠ Ġinternal Ctx Ġ= Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġmethod Ġwill Ġreturn Ġtrue Ġon Ġ[ Context ] Ġimplementations Ġknown Ġto Ġbe Ġable Ġto Ġleak Ġmemory . Ċ Ġ* ĠThis Ġincludes Ġ[ Activity ], Ġ[ Service ], Ġthe Ġless er Ġused Ġand Ġless er Ġknown Ġ[ Backup Agent ], Ġas Ġwell Ġas Ċ Ġ* Ġany Ġ[ Context Wrapper ] Ġhaving Ġone Ġof Ġthese Ġas Ġits Ġbase Ġcontext . Ċ Ġ*/ Ċ fun ĠContext . can Leak Memory (): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠApplication Ġ-> Ġfalse ĊĠĠĠ Ġis ĠActivity , Ġis ĠService , Ġis ĠBackup Agent Ġ-> Ġtrue ĊĠĠĠ Ġis ĠContext Wrapper Ġ-> Ġif Ġ( base Context Ġ=== Ġthis ) Ġtrue Ġelse Ġbase Context . can Leak Memory () ĊĠĠĠ Ġelse Ġ-> Ġapplication Context Ġ=== Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġmethods Ġis Ġonly Ġrun Ġif Ġ[ app Ctx ] Ġis Ġaccessed Ġwhile Ġ[ App Ctx Init Provider ] Ġhasn 't Ġbeen Ċ Ġ* Ġinitialized . ĠThis Ġmay Ġhappen Ġin Ġcase Ġyou 're Ġaccessing Ġit Ġoutside Ġthe Ġdefault Ġprocess , Ġor Ġin Ġcase Ċ Ġ* Ġyou Ġare Ġaccessing Ġit Ġin Ġa Ġ[ Content Provider ] Ġwith Ġa Ġhigher Ġpriority Ġthan Ġ[ App Ctx Init Provider ] Ċ Ġ* Ġ( 9 0 0 Ġat Ġthe Ġtime Ġof Ġwriting Ġthis Ġdoc ). Ċ Ġ* Ċ Ġ* ĠIf Ġyou Ġdon 't Ġwant Ġthis Ġcode Ġthat Ġuses Ġreflection Ġto Ġever Ġrun , Ġsee Ġ[ inject As App Ctx ]. Ċ Ġ*/ Ċ @ Suppress Lint (" Private Api ") Ċ private Ġfun Ġinit AndGet App Ctx With Reflection (): ĠContext Ġ{ ĊĠĠĠ Ġ// ĠF allback , Ġshould Ġonly Ġrun Ġonce Ġper Ġnon Ġdefault Ġprocess . ĊĠĠĠ Ġval Ġactivity Thread Ġ= ĠClass . forName (" android . app . ActivityThread ") ĊĠĠĠ Ġval Ġctx Ġ= Ġactivity Thread . getDeclared Method (" current Application "). invoke ( null ) Ġas ĠContext ĊĠĠĠ Ġinternal Ctx Ġ= Ġctx ĊĠĠĠ Ġreturn Ġctx Ċ } Ċ