package Ġbr . uf pe . cin . jon as . ce pl in . activity Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . hardware . Sensor Ċ import Ġandroid . hardware . Sensor Event Ċ import Ġandroid . hardware . Sensor EventListener Ċ import Ġandroid . hardware . Sensor Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . view . Motion Event Ċ import Ġbr . uf pe . cin . jon as . ce pl in . Event Manager Ċ import Ġbr . uf pe . cin . jon as . ce pl in . R Ċ import Ġbr . uf pe . cin . jon as . ce pl in . util . Acceleration Event Ċ import Ġbr . uf pe . cin . jon as . ce pl in . util . Light Event Ċ import Ġbr . uf pe . cin . jon as . ce pl in . util . Prox imity Event Ċ import Ġbr . uf pe . cin . jon as . ce pl in . util . Touch Event Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math . abs Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠSensor EventListener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Sensor Manager : ĠSensor Manager ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġacc Sensor : ĠSensor ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlight Sensor : ĠSensor ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġprox Sensor : ĠSensor ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġgesture Manager Ġ= ĠEvent Manager < Touch Event >() ĊĊĠĠĠ Ġprivate Ġval Ġacc Manager Ġ= ĠEvent Manager < Acceleration Event >() ĊĠĠĠ Ġprivate Ġval Ġlight Manager Ġ= ĠEvent Manager < Light Event >() ĊĠĠĠ Ġprivate Ġval Ġprox Manager Ġ= ĠEvent Manager < Prox imity Event >() ĊĊĠĠĠ Ġprivate Ġval ĠX Ġ= Ġ 2 0 . dp To Px ĊĠĠĠ Ġprivate Ġval ĠY Ġ= Ġ 1 0 . dp To Px ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġthis . set ContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġm Sensor Manager Ġ= Ġget System Service ( Context . SENSOR _ SERVICE ) Ġas ĠSensor Manager ĊĊĠĠĠĠĠĠĠ Ġacc Sensor Ġ= Ġm Sensor Manager ?. getDefault Sensor ( Sensor . TYPE _ AC CEL ERO METER ) ĊĠĠĠĠĠĠĠ Ġlight Sensor Ġ= Ġm Sensor Manager ?. getDefault Sensor ( Sensor . TYPE _ LIGHT ) ĊĠĠĠĠĠĠĠ Ġprox Sensor Ġ= Ġm Sensor Manager ?. getDefault Sensor ( Sensor . TYPE _ PRO X IM ITY ) ĊĊĊĠĠĠĠĠĠĠ Ġset Horizontal Rule () ĊĠĠĠĠĠĠĠ Ġ// setHorizontal Rule Rx Only () ĊĊĠĠĠĠĠĠĠ Ġset In P ocket Rule () ĊĠĠĠĠĠĠĠ Ġ// set In P ocket Rule Rx Only () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Horizontal Rule () Ġ{ ĊĠĠĠĠĠĠĠ Ġgesture Manager . as Stream (). sequence ({ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( a . x Ġ- Ġb . x ) Ġ> ĠX Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( a . y Ġ- Ġb . y ) Ġ< ĠY ĊĠĠĠĠĠĠĠ Ġ}, Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Horizontal Ġgesture ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpublish Subject Ġ= ĠPublish Subject . create < Touch Event >() ĊĊĠĠĠ Ġprivate Ġfun Ġset Horizontal Rule Rx Only ( count : ĠInt Ġ= Ġ 5 , Ġskip : ĠInt Ġ= Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsequence Equals Ġ= Ġthis . publish Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffer ( count , Ġskip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfilter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty () Ġ&& Ġcount Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. ( it . size Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( abs ( it [ i Ġ- Ġ 1 ]. x Ġ- Ġit [ i ]. x ) Ġ> ĠX ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġabs ( it [ i Ġ- Ġ 1 ]. y Ġ- Ġit [ i ]. y ) Ġ< ĠY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsequence Equals . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" Horizontal Ġgesture ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset In P ocket Rule () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġacceleration Rule Ġ= Ġacc Manager . as Stream (). sequence ({ Ġa , Ġb Ġ-> Ġa . y Ġ> Ġb . y Ġ&& Ġb . y Ġ< Ġ- 5 Ġ}, Ġ 2 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprox imity Rule Ġ= Ġprox Manager . as Stream (). sequence ({ Ġa , Ġb Ġ-> Ġa . dist Ġ> Ġb . dist Ġ&& Ġb . dist Ġ< Ġ 4 Ġ}, Ġ 2 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlight Rule Ġ= Ġlight Manager . as Stream (). sequence ({ Ġa , Ġb Ġ-> Ġa . lx Ġ> Ġb . lx Ġ&& Ġb . lx Ġ< Ġ 1 0 Ġ}, Ġ 2 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġacceleration Rule . merge ( prox imity Rule ). merge ( light Rule ). subscribe Ġ{ Ġlog (" IN ĠPO CKET !") Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġacceleration Events Ġ= ĠPublish Subject . create < Acceleration Event >() ĊĠĠĠ Ġprivate Ġval Ġprox imity Events Ġ= ĠPublish Subject . create < Prox imity Event >() ĊĊĠĠĠ Ġprivate Ġfun Ġset In P ocket Rule Rx Only () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġacceleration Rule Ġ= Ġget Sequence Observable ( acceleration Events , Ġ{ Ġa , Ġb Ġ-> Ġa . y Ġ> Ġb . y Ġ&& Ġb . y Ġ< Ġ- 5 Ġ}, Ġ 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġprox imity Rule Ġ= Ġget Sequence Observable ( prox imity Events , Ġ{ Ġa , Ġb Ġ-> Ġa . dist Ġ> Ġb . dist Ġ&& Ġb . dist Ġ< Ġ 4 Ġ}, Ġ 2 , Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmerged Rules Ġ= ĠObservable . merge ( acceleration Rule , Ġprox imity Rule ) ĊĠĠĠĠĠĠĠ Ġmerged Rules . buffer ( 5 , ĠTimeUnit . SECONDS , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġbundle Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġbundle . list Iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġmutable Set Of < Int >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( item . get OrNull ( 0 )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAccel eration Event Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . add ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPro x imity Event Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . add ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values . count () Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog (" IN ĠPO CKET !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġget Sequence Observable ( subject : ĠPublish Subject < T >, Ġpredicate : Ġ( T , ĠT ) Ġ-> ĠBoolean , Ġcount : ĠInt Ġ= Ġ 5 , Ġskip : ĠInt Ġ= Ġcount ): ĠObservable < Mutable List < T >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsubject . buffer ( count , Ġskip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfilter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty () Ġ&& Ġcount Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. ( it . size Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! predicate ( it [ i Ġ- Ġ 1 ], Ġit [ i ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġevent . action Mask ed ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Manager . add Event ( Touch Event ( event . x , Ġevent . y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish Subject . onNext ( Touch Event ( event . x , Ġevent . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sensor Changed ( sensor Event : ĠSensor Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( sensor Event . sensor . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSensor . TYPE _ AC CEL ERO METER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġsensor Event . values [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġsensor Event . values [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġsensor Event . values [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Manager . add Event ( Acceleration Event ( x , Ġy , Ġz )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacceleration Events . onNext ( Acceleration Event ( x , Ġy , Ġz )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSensor . TYPE _ LIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlight Ġ= Ġsensor Event . values [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlight Manager . add Event ( Light Event ( light )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSensor . TYPE _ PRO X IM ITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprox Ġ= Ġsensor Event . values [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox Manager . add Event ( Prox imity Event ( prox )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox imity Events . onNext ( Prox imity Event ( prox )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Accuracy Changed ( p 0 : ĠSensor ?, Ġp 1 : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġm Sensor Manager ?. register Listener ( this , Ġacc Sensor , ĠSensor Manager . SENSOR _ DELAY _ NORMAL ) ĊĠĠĠĠĠĠĠ Ġm Sensor Manager ?. register Listener ( this , Ġlight Sensor , ĠSensor Manager . SENSOR _ DELAY _ NORMAL ) ĊĠĠĠĠĠĠĠ Ġm Sensor Manager ?. register Listener ( this , Ġprox Sensor , ĠSensor Manager . SENSOR _ DELAY _ NORMAL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġm Sensor Manager ?. unregister Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Simple Ġfunction Ġto Ġlog Ġon Ġthe Ġphone Ġscreen ĊĠĠĠ Ġfun Ġlog ( s : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdisplay Text . text Ġ= Ġ"$ s \ n ${ display Text . text }" ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠInt . dp To Px : ĠInt Ġget () Ġ= Ġ( this Ġ* ĠResources . getSystem (). display Metrics . density ). toInt () Ċ val ĠInt . px To Dp : ĠInt Ġget () Ġ= Ġ( this Ġ/ ĠResources . getSystem (). display Metrics . density ). toInt ()