package Ġcom . cop per leaf . ball ast . firebase Ċ Ċ import Ġcom . cop per leaf . ball ast . Ball ast Interceptor Ċ import Ġcom . cop per leaf . ball ast . Ball ast Logger Ċ import Ġcom . cop per leaf . ball ast . Ball ast Notification Ċ import Ġcom . cop per leaf . ball ast . core . Ball ast Exception Ċ import Ġcom . google . firebase . crash ly t ics . Firebase Crash ly t ics Ċ import Ġcom . google . firebase . crash ly t ics . k tx . KeyValue Builder Ċ import Ġcom . google . firebase . crash ly t ics . k tx . set Custom Keys Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠFirebase Crash ly t ics Interceptor < Inputs Ġ: ĠAny , ĠEvents Ġ: ĠAny , ĠState Ġ: ĠAny >( ĊĠĠĠ Ġprivate Ġval Ġcrash ly t ics : ĠFirebase Crash ly t ics , Ċ ) Ġ: ĠBall ast Interceptor < Inputs , ĠEvents , ĠState > Ġ{ ĊĊĠĠĠ Ġprivate Ġobject ĠKeys Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠViewModel Name Ġ= Ġ" ViewModel Name " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠInput Type Ġ= Ġ" InputType " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEventType Ġ= Ġ" EventType " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSide Job Key Ġ= Ġ" Side Job Key " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠException Type Ġ= Ġ" Exception Type " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġon Notify ( logger : ĠBall ast Logger , Ġnotification : ĠBall ast Notification < Inputs , ĠEvents , ĠState >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( notification ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBall ast Notification . Input Accepted Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! notification . input . is Annotated With ( Firebase Crash ly t ics Ignore :: class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrash ly t ics . set Custom Keys Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( Keys . ViewModel Name , Ġnotification . vm . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( Keys . InputType , Ġ"${ notification . vm . name }.${ notification . input :: class . java . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrash ly t ics . log ("${ notification . vm . name }.${ notification . input }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBall ast Notification . Input Handler Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( notification , Ġ" Input ", Ġnotification . throwable , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( Keys . InputType , Ġ"${ notification . vm . name }.${ notification . input :: class . java . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBall ast Notification . EventHandler Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( notification , Ġ" Event ", Ġnotification . throwable , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( Keys . EventType , Ġ"${ notification . vm . name }.${ notification . event :: class . java . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBall ast Notification . Side Job Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( notification , Ġ" Side Job ", Ġnotification . throwable , Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( Keys . Side Job Key , Ġ"${ notification . vm . name }.${ notification . key }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBall ast Notification . Unhandled Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( notification , Ġ" Unknown ", Ġnotification . throwable , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( ĊĠĠĠĠĠĠĠ Ġnotification : ĠBall ast Notification < Inputs , ĠEvents , ĠState >, ĊĠĠĠĠĠĠĠ Ġtype : ĠString , ĊĠĠĠĠĠĠĠ Ġthrowable : ĠThrowable , ĊĠĠĠĠĠĠĠ Ġhandled : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġextra Keys : ĠKey Value Builder . () Ġ-> ĠUnit , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrash ly t ics . set Custom Keys Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( Keys . ViewModel Name , Ġnotification . vm . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey ( Keys . Exception Type , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Keys () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcrash ly t ics . record Exception ( Ball ast Exception ( throwable , Ġhandled , Ġ"[ red acted ]", Ġempty List ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny , ĠAnn Ġ: ĠAnnotation > ĠT . is Annotated With ( annotation Class : ĠK Class < Ann >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis :: class . java . is Annotation Present ( annotation Class . java ) ĊĠĠĠ Ġ} Ċ } Ċ