package Ġcom . pr 0 gram m . app . util Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . os . Looper Ċ import Ġandroid . text . Sp ann able StringBuilder Ċ import Ġandroid . text . style . Bullet Span Ċ import Ġandroid . text . style . Leading Margin Span Ċ import Ġandroid . util . L ru Cache Ċ import Ġandroid . view . View Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroid . widget . EditText Ċ import Ġandroidx . annotation . Color Int Ċ import Ġandroidx . annotation . Color Res Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . appcompat . content . res . AppCompat Resources Ċ import Ġandroidx . core . app . Task Stack Builder Ċ import Ġandroidx . core . content . getSystem Service Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . core . content . res . use Ċ import Ġandroidx . core . graphics . drawable . Drawable Compat Ċ import Ġandroidx . core . net . Connectivity Manager Compat Ċ import Ġandroidx . core . text . in Spans Ċ import Ġcom . pr 0 gram m . app . Build Config Ċ import Ġcom . pr 0 gram m . app . Debug Config Ċ import Ġcom . pr 0 gram m . app . Logger Ċ import Ġcom . pr 0 gram m . app . R Ċ import Ġcom . pr 0 gram m . app . ui . Permission Helper Ċ import Ġcom . pr 0 gram m . app . ui . base . Async Scope Ċ import Ġio . sentry . S entry Ċ import Ġio . sentry . event . Event Ċ import Ġio . sentry . event . Event Builder Ċ import Ġio . sentry . event . interfaces . Exception Interface Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġretrofit 2 . HttpException Ċ import Ġrx . exceptions . OnError NotImplemented Exception Ċ import Ġjava . io . IOException Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ Ċ /** Ċ Ġ* ĠPlace Ġto Ġput Ġeverything Ġthat Ġbelongs Ġnow here . ĠThanks ĠOb ama . Ċ Ġ*/ Ċ object ĠAndroid Utility Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger (" Android Utility ") ĊĊĠĠĠ Ġprivate Ġval ĠEXCEPTION _ BLACK LIST Ġ= ĠlistOf (" Media Codec ", Ġ" de queue Input Buffer ", Ġ" de queue Output Buffer ", Ġ" release Output Buffer ", Ġ" native _ ") ĊĊĠĠĠ Ġprivate Ġval Ġcache Ġ= ĠL ru Cache < Int , ĠUnit >( 6 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġheight Ġof Ġthe Ġaction Ġbar Ġas Ġdefin ied Ġin Ġthe Ġstyle Ġattribute ĊĠĠĠĠ Ġ* Ġ[ R . attr . action Bar Size ] Ġplus Ġthe Ġheight Ġof Ġthe Ġstatus Ġbar Ġon Ġandroid ĊĠĠĠĠ Ġ* ĠKit kat Ġand Ġabove . ĊĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠA Ġcontext Ġto Ġresolve Ġthe Ġstyled Ġattribute Ġvalue Ġfor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget ActionBar Content Offset ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget StatusBar Height ( context ) Ġ+ Ġget ActionBar Height ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġheight Ġof Ġthe Ġaction bar . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget ActionBar Height ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . obtain Styled Attributes ( int ArrayOf ( R . attr . action Bar Size )). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . get Dimension Pixel Size ( it . getIndex ( 0 ), Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġheight Ġof Ġthe Ġstatus bar . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget StatusBar Height ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠ Ġval Ġresource Id Ġ= Ġresources . getIdentifier (" status _ bar _ height ", Ġ" dim en ", Ġ" android ") ĊĠĠĠĠĠĠĠ Ġif Ġ( resourceId Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresources . get Dimension Pixel Size ( resourceId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlog To Crash ly t ics ( error _: ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( error _ Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= Ġerror _ ĊĠĠĠĠĠĠĠ Ġval Ġca usal Chain Ġ= Ġerror . ca usal Chain ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ca usal Chain . contains Type < Cancellation Exception >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ca usal Chain . contains Type < Permission Helper . Permission Not Granted >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ca usal Chain . contains Type < IOException >() Ġ|| Ġca usal Chain . contains Type < HttpException >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( error ) Ġ{ Ġ" Ign oring Ġnetwork Ġexception " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ca usal Chain . contains Type < OnError NotImplemented Exception >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġerror . root Cause ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrace Ġ= ĠString Writer (). also Ġ{ Ġerror . printStackTrace ( PrintWriter ( it )) Ġ}. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( EXCEPTION _ BLACK LIST . any Ġ{ Ġit Ġin Ġtrace Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Ign oring Ġexception ", Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Str Ġ= Ġerror . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" connect Ġtimed Ġout " Ġin Ġerror Str ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtry Ġto Ġrate Ġlimit Ġexceptions . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠSystem . identity HashCode ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache . get ( key ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( key , ĠUnit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġto Ġs entry Ġif Ġa Ġclient Ġis Ġconfigured ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS entry . get Stored Client ()?. send Event ( Event Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Message ( error . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Level ( Event . Level . WARNING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with S entry Interface ( Exception Interface ( error ))) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( err ) Ġ{ Ġ" Could Ġnot Ġsend Ġerror Ġ$ error Ġto Ġs entry " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis On Mobile ( context : ĠContext ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġcm Ġ= Ġcontext . getSystem Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĊĠĠĠĠĠĠĠ Ġreturn ĠConnect ivity Manager Compat . isActive Network Meter ed ( cm ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġcolor Ġt int ed Ġh q - icon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Tint ed Drawable ( context : ĠContext , Ġ@ Drawable Res Ġdrawable Id : ĠInt , Ġ@ Color Res Ġcolor Id : ĠInt ): ĠDrawable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠ Ġval Ġicon Ġ= ĠDrawable Compat . wrap ( AppCompat Resources . get Drawable ( context , Ġdrawable Id ) !! ) ĊĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( icon , ĠResources Compat . getColor ( resources , Ġcolor Id , Ġnull )) ĊĠĠĠĠĠĠĠ Ġreturn Ġicon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa ĠCharSequence Ġcontaining Ġa Ġbul leted Ġand Ġproperly Ġindent ed Ġlist . ĊĊĠĠĠĠ Ġ* Ġ@ param Ġleading Margin ĠIn Ġpixels , Ġthe Ġspace Ġbetween Ġthe Ġleft Ġedge Ġof Ġthe Ġbullet Ġand Ġthe Ġleft Ġedge Ġof Ġthe Ġtext . ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlines ĠĠĠĠĠĠĠĠ ĠAn Ġarray Ġof ĠChar Sequences . ĠEach ĠChar Sequences Ġwill Ġbe Ġa Ġseparate Ġline / bullet - point . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmake Bullet List ( leading Margin : ĠInt , Ġlines : ĠList < CharSequence >): ĠCharSequence Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSp ann able StringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( idx Ġin Ġlines . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Spans ( Bullet Span ( leading Margin Ġ/ Ġ 3 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Spans ( Leading Margin Span . Standard ( leading Margin )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( lines [ idx ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġidx Ġ== Ġlines . last Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( if Ġ( last ) Ġ"" Ġelse Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Version Code (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDebug Config . version Override Ġ?: ĠBuild Config . VERSION _ CODE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Config . VERSION _ CODE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide Soft Keyboard ( view : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġview . context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimm . hide Soft Input From Window ( view . window Token , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Soft Keyboard ( view : ĠEditText ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . request Focus () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġview . context . getSystem Service < Input Method Manager >() Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimm . show Soft Input ( view , ĠInput Method Manager . SHOW _ IMP LICIT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrecreate Activity ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( activity . intent ) ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠ ĠTask Stack Builder . create ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Next Intent With Parent Stack ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Activities () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Window Fullscreen ( activity : ĠActivity , Ġfullscreen : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġflags Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fullscreen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġflags Ġor ĠView . SYSTEM _ UI _ FLAG _ HIDE _ NAV IG ATION ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġflags Ġor Ġ( View . SYSTEM _ UI _ FLAG _ LAYOUT _ ST ABLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ HIDE _ NAV IG ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ FULL SCREEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ĠView . SYSTEM _ UI _ FLAG _ FULL SCREEN ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġflags Ġor ĠView . SYSTEM _ UI _ FLAG _ IM MER SIVE _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdecor View Ġ= Ġactivity . window . decor View ĊĠĠĠĠĠĠĠ Ġdecor View . system Ui Visibility Ġ= Ġflags ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscreen Size ( activity : ĠActivity ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscreen Size Ġ= ĠPoint () ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġactivity . window Manager . default Display ĊĊĠĠĠĠĠĠĠ Ġdisplay . get Real Size ( screen Size ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġscreen Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscreen Is Land scape ( activity : ĠActivity ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġscreen Size ( activity ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsize . x Ġ> Ġsize . y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT ries Ġto Ġget Ġa Ġbasic Ġactivity Ġfrom Ġthe Ġgiven Ġcontext . ĠReturns Ġan Ġempty Ġobservable , ĊĠĠĠĠ Ġ* Ġif Ġno Ġactivity Ġcould Ġbe Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġactivity From Context ( context : ĠContext ): ĠActivity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠContext Wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactivity From Context ( context . base Context ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Color Int ĊĠĠĠ Ġfun Ġresolve Color Attribute ( context : ĠContext , Ġattr : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġcontext . obtain Styled Attributes ( int ArrayOf ( attr )) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġarr . getColor ( arr . getIndex ( 0 ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġcheck MainThread () Ġ= Ġdebug Ġ{ ĊĠĠĠ Ġif Ġ( Looper . get Main Looper (). thread Ġ!== ĠThread . currentThread ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger (" Android Utility "). error Ġ{ Ġ" Expected Ġto Ġbe Ġin Ġmain Ġthread Ġbut Ġwas : Ġ${ Thread . currentThread (). name }" Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Must Ġbe Ġcalled Ġfrom Ġthe Ġmain Ġthread .") ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċ inline Ġfun Ġcheck Not MainThread ( msg : ĠString ? Ġ= Ġnull ) Ġ= Ġdebug Ġ{ ĊĠĠĠ Ġif Ġ( Looper . get Main Looper (). thread Ġ=== ĠThread . currentThread ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger (" Android Utility "). error Ġ{ Ġ" Expected Ġnot Ġto Ġbe Ġon Ġmain Ġthread : Ġ$ msg " Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Must Ġnot Ġbe Ġcalled Ġfrom Ġthe Ġmain Ġthread : Ġ$ msg ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< T > Ġdo In Background ( cross inline Ġaction : Ġsuspend Ġ() Ġ-> ĠT ): ĠJob Ġ{ ĊĠĠĠ Ġreturn ĠAsync Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( thr : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Utility . log To Crash ly t ics ( Background Thread Exception ( thr )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠBackground Thread Exception ( cause : ĠThrowable ) Ġ: ĠRuntimeException ( cause ) Ċ Ċ fun ĠThrowable . getMessage With Cause s (): ĠString Ġ{ ĊĠĠĠ Ġval Ġerror Ġ= Ġthis ĊĠĠĠ Ġval Ġtype Ġ= Ġjava Class . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace First (". + \\. ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ('$ ', Ġ'.') ĊĊĠĠĠ Ġval Ġcause Ġ= Ġerror . cause ĊĊĠĠĠ Ġval Ġhas Cause Ġ= Ġcause Ġ!= Ġnull Ġ&& Ġerror Ġ!== Ġcause ĊĠĠĠ Ġval Ġmessage Ġ= Ġerror . message Ġ?: Ġ"" ĊĠĠĠ Ġval Ġhas Message Ġ= Ġmessage . isNotBlank () Ġ&& Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! has Cause Ġ|| Ġ( cause Ġ!= Ġnull Ġ&& Ġcause . java Class . direct Name Ġ! in Ġmessage )) ĊĊĠĠĠ Ġreturn Ġif Ġ( has Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Cause Ġ&& Ġcause Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ type (${ error . message }), Ġcaused Ġby Ġ${ cause . getMessage With Cause s () }" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ type (${ error . message })" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Cause Ġ&& Ġcause Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ type , Ġcaused Ġby Ġ${ cause . getMessage With Cause s () }" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }