package Ġcom . the ah 6 4 . bug mailer . core Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . Package Info Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġcom . the ah 6 4 . bug mailer . exceptions . Bug Mailer Exception Ċ import Ġcom . the ah 6 4 . bug mailer . models . Bold Node Ċ import Ġcom . the ah 6 4 . bug mailer . models . Node Ċ import Ġcom . the ah 6 4 . bug mailer . utils . Common Utils Ċ import Ġcom . the ah 6 4 . bug mailer . utils . Secret Constants Ċ import Ġcom . the ah 6 4 . saf email . Safe Mail Ċ import Ġcom . the apache 6 4 . github _ android _ sdk . GitHub API Ċ import Ġcom . the apache 6 4 . github _ android _ sdk . responses . Create Comment Response Ċ import Ġcom . the apache 6 4 . github _ android _ sdk . responses . Create Issue Response Ċ import Ġcom . the apache 6 4 . github _ android _ sdk . responses . List Issues Response Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġsh if ar Ġon Ġ 1 5 / 4 / 1 6 . Ċ Ġ* ĠLOG O Ġ: Ġ Ġhttps :// i . stack . imgur . com / 2 1 i AR . png Ċ Ġ* ĠHeader : Ġhttps :// i . stack . imgur . com / U 2 J VG . png Ċ Ġ*/ Ċ object ĠBug Mailer Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ THEME _ COLOR Ġ= ĠColors . MAT ERIAL _ RED _ 5 0 0 ĊĊĠĠĠ Ġprivate Ġval ĠX Ġ= ĠBug Mailer :: class . java . simple Name ĊĠĠĠ Ġprivate Ġval ĠSA FE _ MAIL _ API _ KEY Ġ= Ġ" Ns uf Xc Uu oa " ĊĠĠĠ Ġprivate Ġval ĠKEY _ EXCEPTION _ MESSAGE Ġ= Ġ" Exception ĠMessage " ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠprojectName : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠpackageName : ĠString ĊĠĠĠ Ġprivate Ġvar Ġapp Version Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġtheme Color : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġconfig : ĠBug Mailer Config ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġapp Version Code : ĠInt Ġ= Ġ 0 ĊĊĊĠĠĠ Ġ@ Throws ( Bug Mailer Exception :: class ) ĊĠĠĠ Ġfun Ġinit ( context : ĠContext , Ġconfig : ĠBug Mailer Config ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġcontext . packageName ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Info : ĠPackage Info ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Info Ġ= Ġcontext . package Manager . get Package Info ( packageName , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBug Mailer Exception (" Couldn 't Ġfind Ġpackage Ġname . ĠDefault Ġ' Unknown ' Ġset ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġapp Version Name Ġ= Ġpackage Info . version Name ĊĠĠĠĠĠĠĠ Ġapp Version Code Ġ= Ġpackage Info . version Code ĊĠĠĠĠĠĠĠ ĠprojectName Ġ= Ġcontext . application Info . load Label ( context . package Manager ) Ġas ĠString ĊĠĠĠĠĠĠĠ Ġtheme Color Ġ= Ġif Ġ( config . theme Color Ġ== Ġnull ) ĠDEFAULT _ THEME _ COLOR Ġelse Ġconfig . theme Color ĊĊĊĠĠĠĠĠĠĠ ĠThread . setDefault Un caught ExceptionHandler ( Custom ExceptionHandler ()) ĊĠĠĠĠĠĠĠ ĠBug Mailer . config Ġ= Ġconfig ĊĊĠĠĠĠĠĠĠ Ġ// Initializing Ġsaf email ĊĠĠĠĠĠĠĠ ĠSafe Mail . init ( SAFE _ MAIL _ API _ KEY ) ĊĊĠĠĠĠĠĠĠ Ġ// Initializing ĠGithub ĠSDK ĊĠĠĠĠĠĠĠ ĠGitHub API . init ( Secret Constants . GITHUB _ ACCESS _ TOKEN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġfun Ġreport ( e : ĠThrowable , Ġcustom Node : ĠBug Mailer Node ? Ġ= Ġnull ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġ// Getting Ġstack Ġtrace ĊĠĠĠĠĠĠĠ Ġval Ġstack Trace Ġ= ĠCommon Utils . get StackTrace ( e ) ĊĠĠĠĠĠĠĠ Ġval Ġstack Lines Ġ= Ġstack Trace . split ("\ n ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġval Ġprimary Stack Line Ġ= Ġif Ġ( stack Lines . size Ġ> Ġ 1 ) Ġstack Lines [ 0 ] Ġ+ Ġ" Ġ" Ġ+ Ġstack Lines [ 1 ]. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġelse Ġstack Trace ĊĠĠĠĠĠĠĠ Ġval Ġprimary Stack Line HTML Ġ= ĠString . format ("< span Ġstyle =' color :# THEME COLOR ;'> % s Ġ% s </ span >", Ġstack Lines [ 0 ], Ġstack Lines [ 1 ]. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġstack Trace Builder Html Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġsimple StackTrace Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( stack Line Ġin Ġstack Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack Line . contains ( packageName !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Trace Builder Html . append ("< span Ġstyle =' color :# THEME COLOR ; '>< b > "). append ( stack Line ). append ("< b ></ span >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Trace Builder Html . append ( stack Line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsimple StackTrace Builder . append ( stack Line ). append ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack Trace Builder Html . append ("< br >") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġe . stack Trace [ 0 ]. fileName ĊĊĠĠĠĠĠĠĠ Ġ// Data ĊĠĠĠĠĠĠĠ Ġval Ġdata Nodes Ġ= ĠArrayList < Node >() ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Bold Node (" Fatal ĠError ", Ġprimary Stack Line HTML )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" App ĠVersion ĠName ", Ġapp Version Name !! )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" App ĠVersion ĠCode ", Ġapp Version Code )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" File ĠName ", ĠfileName )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" API ĠLevel ", ĠBuild . VERSION . SDK _ INT )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" Time Ġof ĠOcc urrence ", ĠDate (). toString ())) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" Device ", ĠBuild . DEVICE )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" Model ", ĠBuild . MODEL )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node (" Product ", ĠBuild . PRODUCT )) ĊĠĠĠĠĠĠĠ Ġdata Nodes . add ( Node ( KEY _ EXCEPTION _ MESSAGE , Ġstack Trace Builder Html . toString ())) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( custom Node Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Nodes . addAll ( custom Node . nodes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġerror Report Gen Ġ= ĠReport Generator ( projectName , ĠpackageName , Ġprimary Stack Line ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġdata Nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Report Gen . add Node ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġerror Report Ġ= Ġerror Report Gen . build () ĊĊĠĠĠĠĠĠĠ Ġ// Building Ġto Ġlist ĊĠĠĠĠĠĠĠ Ġval Ġrecipients Ġ= Ġconfig !!. recipients ĊĠĠĠĠĠĠĠ Ġval Ġcc Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġrecipients . indices ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecipient Ġ= Ġrecipients [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recipient . exception Class . isAssignableFrom ( e . java Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc Builder . append ( recipients [ i ]. email ). append (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" To : Ġ$ cc Builder ") ĊĊĊĠĠĠĠĠĠĠ ĠSafe Mail . send Mail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectName Ġ+ Ġ" Ġ- ĠBug Mailer ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcc Builder . substring ( 0 , Ġcc Builder . length Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimary Stack Line , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Report ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( config !!. is GitHub Issue Tracker ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ign iting ĠGitHub Ġissue Ġmanagement Ġsystem ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= ĠString . format ("% s :% s ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprimary Stack Line , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Version Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Issue Ġtitle : Ġ$ title ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Building Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgit Hub Comment Generator Ġ= ĠGitHub Comment Generator () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġdata Nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . key Ġ== ĠKEY _ EXCEPTION _ MESSAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgit Hub Comment Generator . add Code Node ( node . key , Ġsimple StackTrace Builder . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgit Hub Comment Generator . add Node ( node . key , Ġ( node Ġas ? ĠB old Node )?. value ?. replace (" (< b >| </ b >) ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġnode . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠGitHub API . list Issues ( config !!. owner , Ġconfig !!. repo , ĠGitHub API . Issue Type . ALL , Ġobject Ġ: ĠGitHub API . Callback < List < List Issues Response . Issue >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( issues : ĠList < List Issues Response . Issue >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġissue Number Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( issue Ġin Ġissues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( issue . title Ġ== Ġtitle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissue Number Ġ= Ġissue . number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( issue Number Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// New Ġcomment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGitHub API . create Comment ( config !!. owner , Ġconfig !!. repo , Ġissue Number , Ġgit Hub Comment Generator . toString (), Ġobject Ġ: ĠGitHub API . Callback < Create Comment Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( create Comment Response : ĠCreate Comment Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Added Ġcomment ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// New Ġissue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGitHub API . create Issue ( config !!. owner , Ġconfig !!. repo , Ġtitle , Ġgit Hub Comment Generator . toString (), Ġobject Ġ: ĠGitHub API . Callback < Create Issue Response > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( create Issue Response : ĠCreate Issue Response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" New Ġissue Ġadded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ