package Ġjp . programming life . lib pl jp . android Ċ Ċ import Ġandroid . util . Log Ċ import Ġjp . programming life . lib pl jp . android . Logger . LogLevel Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . util . HashMap Ċ import Ġjava . util . Identity HashMap Ċ import Ġjava . util . Locale Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ Ċ /** Ċ Ġ* Ġ@ property Ġlogger Level Ġãģĵãģ® [ Logger ] ãģĮ åĩºåĬĽ ãģ§ãģįãĤĭ æľĢ ä½İ ãģ® [ LogLevel ] ãĢĤ Ċ Ġ*/ Ċ class ĠLogger Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Level : ĠLogLevel , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġapp ender : ĠApp ender Ċ ) Ġ{ Ċ Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* Ġãĥ Ń ãĤ¬ ãĥ¼ãģ® ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ ãĤĴ ä½ľ ãĤĭ ãĢĤ åħĪ ãģ« åĩºåĬĽ ãĥ¬ ãĥĻ ãĥ«ãģ® è¨Ńå®ļ ãĤĴè¡Į ãģ£ãģ¦ ãģĬ ãģı ãģĵãģ¨ ãĢĤ Ċ // ĠĠĠĠ Ġ* Ġ è¨Ńå®ļ ãģĮ åıĤçħ§ ãģķãĤĮãĤĭ ãģ® ãģ¯ ãĥŃ ãĤ¬ ãĥ¼ãģ® ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ ä½ľæĪĲ æĻĤ ãģłãģĳ ãģª ãģ®ãģ§ æ³¨æĦı ãĢĤ Ċ // ĠĠĠĠ Ġ* Ġ@ deprecated Ġstatic ãĥ¡ ãĤ½ãĥĥãĥī ãĤĴä½¿ ãģĨ ãĢĤ Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġ@ Deprecated Ċ // ĠĠĠ Ġpublic ĠAndroid Logger (@ NonNull ĠClass <?> Ġcls ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġlog Level Ġ= ĠLogger . Companion . get LogLevel ( cls . getName ()); Ċ // ĠĠĠĠĠĠĠ Ġtag Ġ= Ġget Tag ( cls ); Ċ // ĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠ Ġ/** Ċ // ĠĠĠĠ Ġ* Ġãĥ Ń ãĤ¬ ãĥ¼ãģ® ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ ãĤĴ ä½ľ ãĤĭ ãĢĤ åħĪ ãģ« åĩºåĬĽ ãĥ¬ ãĥĻ ãĥ«ãģ® è¨Ńå®ļ ãĤĴè¡Į ãģ£ãģ¦ ãģĬ ãģı ãģĵãģ¨ ãĢĤ Ċ // ĠĠĠĠ Ġ* Ġ è¨Ńå®ļ ãģĮ åıĤçħ§ ãģķãĤĮãĤĭ ãģ® ãģ¯ ãĥŃ ãĤ¬ ãĥ¼ãģ® ãĤ¤ãĥ³ ãĤ¹ãĤ¿ ãĥ³ãĤ¹ ä½ľæĪĲ æĻĤ ãģłãģĳ ãģª ãģ®ãģ§ æ³¨æĦı ãĢĤ Ċ // ĠĠĠĠ Ġ* Ġ@ param Ġprefix Ġ çĦ¡ è¦ĸ ãģķãĤĮãĤĭ Ċ // ĠĠĠĠ Ġ*/ Ċ // ĠĠĠ Ġ@ Deprecated Ċ // ĠĠĠ Ġpublic ĠAndroid Logger (@ NonNull ĠClass <?> Ġcls , Ġ@ Nullable ĠString Ġprefix ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġthis ( cls ); Ċ // ĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġw tf ( message : ĠString , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp ender . w tf (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġe ( message : ĠString , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ<= ĠLogLevel . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . e (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġw ( message : ĠString , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ<= ĠLogLevel . WARN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . w (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġi ( message : ĠString , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ<= ĠLogLevel . INFO ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . i (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġd () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ<= ĠLogLevel . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . d (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġd ( message : ĠString , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ<= ĠLogLevel . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . d (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġd ( t : ĠThrowable , Ġmessage : ĠString ? Ġ= Ġnull , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ<= ĠLogLevel . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . d ( t , Ġ"[" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġv () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ=== ĠLogLevel . VERBOSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . v (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġv ( message : ĠString ?, Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ=== ĠLogLevel . VERBOSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . v (" [" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġv ( t : ĠThrowable , Ġmessage : ĠString ? Ġ= Ġnull , Ġvar arg Ġargs : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( logger Level Ġ=== ĠLogLevel . VERBOSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . v ( t , Ġ"[" Ġ+ Ġget MethodName () Ġ+ Ġ"] Ġ" Ġ+ Ġformat ( message , Ġ* args )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġformat ( message : ĠString ?, Ġvar arg Ġargs : ĠAny ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// val Ġmessage : ĠString Ġ= Ġmessage Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage ?. let Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m . isNotEmpty () Ġ&& Ġargs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( Locale . getDefault (), Ġm , Ġ* args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġm ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget MethodName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Ġ= ĠThread . currentThread () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Trace Ġ= Ġcur . stack Trace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġstack Trace [ 4 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠmethodName Ġ= Ġelement . methodName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcls Ġ= ĠClass . forName ( element . className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cls . is Anonymous Class ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cls . enc lo sing Constructor Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmethodName Ġ= Ġ"< init >: $ methodName " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġem Ġ= Ġcls . enc lo sing Method ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( em Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmethodName Ġ= Ġem . name Ġ+ Ġ":" Ġ+ ĠmethodName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠmethodName Ġ+ Ġ" Ġ(" Ġ+ Ġcur . name Ġ+ Ġ")" ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinstances Ġ= ĠIdentity HashMap < Class <* >, ĠLogger >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlevel Config Ġ= ĠHashMap < String , ĠLogLevel >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant ReadWrite Lock ( false ) ĊĠĠĠĠĠĠĠ Ġ@ Volatile Ġvar Ġprefix : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Config [ "" ] Ġ= ĠLogLevel . INFO ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun ĠsetDefault LogLevel ( l : ĠLogLevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset LogLevel ("", Ġl ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġget ( cls : ĠClass < *> ): ĠLogger Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ Ń ãĥ£ ãĥĥ ãĤ·ãĥ¥ ãģ« ãģĤ ãĤĮãģ° ãģĿãĤĮ ãĤĴ è¿Ķ ãģĻ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Logger Ġ= Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstances [ cls ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Logger Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcached Logger ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æĸ°ãģĹãģĦ Logger ãĤĴ ãĤŃ ãĥ£ ãĥĥ ãĤ·ãĥ¥ ãģ« åħ¥ ãĤĮãĤĭ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġãĥ Ń ãĥĥãĤ¯ ãĤĴ å¾Ĺ ãĤĭ ãģ¾ãģ§ ãģ« ãĤŃ ãĥ£ ãĥĥ ãĤ·ãĥ¥ ãģĮ æĽ´æĸ° ãģķãĤĮãģ¦ãģĦãĤĭ ãģĭ ãĤĤ ãģĹ ãĤĮ ãģªãģĦ ãģ®ãģ§ ãĢģ ãĤĤ ãģĨ ä¸Ģ åº¦ ãĤŃ ãĥ£ ãĥĥ ãĤ·ãĥ¥ ãĤĴ ç¢ºèªį ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstances [ cls ] Ġ?: Ġlet Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Level Ġ= Ġget LogLevel ( cls . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠAndroid Appender ( cls ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠLogger ( logLevel , Ġapp ender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . v (" Logger ", Ġ" put : Ġclass ="+ cls . toString ()); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstances [ cls ] Ġ= Ġlogger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġget Print Logger ( cls : ĠClass < *> ): ĠLogger Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLogger ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget LogLevel ( cls . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStd out Appender () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġãĥ Ń ãĤ° ãĥ¬ ãĥĻ ãĥ« ãĤĴè¨Ńå®ļ ãģĻãĤĭ ãĢĤ è¨Ńå®ļ ãģĹãģŁ ãĥŃãĤ° ãĥ¬ ãĥĻ ãĥ« ãģ¯ ãģĵãģ® åĲįåīį ãģ§ å§ĭ ãģ¾ ãĤĭ ãģĻãģ¹ãģ¦ãģ® ãĤ¯ãĥ©ãĤ¹ ãģ« æľī åĬ¹ ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ãĤ¯ãĥ©ãĤ¹ åĲį ãģ«å¯¾ ãģĹãģ¦ æĸĩåŃĹåĪĹ ãģ® åīį æĸ¹ ä¸Ģèĩ´ ãģłãģĳ ãģ§ éģ© çĶ¨ ãģķãĤĮãĤĭ ãģĵãģ¨ ãģ« æ³¨æĦı ãĢĤ ãģ¾ãģŁ ãĢģ è¨Ńå®ļ ãģ¯ ãĤĪ ãĤĬ éķ· ãģı ãĥŀ ãĥĥ ãĥģ ãģĻãĤĭ åĲįåīį ãģĮ åĦ ª åħĪ ãģķãĤĮãĤĭ ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ä¾ĭ ) Ġa . b . Foo ãģ® è¨Ńå®ļ ãģ¯ Ġ ãĤ¯ãĥ©ãĤ¹ a . b . Foo Test Ġãģ« ãĤĤ ãĥŀ ãĥĥ ãĥģ ãģĻãĤĭ ãĢĤ a . b . Foo ãģ«ãģ¯ a ãĤĪ ãĤĬ ãĤĤ a . b ãģ® æĸ¹ ãģĮ åĦ ª åħĪ çļĦãģ« ãĥŀ ãĥĥ ãĥģ ãģĻãĤĭ ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpackage Or ClassName Ġãĥĳ ãĥĥ ãĤ± ãĥ¼ãĤ¸ åĲį ãģ¾ãģŁãģ¯ ãĤ¯ãĥ©ãĤ¹ ãģ® å®Įåħ¨ ä¿® é£ ¾ åĲį ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlevel Ġ è¨Ńå®ļ ãģĻãĤĭ ãĥŃãĤ° ãĥ¬ ãĥĻ ãĥ« ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset LogLevel ( package Or ClassName : ĠString , Ġlevel : ĠLogLevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . write Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel Config [ package Or ClassName ] Ġ= Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget LogLevel ( package Or ClassName : ĠString ): ĠLogLevel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlevel Config . keys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġãĥ Ń ãĤ° ãĥ¬ ãĥĻ ãĥ« è¨Ńå®ļ ãģ® ãĥĳ ãĥĥ ãĤ± ãĥ¼ãĤ¸ åĲį ãģĮ éķ· ãģĦ æĸ¹ ãģĭãĤī ãĥŀ ãĥĥ ãĥģ ãĥ³ãĤ° ãģĻãĤĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. last OrNull Ġ{ Ġpackage Or ClassName . startsWith ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġlevel Config [ it ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġlevel Config [ "" ] Ġ?: ĠLogLevel . INFO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġenum Ġclass ĠLogLevel Ġ{ ĊĠĠĠĠĠĠĠ ĠVERBOSE , ĠDEBUG , ĠINFO , ĠWARN , ĠERROR , ĠW TF ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinterface ĠApp ender Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġw tf ( message : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġe ( message : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġw ( message : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġi ( message : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuild Config . DEBUG ãģĮ true ãģª ãĤī ãĥĩ ãĥķãĤ© ãĥ« ãĥĪ ãģ® ãĥŃ ãĤ± ãĥ¼ãĥ« ãģ§ String . format () ãģ§ ãĥ¡ ãĥĥãĤ»ãĥ¼ãĤ¸ ãĤĴ æķ´ å½¢ ãģĹãģ¦ Log . d () ãģ§ åĩºåĬĽ ãģĻãĤĭ ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġd ( message : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġd ( t : ĠThrowable , Ġmessage : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġv ( message : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġv ( t : ĠThrowable , Ġmessage : ĠString ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠAndroid Appender ( cls : ĠClass <* >) Ġ: ĠApp ender Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtag Ġ= Ġget Tag ( cls ) ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Tag ( cls : ĠClass < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlock . read Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠãĤ ¿ ãĤ° æĸĩåŃĹåĪĹ ãĤĴ çĶŁæĪĲ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠclassName Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcur Cls : ĠClass < *> ? Ġ= Ġcls ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Cls Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( cur Cls . is Member Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= Ġadd ClassName ( cur Cls . simple Name , ĠclassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Cls Ġ= Ġcur Cls . decl aring Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( cur Cls . is Anonymous Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinterfaces Ġ= Ġcur Cls . interfaces ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Ġ= Ġif Ġ( interfaces . isNotEmpty ()) Ġinterfaces [ 0 ] Ġelse Ġcur Cls . super class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( super Class Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= Ġadd ClassName (" (" Ġ+ ĠsuperClass . simple Name Ġ+ Ġ" )", ĠclassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Cls Ġ= Ġcur Cls . enc lo sing Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= Ġadd ClassName ( cur Cls . simple Name , ĠclassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefix Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ prefix :$ className " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclassName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd ClassName ( enc lo sing ClassName : ĠString , ĠclassName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( className . isNotEmpty ()) Ġ"$ enc lo sing ClassName .$ className " Ġelse Ġen closing ClassName ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġw tf ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w tf ( tag , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġe ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( tag , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġw ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( tag , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġi ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( tag , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġd ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġd ( t : ĠThrowable , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġmessage , Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġv ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( tag , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġv ( t : ĠThrowable , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( tag , Ġmessage , Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠStd out Appender Ġ: ĠApp ender Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġw tf ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġe ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġw ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġi ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġd ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġd ( t : ĠThrowable , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( get StackTrace ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġv ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġv ( t : ĠThrowable , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( get StackTrace ( t )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget StackTrace ( t : ĠThrowable ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Writer Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . printStackTrace ( PrintWriter ( string Writer )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstring Writer . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ