package Ġit . nc ort i . em g visual izer . ui . graph Ċ Ċ import Ġandroid . content . Content Values . TAG Ċ import Ġjava . util . Calendar Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġcom . nc ort i . my on n aise . Command List Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġit . nc ort i . em g visual izer . d agger . Device Manager Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . Tone Generator Ċ import Ġjava . lang . System . nano Time ĊĊ Ċ val Ġtg Ġ= ĠT one Generator ( Audio Manager . STREAM _ NOTIFICATION , Ġ 1 0 0 ) Ċ var Ġtime Trial Ġ= Ġ 3 0 0 0 Ċ Ċ class ĠGraph Presenter ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġview : ĠGraph Contract . View , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdevice Manager : ĠDevice Manager Ċ ) Ġ: ĠGraph Contract . Presenter ( view ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġdata Subscription : ĠDis posable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġcounter : ĠAtomicInteger Ġ= ĠAtomicInteger () ĊĠĠĠ Ġprivate Ġval Ġbuffer : ĠArrayList < Float Array > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġval Ġtime Buffer : ĠArrayList < Long > Ġ= Ġarray ListOf () ĊĊĊĠĠĠ Ġoverride Ġfun Ġcreate () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġview . show Collected Points ( counter . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġview . start Graph ( false ) ĊĠĠĠĠĠĠĠ Ġdata Subscription ?. dispose () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠUpload ĠCSV Ġto Ġfire store ĊĠĠĠ ĠUpload Ġa Ġsession Ġfor Ġthis Ġuser Ġto Ġfirebase ĊĠĠĠ ĠIncrease Ġsession Ġcount Ġby Ġ 1 ĊĠĠĠ ĠClear Ġbuffer ĊĠĠĠ ĠClear Ġcounter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Save Pressed () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" save Ġpressed ") ĊĊĠĠĠĠĠĠĠ Ġview . save Csv File ( create Csv ( buffer , Ġtime Buffer )) ĊĠĠĠĠĠĠĠ Ġbuffer . clear () ĊĠĠĠĠĠĠĠ Ġtime Buffer . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠClear Ġbuffer ĊĠĠĠ ĠClear Ġcounter ĊĠĠĠ ĠCall ĠStart ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Stop Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġview . disable Repeat Button () ĊĠĠĠĠĠĠĠ Ġview . enable Start Button () ĊĠĠĠĠĠĠĠ Ġview . enable Save Button () ĊĠĠĠĠĠĠĠ Ġcounter . set ( 0 ) ĊĠĠĠĠĠĠĠ Ġview . show Collected Points ( 0 ) ĊĠĠĠĠĠĠĠ Ġdata Subscription ?. dispose () ĊĠĠĠĠĠĠĠ Ġdevice Manager . my o ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . send Command ( Command List . stop Streaming ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠStart Ġstreaming Ġmy o Ġdata ĊĠĠĠ ĠStart Ġrecording Ġin Ġbuffer Ġfor Ġcsv ĊĠĠĠ ĠStart Ġcounter , Ġand Ġbe Ġready Ġto Ġstop Ġcounter Ġwhen Ġit Ġhits Ġtime ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠonStart Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcounter Val Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġbuffer . clear () Ġ// clear s Ġthe Ġcsv Ġbuffer ĊĠĠĠĠĠĠĠ Ġtime Buffer . clear () ĊĠĠĠĠĠĠĠ Ġview . disable Start Button () ĊĠĠĠĠĠĠĠ Ġview . enable Repeat Button () ĊĠĠĠĠĠĠĠ Ġview . disable Save Button () ĊĊĠĠĠĠĠĠĠ Ġdevice Manager . my o ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . is Streaming ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . send Command ( Command List . em g Filtered Only ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . send Command ( Command List . stop Streaming ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . hide No Streaming Message () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Subscription ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . is Disposed ) Ġthis . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Subscription Ġ= Ġthis . data Flow able () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . start Graph ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . setStatus Text (" Done , Ġpress ĠSave Ġto Ġsubmit Ġtrial , Ġpress ĠStart Ġto Ġredo .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . disable Repeat Button () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . enable Start Button () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . show Data ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . add ( it ) Ġ// [ 1 , Ġ 2 , Ġ 3 , Ġ 4 , Ġ 5 , Ġ 6 , Ġ 7 , Ġ 8 ] Ġneed Ġto Ġadd Ġa Ġ 1 0 3 Ġto Ġthe Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Buffer . add ( ĠSystem . currentTimeMillis () Ġ- ĠstartTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . show Collected Points ( counter . increment AndGet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . setStatus Text ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ= Ġcounter . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ< Ġ 2 0 0 Ġ-> Ġview . setStatus Text (" Starting Ġtask Ġin Ġ 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ< Ġ 4 0 0 Ġ-> Ġview . setStatus Text (" Starting Ġtask Ġin Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ< Ġ 5 9 9 Ġ-> Ġview . setStatus Text (" Starting Ġtask Ġin Ġ 1 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ< Ġ 6 0 0 Ġ-> Ġtg . start Tone ( Tone Generator . T ONE _ PROP _ B EE P ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ> Ġ 1 1 9 9 +( time Trial ) Ġ-> Ġon Stop Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ> Ġ 6 0 0 +( time Trial ) Ġ-> Ġview . setStatus Text (" Task Ġover , Ġremain Ġstill Ġfor Ġ 3 Ġseconds ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcounter Val Ġ> Ġ 5 9 8 +( time Trial ) Ġ-> Ġtg . start Tone ( Tone Generator . T ONE _ PROP _ B EE P 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġview . setStatus Text (" Collect ing ĠData ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġcreate Csv ( buffer : ĠArrayList < Float Array >, Ġtime Buffer : ĠArrayList < Long >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġbuffer . forEach Indexed Ġ{ Ġi , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( time Buffer [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠstringBuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Trial Time (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Trial ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Trial Time ( seconds : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtime Trial Ġ= Ġseconds ĊĠĠĠ Ġ} Ċ Ċ }