package Ġcom . h ites hs ah u . phone flip Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . hardware . Sensor Ċ import Ġandroid . hardware . Sensor Event Ċ import Ġandroid . hardware . Sensor EventListener Ċ import Ġandroid . hardware . Sensor Manager Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . databinding . Base Observable Ċ import Ġandroidx . databinding . Bind able Ċ import Ġjava . math . Round ingMode Ċ import Ġjava . text . Decimal Format Ċ Ċ class ĠSensor ViewModel Ġ: ĠBase Observable () Ġ{ ĊĊĠĠĠ Ġ// Sensor ĠLogic ĊĠĠĠ Ġprivate Ġvar Ġsensor Manager : ĠSensor Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaccel erometer Sensor : ĠSensor ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaccel erometer Present Ġ= Ġfalse ĊĊĠĠĠ Ġ// Internal ĠStates ĊĠĠĠ Ġprivate Ġvar Ġcurrent State : ĠDevice States Ġ= ĠDevice States . UNKNOWN ĊĠĠĠ Ġprivate Ġvar Ġcurrent Sensor Value Ġ= Ġ- 1 0 0 0 f ; ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnext State : ĠDevice States ĊĊĠĠĠ Ġ// ĠUI ĊĠĠĠ Ġprivate Ġvar Ġorientation Value : ĠString Ġ= Ġ"-- " ĊĠĠĠ Ġprivate Ġvar Ġsensor Value : ĠString Ġ= Ġcurrent State . toString () ĊĊĠĠĠ Ġenum Ġclass ĠDevice States Ġ{ ĊĠĠĠĠĠĠĠ ĠFACE _ UP , ĊĠĠĠĠĠĠĠ ĠFACE _ DOWN , ĊĠĠĠĠĠĠĠ ĠUNKNOWN ; ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFACE _ DOWN Ġ-> Ġ" Face ĠDown " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFACE _ UP Ġ-> Ġ" Face ĠUp " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" UNKNOWN " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bind able ĊĠĠĠ Ġfun Ġget Sensor Value (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsensor Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Bind able ĊĠĠĠ Ġfun Ġget Orientation Value (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġorientation Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Sensor Data ( z Value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsensor Value Ġ= Ġz Value ĊĠĠĠĠĠĠĠ Ġnotify PropertyChanged ( BR . sensor Value ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġround Off Decimal ( number : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdf Ġ= ĠDecimal Format ("# . #### ") ĊĠĠĠĠĠĠĠ Ġdf . rounding Mode Ġ= ĠRound ingMode . FLO OR ĊĠĠĠĠĠĠĠ Ġreturn Ġdf . format ( number ). toDouble (). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Orientation Value ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġorientation Value Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġnotify PropertyChanged ( BR . orientation Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Sensor ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsensor Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( context . getSystem Service ( AppCompatActivity . SENSOR _ SERVICE ) Ġas ĠSensor Manager ?) ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsensor List : ĠList < Sensor > Ġ= Ġget Sensor List ( Sensor . TYPE _ AC CEL ERO METER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sensor List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccel erometer Present Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccel erometer Sensor Ġ= Ġsensor List [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccel erometer Present Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Sensor Data (" No ĠAcc eler ometer ĠPresent Ġin Ġthe ĠDevice !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubscribe Sensor Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( accel erometer Present ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Manager ?. register Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccel erometer Listener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccel erometer Sensor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSensor Manager . SENSOR _ DELAY _ NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunsubscribe Sensor Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( accel erometer Present ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Manager ?. unregister Listener ( accel erometer Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ< ul > ĊĠĠĠĠ Ġ* Ġ< li > Ġvalues [ 0 ]: ĠAccel eration Ġminus ĠG x Ġon Ġthe Ġx - axis Ġ</ li > ĊĠĠĠĠ Ġ* Ġ< li > Ġvalues [ 1 ]: ĠAccel eration Ġminus ĠG y Ġon Ġthe Ġy - axis Ġ</ li > ĊĠĠĠĠ Ġ* Ġ< li > Ġvalues [ 2 ]: ĠAccel eration Ġminus ĠG z Ġon Ġthe Ġz - axis Ġ</ li > ĊĠĠĠĠ Ġ* Ġ</ ul > ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġaccel erometer Listener : ĠSensor EventListener Ġ= Ġobject Ġ: ĠSensor EventListener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sensor Changed ( event : ĠSensor Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Value : ĠFloat Ġ= Ġround Off Decimal ( event . values [ 2 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Sensor Value Ġ!= Ġz Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Sensor Data (" Z Index : Ġ$ z Value ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Update ĠState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Value Ġ> ĠT IL T _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext State Ġ= ĠDevice States . FACE _ UP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( z Value Ġ< Ġ- T IL T _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext State Ġ= ĠDevice States . FACE _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next State Ġ!= Ġcurrent State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State Ġ= Ġnext State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Orientation Value ( currentState . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Accuracy Changed ( sensor : ĠSensor ?, Ġaccuracy : ĠInt ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠT IL T _ THRESHOLD Ġ= Ġ 5 ĊĠĠĠ Ġ} Ċ }