package Ġcom . fer n andom umb ach . react n atives h ake detector Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġcom . facebook . react . bridge .* Ċ import Ġcom . facebook . react . modules . core . Device Event Manager Module Ċ import Ġcom . gv ill ani . r xs ensors . Rx Sensor Event Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . processors . Publish Processor Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ class ĠRN Sh ake Detector Module ( react Context : ĠReact ApplicationContext ) Ġ: ĊĠĠĠ ĠReact Context Base Java Module ( react Context ), ĠLifecycle EventListener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtag Ġ= Ġ" RN Sh ake Detector Module " ĊĠĠĠ Ġprivate Ġval Ġsh ake Events : ĠAtomic Reference < Disposable ?> Ġ= ĠAtomic Reference ( null ) ĊĠĠĠ Ġprivate Ġvar Ġm React Context : ĠReact ApplicationContext Ġ= Ġreact Context ĊĠĠĠ Ġprivate Ġvar Ġm ApplicationContext : ĠContext Ġ= Ġreact Context . application Context ĊĠĠĠ Ġprivate Ġvar Ġclassifier V 2 : ĠAudio Classifier Ġ= ĠAudio Classifier ( m ApplicationContext ) ĊĠĠĠ Ġprivate Ġval Ġm Handler Thread Ġ= ĠHandler Thread (" Recognition Handler Thread ") ĊĠĠĠ Ġprivate Ġval Ġm Handler : ĠHandler ĊĠĠĠ Ġprivate Ġval Ġm Raw Handler Thread Ġ= ĠHandler Thread (" Raw Recognition Handler Thread ") ĊĠĠĠ Ġprivate Ġval Ġm Raw Handler : ĠHandler ĊĠĠĠ Ġprivate Ġvar Ġraw Sub : ĠDis posable ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠgetName () Ġ= Ġtag ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm Handler Thread . start () ĊĠĠĠĠĠĠĠ Ġm Handler Ġ= ĠHandler ( m Handler Thread . lo oper ) ĊĊĠĠĠĠĠĠĠ Ġm Raw Handler Thread . start () ĊĠĠĠĠĠĠĠ Ġm Raw Handler Ġ= ĠHandler ( m Raw Handler Thread . lo oper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ React Method ĊĠĠĠ Ġfun Ġstart ( ĊĠĠĠĠĠĠĠ Ġmax Samples : ĠInt , ĊĠĠĠĠĠĠĠ Ġmin Time Between Samples Ms : ĠInt , ĊĠĠĠĠĠĠĠ Ġvisible Time Range Ms : ĠInt , ĊĠĠĠĠĠĠĠ Ġmagnitude Threshold : ĠInt , ĊĠĠĠĠĠĠĠ Ġpercent Over Threshold For Sh ake : ĠInt , ĊĠĠĠĠĠĠĠ Ġuse Audio Classifier : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġpromise : ĠPromise ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w ( tag , Ġ" Starting Ġsh ake Ġevent Ġdetector ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Start ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Samples , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Time Between Samples Ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Time Range Ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmagnitude Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Over Threshold For Sh ake , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Audio Classifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject (" Could Ġnot Ġstart ĠSh ake Service ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpromise . resolve ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ React Method ĊĠĠĠ Ġfun Ġstop ( promise : ĠPromise ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclassifier V 2 . stop Recording () ĊĊĠĠĠĠĠĠĠ ĠLog . w ( tag , Ġ" Stopping Ġsh ake Ġevent Ġdetector ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . resolve ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . reject (" Could Ġnot Ġstop ĠSh ake Service ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ React Method ĊĠĠĠ Ġfun Ġclassify ( promise : ĠPromise ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Classification Ġ= Ġclassifier V 2 . classify () ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠArguments . create Map () ĊĠĠĠĠĠĠĠ Ġcurrent Classification . forEach Ġ{ Ġ( k , Ġv ) Ġ-> Ġvalues . put Double ( k , Ġv . toDouble ()) Ġ} ĊĠĠĠĠĠĠĠ Ġpromise . resolve ( values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Host Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Host Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Host Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Stop () ĊĠĠĠĠĠĠĠ Ġm Handler Thread . quit () ĊĠĠĠĠĠĠĠ Ġm Raw Handler Thread . quit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinternal Start ( ĊĠĠĠĠĠĠĠ Ġmax Samples : ĠInt , ĊĠĠĠĠĠĠĠ Ġmin Time Between Samples Ms : ĠInt , ĊĠĠĠĠĠĠĠ Ġvisible Time Range Ms : ĠInt , ĊĠĠĠĠĠĠĠ Ġmagnitude Threshold : ĠInt , ĊĠĠĠĠĠĠĠ Ġpercent Over Threshold For Sh ake : ĠInt , ĊĠĠĠĠĠĠĠ Ġuse Classifier : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Stop () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( use Classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( tag , Ġ" initialize Audio Classifier ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclassifier V 2 . start Recording () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . w ( tag , Ġ" Starting Ġnew ĠSh ake EventSource ") ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= ĠSh ake EventSource ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ApplicationContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Samples . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Time Between Samples Ms , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Time Range Ms , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmagnitude Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Over Threshold For Sh ake , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsh ake Events . set ( source . stream (). subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( tag , Ġ" detected Ġsh ake Ġevent ! Ġ" Ġ+ Ġit . magnitude . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Sh ake Event ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( tag , Ġ" Error Ġdetect ing Ġsh ake Ġevents ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠ Ġraw Sub Ġ= Ġsource . raw Stream (). buffer ( 1 , ĠTimeUnit . SECONDS ). subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( tag , Ġ" raw Ġtime Ġreached ! Ġtotal Ġ= Ġ${ it . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Raw Events ( it ) ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( tag , Ġ" Error Ġreading Ġraw Ġvalues ", Ġit ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinternal Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġclassifier V 2 . stop Recording () ĊĠĠĠĠĠĠĠ Ġsh ake Events . get (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ?. is Disposed Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsh ake Events . set ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( raw Sub ?. is Disposed Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Sub ?. dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Sh ake Event ( sensor Event : ĠSh ake Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w ( tag , Ġ" on Sh ake Event Ġ" Ġ+ Ġsensor Event . magnitude . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġevent When Ġ= ĠCalendar . getInstance (). time In Millis ĊĠĠĠĠĠĠĠ Ġm Handler . post Delayed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġev Ġ= ĠArguments . create Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . put Double (" percent Over Threshold ", Ġsensor Event . magnitude ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . put Double (" when ", Ġevent When . toDouble ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Classification Ġ= Ġclassifier V 2 . classify () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠArguments . create Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Classification . forEach Ġ{ Ġ( k , Ġv ) Ġ-> Ġvalues . put Double ( k , Ġv . toDouble ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . put Map (" class ifications ", Ġvalues ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m React Context . has Active React Instance ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm React Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get JS Module ( Device Event Manager Module . RCT Device EventEmitter :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. emit (" shake ", Ġev ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 3 0 0 Ġ// Ġwait Ġfor Ġ 1 . 3 Ġseconds Ġto Ġcollect Ġmore Ġaudio ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Raw Events ( events : ĠList < Rx Sensor Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Raw Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġev Ġ= ĠArguments . create Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( event Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠArguments . create Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . put Double (" ts ", Ġevent . timestamp . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . put Double (" x ", Ġevent . values [ 0 ]. toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . put Double (" y ", Ġevent . values [ 0 ]. toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . put Double (" z ", Ġevent . values [ 0 ]. toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm . put Int (" accuracy ", Ġevent . accuracy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġev . push Map ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m React Context . has Active React Instance ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm React Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get JS Module ( Device Event Manager Module . RCT Device EventEmitter :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. emit (" raw Sh ake Data ", Ġev ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ