package Ġno . n ord ic semi . android . b linky . Activities Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Component Callbacks 2 Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . speech . tts . Text ToS peech Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġno . n ord ic semi . android . b linky . utils . User Database Ċ import Ġorg . jetbrains . ank o . do Async Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* ĊĊ Ċ @ Suppress (" NULL ABILITY _ MIS MATCH _ BASE D _ ON _ JAVA _ AN NOT ATIONS ", Ġ" DEPRECATED _ IDENTITY _ EQUAL S ", Ġ" unused ") Ċ Ċ /** Ċ Ġ* ĠThe Ġpurpose Ġof Ġthis Ġactivity Ġis Ġto Ġreduce Ġcode Ġduplication Ċ Ġ* ĠIt Ġcan Ġbe Ġinherited Ġfrom Ġany Ġactivity , Ġand Ġit Ġinherits ĠAppCompatActivity Ċ Ġ*/ Ċ Ċ open Ġclass ĠBase Activity Ġ: ĠAppCompatActivity (), ĠComponent Callbacks 2 , ĠText ToS peech . OnInit Listener Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġdatabase Instance : ĠUser Database Ġ// Late init Ġinstance Ġof Ġthe Ġdatabase ĊĠĠĠ Ġprivate Ġvar Ġcurrent Count Ġ= Ġ 0 Ġ// Keep ing Ġtrack Ġof Ġthe Ġcurrent Count ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġt ts : ĠText ToS peech Ġ// Late init Ġinstance Ġof Ġthe Ġt ts ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdb : ĠFirebase Fire store Ġ// FI restore Ġglobal Ġinstance Ġwithin Ġbase Ġactivity ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġboard Connected S peak () Ġ{ ĊĠĠĠĠĠĠĠ Ġt ts . language Ġ= ĠLocale . US ĊĠĠĠĠĠĠĠ Ġt ts . speak (" The Ġboard Ġis Ġconnected ", ĠText ToS peech . QUEUE _ ADD , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġboard Disconnected S peak () Ġ{ ĊĠĠĠĠĠĠĠ Ġt ts . language Ġ= ĠLocale . US ĊĠĠĠĠĠĠĠ Ġt ts . speak (" The Ġboard Ġis Ġdisconnected , Ġplease Ġreconnect ", ĠText ToS peech . QUEUE _ ADD , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġtimestamp Ġdown Ġto Ġms Ġlevel ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġfun Ġget TimeStamp (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠDate () ĊĠĠĠĠĠĠĠ Ġreturn Ġdate . time . toString () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġwill Ġupdate Ġthe Ġdatabase Ġaccordingly , Ġall Ġthat Ġis Ġneeded Ġis Ġto Ġpass Ġwhich Ġsensor Ġto Ġupdate Ġfor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġsensor Trigger red ( sensor Type : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠHashMap < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġuser [ getTime Stamp ()] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġa Ġnew Ġdocument ĊĠĠĠĠĠĠĠ Ġwhen Ġ( sensor Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DISTANCE 1 " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . collection (" D 1 "). document ( getDate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. update ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" DISTANCE 2 " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . collection (" D 2 "). document ( getDate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. update ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġtakes Ġin Ġint Arrays , Ġthen Ġupdates Ġthe Ġserver Ġaccordingly Ġbased Ġon Ġtimestamps ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġremove Z eros ( list 1 : ĠInt Array ?): ĠMutable List < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable List : ĠMutable List < Int > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlist 1 !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable List . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Arrays ToServer ( list 1 : ĠInt Array ?, Ġlist 2 : ĠInt Array ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// convert Ġthe Ġarray Ġto Ġa Ġmutable List ĊĠĠĠĠĠĠĠ Ġval Ġlist 1 IntArray Ġ= Ġremove Z eros ( list 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġlist 2 IntArray Ġ= Ġremove Z eros ( list 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// sort Ġthe Ġar rray s ĊĠĠĠĠĠĠĠ Ġlist 1 IntArray . sorted () ĊĠĠĠĠĠĠĠ Ġlist 2 IntArray . sorted () ĊĊĠĠĠĠĠĠĠ Ġif ( list 1 IntArray . size == 0 Ġ|| Ġlist 2 IntArray . size == 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("> >>>> >> >>> IN Ġthis Ġcatch ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġorder edList : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġval ĠmaxSize Ġ= Ġlist 1 IntArray . size Ġ+ Ġlist 2 IntArray . size ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. maxSize ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list 1 IntArray . isNotEmpty () Ġ&& Ġlist 2 IntArray . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist 1 IntArray [ 0 ] Ġ< Ġlist 2 IntArray [ 0 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder edList . add (" D 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist 1 IntArray . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist 1 IntArray [ 0 ] Ġ> Ġlist 2 IntArray [ 0 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder edList . add (" D 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist 2 IntArray . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist 1 IntArray [ 0 ] Ġ== Ġlist 2 IntArray [ 0 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder edList . add (" D 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist 2 IntArray . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list 2 IntArray . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder edList . add (" DISTANCE 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( list 1 IntArray . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder edList . add (" DISTANCE 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" Data ĠĠ Ġ$ ordered List ") ĊĊĠĠĠĠĠĠĠ Ġdo Async Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġorder edList ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ" D 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Trigger red (" D 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( i Ġ== Ġ" D 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Trigger red (" D 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġt ts Ġ= ĠText ToS peech ( this , Ġthis ) Ġ// Inst antiate Ġt ts ĊĠĠĠĠĠĠĠ Ġdb Ġ= ĠFirebase Fire store . getInstance () Ġ// Inst antiate Ġfire store ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Init ( status : ĠInt ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġwill Ġget Ġthe Ġcurrent Ġtimestamp Ġin Ġthis Ġformat ĊĠĠĠĠ Ġ* Ġ" hh / mm / ss / a " ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġfun ĠgetCurrent Time Using Date (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠDate () ĊĠĠĠĠĠĠĠ Ġval Ġstr DateFormat Ġ= Ġ" hh / mm / ss / a " ĊĠĠĠĠĠĠĠ Ġval ĠdateFormat Ġ= ĠSimpleDateFormat ( str DateFormat ) ĊĠĠĠĠĠĠĠ Ġreturn ĠdateFormat . format ( date ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġwill Ġget Ġthe Ġcurrent Ġdate Ġin Ġy yy ymm dd Ġformat ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġprivate Ġfun Ġget Date (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġformat 1 Ġ= ĠSimpleDateFormat (" yyyy MM dd ") ĊĠĠĠĠĠĠĠ Ġval Ġformatted Ġ= Ġformat 1 . format ( cal . time ) ĊĠĠĠĠĠĠĠ Ġprintln ( formatted . length ) ĊĠĠĠĠĠĠĠ Ġreturn Ġformatted . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOver riding Ġon Destroy , Ġto Ġsafely Ġdisable Ġthe ĠT TS ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt ts . stop () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt ts . shutdown () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġreset Counter () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Count Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFunction Ġto Ġmake Ġswitching Ġactivities Ġa Ġlittle Ġeasier ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġfun Ġswitch Activity ( activity Name : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmy Intent Ġ= ĠIntent ( this , Ġactivity Name :: class . java ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( my Intent ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ