/* Ċ Ġ* ĠCopyright Ġ 2 0 1 5 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġpl . to uk . android . bubble Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . hardware . Sensor Ċ import Ġandroid . hardware . Sensor Event Ċ import Ġandroid . hardware . Sensor EventListener Ċ import Ġandroid . hardware . Sensor Manager Ċ import Ġpl . to uk . android . bubble . coordinates . Coordinates Ċ import Ġpl . to uk . android . bubble . coordinates . Coordinates Calculator Ċ import Ġpl . to uk . android . bubble . listener . Bubble Listener Ċ import Ġpl . to uk . android . bubble . orientation . Orientation Ċ import Ġpl . to uk . android . bubble . state . Bubble StateMachine Ċ import Ġrx . Observable Ċ import Ġrx . subjects . Publish Subject Ċ Ċ public Ġclass ĠB ubble : ĠSensor EventListener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSAMPLE _ SIZE Ġ= Ġ 2 0 ĊĠĠĠ Ġ} ĊĠĠĠ Ġenum Ġclass ĠRegistration Ġ{ ĠUN REGISTER ED , ĠLIST ENER , ĠOB SERVER Ġ} ĊĊĠĠĠ Ġvar Ġorientation Publisher : ĠPublish Subject < Bubble Event >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġbubble Listener : ĠB ubble Listener ? Ġ= Ġnull ĊĊĊĠĠĠ Ġlateinit Ġprivate Ġvar Ġaccel erometer Sensor : ĠSensor ĊĠĠĠ Ġlateinit Ġprivate Ġvar Ġmagnetic Sensor : ĠSensor ĊĠĠĠ Ġlateinit Ġprivate Ġvar Ġsensor Manager : ĠSensor Manager ĊĠĠĠ Ġlateinit Ġprivate Ġvar Ġcoordinates Publisher : ĠPublish Subject < Coordinates > ĊĠĠĠ Ġprivate Ġval Ġorientation StateMachine Ġ= ĠB ubble StateMachine () ĊĠĠĠ Ġprivate Ġval Ġcoordinates Calculator Ġ= ĠCoordinates Calculator () ĊĊĠĠĠ Ġvar Ġregistration Ġ= ĠRegistration . UN REGISTER ED ĊĊĠĠĠ Ġpublic Ġfun Ġregister ( context : ĠContext ): ĠObservable < Bubble Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġorientation Publisher Ġ= ĠPublish Subject . create () ĊĠĠĠĠĠĠĠ Ġregistration Ġ= ĠRegistration . OB SERVER ĊĊĠĠĠĠĠĠĠ Ġsetup And Register Sensors Listeners ( context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġorientation Publisher !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġregister ( bubble Listener : ĠB ubble Listener , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . bubble Listener Ġ= Ġbubble Listener ĊĠĠĠĠĠĠĠ Ġregistration Ġ= ĠRegistration . LIST ENER ĊĊĠĠĠĠĠĠĠ Ġsetup And Register Sensors Listeners ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup And Register Sensors Listeners ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoordinates Publisher Ġ= ĠPublish Subject . create () ĊĠĠĠĠĠĠĠ Ġcoordinates Publisher ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffer ( SAMPLE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcoordinates : ĠList < Coordinates > Ġ-> Ġcoordinates Calculator . calculate Average ( coordinates ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġcoordinates : ĠCoordinates Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation StateMachine . update ( coordinates )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinform Client ( orientation StateMachine . orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload Sensors ( context ) ĊĠĠĠĠĠĠĠ Ġsensor Manager . register Listener ( this , Ġaccel erometer Sensor , ĠSensor Manager . SENSOR _ DELAY _ UI ) ĊĠĠĠĠĠĠĠ Ġsensor Manager . register Listener ( this , Ġmagnetic Sensor , ĠSensor Manager . SENSOR _ DELAY _ UI ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinform Client ( orientation : ĠOrientation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( registration Ġ== ĠRegistration . OB SERVER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Publisher !!. onNext ( Bubble Event ( orientation )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbubble Listener !!. on Orientation Changed ( Bubble Event ( orientation )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sensor Changed ( sensor Event : ĠSensor Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoordinates Publisher . onNext ( coordinates Calculator . calculate ( sensor Event )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Accuracy Changed ( sensor : ĠSensor ?, Ġaccuracy : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Sensors ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsensor Manager Ġ= Ġcontext . getSystem Service ( Context . SENSOR _ SERVICE ) Ġas ĠSensor Manager ĊĠĠĠĠĠĠĠ Ġaccel erometer Sensor Ġ= Ġsensor Manager . getDefault Sensor ( Sensor . TYPE _ AC CEL ERO METER ) ĊĠĠĠĠĠĠĠ Ġmagnetic Sensor Ġ= Ġsensor Manager . getDefault Sensor ( Sensor . TYPE _ MAG NET IC _ FIELD ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġunregister () Ġ{ ĊĠĠĠĠĠĠĠ Ġsensor Manager . unregister Listener ( this ) ĊĠĠĠĠĠĠĠ Ġif Registered () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinates Publisher . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( registration Ġ== ĠRegistration . OB SERVER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Publisher !!. on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbubble Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġif Registered ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( registration Ġ!= ĠRegistration . UN REGISTER ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . invoke () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Detector Ġmust Ġbe Ġregistered Ġbefore Ġuse .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }