package Ġcom . ct ye ung . run y asso 8 0 0 . view Models Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Strict Mode Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . Main Application Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . R Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . d agger . D agger Component Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . room . Y asso Database Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . room . splits . Split Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . room . splits . Split Repository Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . room . steps . Step Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . room . steps . Step Repository Ċ import Ġcom . ct ye ung . run y asso 8 0 0 . utilities . Time Formatter Ċ import Ġcom . google . gson . Gson Ċ import Ġkotlinx . android . synt hetic . main . activity _ persist .* Ċ import Ġjava . lang . StringBuilder Ċ import Ġjava . util . ArrayList Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ Ċ class ĠPers ist ViewModel Ġ( application : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ){ ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġ@ field : Named (" split ") Ġlateinit Ġvar Ġsplit Repos : Split Repository ĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġ@ field : Named (" step ") Ġlateinit Ġvar Ġstep Repos : Step Repository ĊĊĠĠĠ Ġvar Ġsplits : ĠLive Data < List < Split >> ĊĠĠĠ Ġvar Ġsteps : ĠLive Data < List < Step >> ĊĊĠĠĠ Ġvar Ġtotal Run Time : Long Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtotal J og Time : Long Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtotal Run Dis : Double Ġ= Ġ 0 . 0 ĊĠĠĠ Ġvar Ġtotal J og Dis : Double Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠD agger Component . create (). inject Persist ViewModel ( this ) ĊĠĠĠĠĠĠĠ Ġsplits Ġ= Ġsplit Repos . splits ĊĠĠĠĠĠĠĠ Ġsteps Ġ= Ġstep Repos . steps ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetResource ( id : Int ): String Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMain Application . application Context (). resources . getString ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* Ġprint Ġa Ġsummary Ġof Ġmar athon Ġtraining ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Y asso Msg ( header : String , Ġfooter : String ): String Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġsb . append ln ( header ) ĊĠĠĠĠĠĠĠ Ġsb . append ln () ĊĊĠĠĠĠĠĠĠ Ġsb . append ln ( get Race Goal ()) ĊĠĠĠĠĠĠĠ Ġsb . append ln () ĊĊĠĠĠĠĠĠĠ Ġsb . append ln ( getS print Goal ()) ĊĠĠĠĠĠĠĠ Ġsb . append ln () ĊĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġget Performance () ĊĠĠĠĠĠĠĠ Ġsb . append ln ("${ getResource ( R . string . total _ sprint _ dis )} Ġ${ total Run Dis } m Ġtime : Ġ${ Time Formatter . print Time ( total Run Time / 1 0 0 0 )} ") ĊĠĠĠĠĠĠĠ Ġsb . append ln ("${ getResource ( R . string . total _ j og _ dis )} Ġ${ total J og Dis } m Ġtime : Ġ${ Time Formatter . print Time ( total J og Time / 1 0 0 0 )} ") ĊĠĠĠĠĠĠĠ Ġsb . append ln () ĊĊĠĠĠĠĠĠĠ Ġsb . append ln ( str ) ĊĠĠĠĠĠĠĠ Ġsb . append ln () ĊĊĠĠĠĠĠĠĠ Ġsb . append ln ( get Spl its ()) ĊĠĠĠĠĠĠĠ Ġsb . append ln () ĊĊĠĠĠĠĠĠĠ Ġsb . append ( get Steps ()) ĊĠĠĠĠĠĠĠ Ġsb . append ln () ĊĊĠĠĠĠĠĠĠ Ġsb . append ln ( footer ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Race Goal (): String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseconds : Long Ġ= ĠShared Pref Utility . get ( Shared Pref Utility . key Race Goal , Ġ 0 L ) ĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠTime Formatter . print Time ( seconds ) ĊĠĠĠĠĠĠĠ Ġreturn ĠgetResource ( R . string . race _ goal ) Ġ+ Ġstr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sprint Goal (): String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseconds : Long Ġ= ĠShared Pref Utility . get ( Shared Pref Utility . key Sprint Goal , Ġ 0 L ) ĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠTime Formatter . print Time ( seconds ) ĊĠĠĠĠĠĠĠ Ġreturn ĠgetResource ( R . string . sprint _ goal ) Ġ+ Ġstr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġincrement Time ( type : String , Ġtime : Long , Ġdis : Double ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSplit . RUN _ TYPE _ SPR INT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Run Time Ġ+= Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Run Dis Ġ+= Ġdis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSplit . RUN _ TYPE _ J OG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal J og Time Ġ+= Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal J og Dis Ġ+= Ġdis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠBuild Ġa Ġsummary Ġof Ġdistances , Ġtime - elapsed Ġon Ġsplits ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Performance (): String Ġ{ ĊĠĠĠĠĠĠĠ Ġtotal Run Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtotal J og Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtotal Run Dis Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġtotal J og Dis Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġsplits : List < Split >? Ġ= Ġsplits . value ĊĠĠĠĠĠĠĠ Ġif ( null != splits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ("{ \" Performance \": [ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsplits . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( split Ġin Ġsplits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( Ġ"{\" split \": Ġ"+ Ġsplit . split Index Ġ+ ", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( Ġ"{\" type \": Ġ\"" + Ġsplit . run _ type Ġ+" \", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" distance \ ":" + split . dis Ġ+ ", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Diff : Long Ġ= Ġsplit . endTime Ġ- Ġsplit . startTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Time ( split . run _ type , Ġtime Diff , Ġsplit . dis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠTime Formatter . print Time ( time Diff / 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("\" elapsed \": \"" + str +" \" }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ++ i Ġ>= Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln (" ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠRaw Ġsplit Ġdata Ġdump ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Spl its (): String Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġsplits : List < Split >? Ġ= Ġsplits . value ĊĠĠĠĠĠĠĠ Ġif ( null != splits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ("{ \" Spl its \": [ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġsplits . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( split Ġin Ġsplits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġgson . toJson ( split ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( i Ġ>= Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ( str Ġ+ "] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ( str Ġ+ Ġ", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠRaw Ġstep Ġdata Ġdump ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Steps (): String Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġsteps : List < Step >? Ġ= Ġsteps . value ĊĠĠĠĠĠĠĠ Ġif ( null != steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ("{ \" Steps \": [ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġsteps . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( step Ġin Ġsteps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġgson . toJson ( step ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( i Ġ>= Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ( str Ġ+ "] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ln ( str Ġ+ Ġ", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild Intent ( header : String , Ġfooter : String ): Intent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStrict Mode . Vm Policy . Builder () ĊĠĠĠĠĠĠĠ ĠStrict Mode . set Vm Policy ( builder . build ()) ĊĊĠĠĠĠĠĠĠ Ġ// val Ġuri Right Ġ= ĠShared Pref Utility . getImage Uri ( this . application Context ) ĊĊĠĠĠĠĠĠ Ġ// Ġval Ġur is Ġ= ĠArrayList < Uri >() ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġur is . add ( uri Right ) ĊĊĠĠĠĠĠĠĠ Ġval Ġemail Intent Ġ= ĠIntent ( Intent . ACTION _ SEND _ MULTIPLE ) ĊĠĠĠĠĠĠĠ Ġemail Intent . add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĊĠĠĠĠĠĠĠ Ġemail Intent . type Ġ= Ġ" image /* " ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġm Tuple ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġfailure Ġmessage ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĠĠĠĠĠĠĠ Ġ// ĠSubject ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠShared Pref Utility . get ( Shared Pref Utility . key Name , ĠMain Application . application Context (). resources . getString ( R . string . run _ y asso _ 8 0 0 )) ĊĠĠĠĠĠĠĠ Ġemail Intent . putExtra ( Intent . EXTRA _ SUBJECT , Ġname ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġneed Ġto Ġinsert Ġimage Ġin Ġthe Ġmiddle Ġ... ĊĠĠĠĠĠĠĠ Ġemail Intent . putExtra ( Intent . EXTRA _ TEXT , Ġbuild Y asso Msg ( header , Ġfooter )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġload Ġimage ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġemail Intent . put Parcelable ArrayList Extra ( Intent . EXTRA _ STREAM , Ġur is ) ĊĠĠĠĠĠĠĠ Ġreturn Ġemail Intent ĊĠĠĠ Ġ} Ċ }