package Ġcom . vel mur ug an . in app logger Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġjava . io .* ĊĊ Ċ abstract Ġclass ĠLogger Manager ( private Ġval Ġcontext : ĠContext ) Ġ: ĠILogger , ĠSubject Ġ{ ĊĊĠĠĠ Ġ// https :// www . code met rix . in / 2 0 1 9 / 0 9 / write - logs - into - log - file - in - android . html ĊĠĠĠ Ġprivate Ġvar Ġob servers Ġ= Ġmutable ListOf < Message Observer >() ĊĠĠĠ Ġprivate Ġval Ġlog File Dir : ĠFile Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ("${ context . files Dir }/ Log ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlog File : ĠFile Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ("$ log File Dir / logger . txt ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġsave Log ( msg : ĠString , Ġtag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! log File Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog File Dir . mkdir () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! log File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠBuffered Writer ( FileWriter ( log File , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ("< p >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( msg . replace ("\ r \ n ","" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ("</ p >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . close () ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Logger ", Ġex . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify Message ( msg , Ġtag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġregister ( observer : ĠMessage Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġob servers . add ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun Register ( observer : ĠMessage Observer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġob servers . remove ( observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnotify Message ( msg : ĠString , Ġtag : String ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġob servers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . update ( tag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget Log ( tag : ĠString ? Ġ= Ġnull ): ĠStringBuilder Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Read Ġtext Ġfrom Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbr Ġ= ĠBufferedReader ( FileReader ( log File )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( br . readLine (). also Ġ{ Ġline Ġ= Ġit Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ== Ġget Tag ( line ?: Ġ"> ALL : ")-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ== ĠLog Type . ALL . name Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . append ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġkotlin . run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbr . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Logger ", Ġe . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Old Log () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( log File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tag ( line : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġline . split (" Ġ: "). first (). split ("> "). last () ĊĠĠĠ Ġ} Ċ Ċ }