package Ġcom . y ima . base Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Application Ċ import Ġandroid . app . Instrumentation Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Persist able Bundle Ċ import Ġandroid . support . multi dex . Multi Dex Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . WindowManager Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . lang . ref . Weak Reference ĊĊ Ċ /** Ċ Ġ* Ġcom . y ima . base . Base App Ċ Ġ* ĠCreated Ġby Ġy ima Ġon Ġ 2 0 1 7 / 6 / 1 3 . Ċ Ġ*/ Ċ abstract Ġclass ĠBase App Ġ: ĠApplication () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġact Manager Ġ= ĠBase Act Manager () ĊĠĠĠ Ġvar ĠSCREEN _ WIDTH Ġ= Ġ- 1 ĊĠĠĠ Ġvar ĠSCREEN _ HEIGHT Ġ= Ġ- 1 ĊĠĠĠ Ġvar ĠDIM EN _ RATE Ġ= Ġ- 1 . 0 F ĊĠĠĠ Ġvar ĠDIM EN _ DPI Ġ= Ġ- 1 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Tim ber ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . plant ( Tim ber . Debug Tree ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġ åºĶè¯¥ æľīä¸Ģä¸ª release çīĪ åıª ä¿ĿåŃĺ crash Log çļĦ tree ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . plant ( Tim ber . Debug Tree ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġinstance : ĠBase App ĊĠĠĠĠĠĠĠ Ġfun Ġget App () Ġ= Ġinstance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġavoid Kotlin Null Bundle Error () ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġget Screen Size () ĊĠĠĠĠĠĠĠ Ġinit App () ĊĠĠĠĠĠĠĠ Ġ// åľ¨ åŃĲ çº¿ç¨ĭ ä¸Ń åĪĿå§ĭåĮĸ ĊĠĠĠĠĠĠĠ ĠObservable . just (" "). subscribe On ( Schedulers . io ()). subscribe Ġ{ Ġinit App Async () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġinit App () ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġinit App Async () ĊĊĠĠĠ Ġfun Ġget Screen Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwindow Manager Ġ= Ġthis . getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ĊĠĠĠĠĠĠĠ Ġval Ġdm Ġ= ĠDisplay Metrics () ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġwindow Manager . default Display ĊĠĠĠĠĠĠĠ Ġdisplay . get Metrics ( dm ) ĊĠĠĠĠĠĠĠ ĠDIM EN _ RATE Ġ= Ġdm . density Ġ/ Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ ĠDIM EN _ DPI Ġ= Ġdm . density D pi ĊĠĠĠĠĠĠĠ ĠSCREEN _ WIDTH Ġ= Ġdm . width Pixels ĊĠĠĠĠĠĠĠ ĠSCREEN _ HEIGHT Ġ= Ġdm . height Pixels ĊĠĠĠĠĠĠĠ Ġif Ġ( SCREEN _ WIDTH Ġ> ĠSCREEN _ HEIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠSCREEN _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSCREEN _ HEIGHT Ġ= ĠSCREEN _ WIDTH ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSCREEN _ WIDTH Ġ= Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġattach Base Context ( base : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . attach Base Context ( base ) ĊĠĠĠĠĠĠĠ ĠMulti Dex . install ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Activity ( act : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġact Manager . add Activity ( act ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Activity ( act : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġact Manager . remove Activity ( act ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Top Activity (): ĠActivity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġact Manager . get Top Activity () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġact Manager . clear Activity () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexit App () Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Activity () ĊĠĠĠĠĠĠĠ Ġandroid . os . Process . kill Process ( android . os . Process . my Pid ()) ĊĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġavoid Kotlin Null Bundle Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcl z Ġ= ĠClass . forName (" android . app . ActivityThread ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm td Ġ= Ġcl z . getDeclared Method (" current ActivityThread ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġm td . invoke ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġobj . java Class . getDeclared Field (" m Instrumentation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . set ( obj , ĠInstrument ation Base ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġcom . y ima . base . Instrumentation Base Ċ Ġ* Ġadd Ġempty Ġbundle Ġto Ġevery Ġactivity Ċ Ġ* Ġmake Ġsure Ġno Ġkotlin Ġnon - null Ġargument Ġerror Ċ Ġ* ĠCreated Ġby Ġy ima Ġon Ġ 2 0 1 7 / 1 0 / 1 6 . Ċ Ġ*/ Ċ class ĠInstrument ation Base Ġ: ĠInstrument ation () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcall Activity On Create ( activity : ĠActivity ?, Ġic icle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbundle Ġ= Ġic icle ĊĠĠĠĠĠĠĠ Ġif Ġ( bundle Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Ġ= ĠBundle . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . call Activity On Create ( activity , Ġbundle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcall Activity On Create ( activity : ĠActivity ?, Ġic icle : ĠBundle ?, Ġpersistent State : ĠPers ist able Bundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbundle Ġ= Ġic icle ĊĠĠĠĠĠĠĠ Ġif Ġ( bundle Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Ġ= ĠBundle . EMPTY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . call Activity On Create ( activity , Ġbundle , Ġpersistent State ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠBase Act Manager Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontainer Ġ= ĠSparse Array < Weak Reference < Activity >>() ĊĠĠĠ Ġprivate Ġvar Ġtop Act : ĠWeak Reference < Activity >? Ġ= Ġnull ĊĊĊĠĠĠ Ġfun Ġadd Activity ( act : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( container . get ( act . hashCode ()) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . append ( act . hashCode (), ĠWeak Reference ( act )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Act Ġ= ĠWeak Reference ( act ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Activity ( act : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Act Ġ= Ġcontainer . get ( act . hashCode ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( tmp Act Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . remove ( act . hashCode ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Act Ġ= Ġif Ġ( container . size () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . get ( container . key At ( container . size () Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Top Activity (): ĠActivity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( container . size () Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtop Act ?. get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġcontainer . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcontainer . key At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweak Ġ= Ġcontainer . get ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( weak ?. get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweak . get () !!. finish Affinity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Act Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }