package Ġcom . ikan osh io k ara . shake detector čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . hardware . Sensor č Ċ import Ġandroid . hardware . Sensor Event č Ċ import Ġandroid . hardware . Sensor EventListener č Ċ import Ġandroid . hardware . Sensor Manager č Ċ import Ġkotlin . math . atan 2 č Ċ import Ġkotlin . math . pow č Ċ import Ġkotlin . math . sqrt č Ċ import Ġkotlinx . coroutines .* čĊč Ċ class ĠSh ake Manager ( context : ĠContext , Ġlistener : ĠSh ake Listener ) Ġ{ čĊĠĠĠ Ġprivate Ġval ĠmContext Ġ= Ġcontext čĊĠĠĠ Ġprivate Ġval Ġm Listener Ġ= Ġlistener čĊĠĠĠ Ġprivate Ġval Ġm Sensor Manager Ġ= Ġcontext . getSystem Service ( Context . SENSOR _ SERVICE ) Ġas ĠSensor Manager čĊčĊĠĠĠ Ġ// éĩį åĬĽ čĊĠĠĠ Ġprivate Ġvar Ġm Gravity X : ĠFloat Ġ= Ġ 1 . 0 f čĊĠĠĠ Ġprivate Ġvar Ġm Gravity Y : ĠFloat Ġ= Ġ 1 . 0 f čĊĠĠĠ Ġprivate Ġvar Ġm Gravity Z : ĠFloat Ġ= Ġ 1 . 0 f čĊčĊĠĠĠ Ġ// ç· ļ å½¢ åĬł éĢŁåº¦ čĊĠĠĠ Ġprivate Ġvar Ġm Linear Accel X : ĠFloat Ġ= Ġ 0 . 0 f čĊĠĠĠ Ġprivate Ġvar Ġm Linear Accel Y : ĠFloat Ġ= Ġ 0 . 0 f čĊĠĠĠ Ġprivate Ġvar Ġm Linear Accel Z : ĠFloat Ġ= Ġ 0 . 0 f čĊĠĠĠ Ġprivate Ġvar Ġm Linear Accel Total : ĠFloat Ġ= Ġ 0 . 0 f čĊĠĠĠ Ġprivate Ġvar Ġm Old Linear Accel Z : ĠFloat Ġ= Ġ 0 . 0 f čĊčĊĠĠĠ Ġ// åĲĦ ç¨® ãĥķ ãĥ© ãĤ° čĊĠĠĠ Ġprivate Ġvar Ġm Gesture Type : ĠInt Ġ= Ġ 0 čĊĠĠĠ Ġprivate Ġvar Ġm Slash Flag : ĠBoolean Ġ= Ġfalse čĊĠĠĠ Ġprivate Ġvar Ġm Sh ake After Flag : ĠBoolean Ġ= Ġfalse čĊĠĠĠ Ġprivate Ġvar Ġm Sh ake Detect ing : ĠBoolean Ġ= Ġfalse čĊčĊĠĠĠ Ġ// shake çĶ¨ ãģ® å±± čĊĠĠĠ Ġprivate Ġvar Ġm Tmp Point : ĠFloat Ġ= Ġ 0 . 0 f čĊĠĠĠ Ġprivate Ġvar Ġm Mount Points : ĠMutable List < Float > Ġ= Ġmutable ListOf () čĊčĊčĊĠĠĠ Ġ// å®ļ æķ° čĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġ// ãĤ¸ãĤ§ ãĤ¹ ãĥģ ãĥ£ ãĥ¼ãĤ¿ ãĤ¤ ãĥĹ çĶ¨ å®ļ æķ° čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG EST URE _ TYPE _ NONE : ĠInt Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG EST URE _ TYPE _ SL ASH _ LEFT : ĠInt Ġ= Ġ 1 čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG EST URE _ TYPE _ SL ASH _ RIGHT : ĠInt Ġ= Ġ 2 čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG EST URE _ TYPE _ SL ASH _ UP : ĠInt Ġ= Ġ 3 čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG EST URE _ TYPE _ SL ASH _ DOWN : ĠInt Ġ= Ġ 4 čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠG EST URE _ TYPE _ SHA KE : ĠInt Ġ= Ġ 5 čĊčĊĠĠĠĠĠĠĠ Ġ// Ġ ãĤ¹ ãĥ© ãĥĥ ãĤ·ãĥ¥ ãģ® ãģĹãģ į ãģĦ åĢ¤ ãģ¨ ãģªãĤĭ åĬł éĢŁåº¦ čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSL ASH _ AC CEL : ĠFloat Ġ= Ġ 4 0 . 0 f čĊĠĠĠĠĠĠĠ Ġ// ĠSh ake ãģ® æ¤ľ åĩº éĸ ¾ åĢ¤ čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSHA KE _ AC CEL : ĠFloat Ġ= Ġ 1 5 . 0 f čĊĠĠĠĠĠĠĠ Ġ// Ġ å¾ħ æ©Ł æĻĤéĸĵ čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNON _ DE TE CTION _ TIME : ĠLong Ġ= Ġ 6 0 0 čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// å¿ħè¦ģ ãģª Sensor ãģ® çĻ»éĮ² čĊĠĠĠ Ġfun Ġstart Detection (){ čĊĠĠĠĠĠĠĠ Ġval Ġsensors : ĠList < Sensor > Ġ= Ġm Sensor Manager . get Sensor List ( Sensor . TYPE _ ALL ) čĊĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġsensors ){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( s . type ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSensor . TYPE _ GR AV ITY -> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Sensor Manager . register Listener ( m Accel Listener , Ġs , ĠSensor Manager . SENSOR _ DELAY _ UI ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// m Sensor Manager . register Listener ( m Accel Listener , Ġs , ĠSensor Manager . SENSOR _ DELAY _ NORMAL ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSensor . TYPE _ LINEAR _ AC CELER ATION Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Sensor Manager . register Listener ( m Accel Listener , Ġs , ĠSensor Manager . SENSOR _ DELAY _ UI ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// m Sensor Manager . register Listener ( m Accel Listener , Ġs , ĠSensor Manager . SENSOR _ DELAY _ NORMAL ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// Sensor ãģ® çĻ»éĮ² åīĬéĻ¤ čĊĠĠĠ Ġfun Ġstop Detection (){ čĊĠĠĠĠĠĠĠ Ġm Sensor Manager . unregister Listener ( m Accel Listener ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// Sensor EventListener ãģ® ä½ľæĪĲ čĊĠĠĠ Ġprivate Ġval Ġm Accel Listener : ĠSensor EventListener Ġ= Ġobject : ĠSensor EventListener { čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sensor Changed ( event : ĠSensor Event ?) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event ?. sensor !!. type Ġ== ĠSensor . TYPE _ GR AV ITY ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gravity X Ġ= Ġevent . values [ 0 ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gravity Y Ġ= Ġevent . values [ 1 ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gravity Z Ġ= Ġevent . values [ 2 ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( event . sensor !!. type Ġ== ĠSensor . TYPE _ LINEAR _ AC CELER ATION ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Linear Accel X Ġ= Ġevent . values [ 0 ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Linear Accel Y Ġ= Ġevent . values [ 1 ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Linear Accel Z Ġ= Ġevent . values [ 2 ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Linear Accel Total Ġ= Ġcalc Vector Length ( m Linear Accel X , Ġm Linear Accel Y , Ġm Linear Accel Z ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Linear Accel Total Ġ> ĠSL ASH _ AC CEL ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Slash Flag Ġ&& Ġ! m Sh ake After Flag Ġ&& Ġm Gesture Type Ġ== ĠG EST URE _ TYPE _ NONE ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// slash ãģ® è§Ĵ åº¦ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgravity Angle : ĠInt Ġ= ĠMath . to Degrees ( atan 2 ( m Gravity Z , Ġm Gravity X ). toDouble ()). toInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevice Roll Ġ= Ġ 9 0 Ġ- Ġgravity Angle čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccel Angle : ĠInt Ġ= ĠMath . to Degrees ( atan 2 ( m Linear Accel Z , Ġm Linear Accel X ). toDouble ()). toInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġslash Angle : ĠInt Ġ= Ġif ( accel Angle Ġ+ Ġdevice Roll Ġ>= Ġ 0 ) Ġaccel Angle Ġ+ Ġdevice Roll Ġelse Ġaccel Angle Ġ+ Ġdevice Roll Ġ+ Ġ 3 6 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( slash Angle Ġ> Ġ 3 6 0 ) Ġslash Angle Ġ-= Ġ 3 6 0 čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslash Angle Ġin Ġ 0 .. 4 5 Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Type Ġ= ĠG EST URE _ TYPE _ SL ASH _ RIGHT čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslash Angle Ġ<= Ġ 1 3 5 Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Type Ġ= ĠG EST URE _ TYPE _ SL ASH _ UP čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslash Angle Ġ<= Ġ 2 2 5 Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Type Ġ= ĠG EST URE _ TYPE _ SL ASH _ LEFT čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslash Angle Ġ<= Ġ 3 1 5 Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Type Ġ= ĠG EST URE _ TYPE _ SL ASH _ DOWN čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslash Angle Ġ<= Ġ 3 6 0 Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Type Ġ= ĠG EST URE _ TYPE _ SL ASH _ RIGHT čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Slash Flag Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( NON _ DE TE CTION _ TIME ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Slash Flag Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¾ħ æ©Ł éĸĭå§ĭ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Linear Accel Total Ġ> ĠSHA KE _ AC CEL Ġ&& Ġ! m Sh ake Detect ing ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Sh ake Detect ing Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mount Points Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Tmp Point Ġ= Ġ 1 . 0 f čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// slash æ¤ľ çŁ¥ ( on Sh ake Detected ãģ« æĬķ ãģ Ĵ ãĤĭ ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( m Linear Accel Total Ġ< ĠSHA KE _ AC CEL Ġ&& Ġm Sh ake Detect ing ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Sh ake Detect ing Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Gesture Type Ġ!= ĠG EST URE _ TYPE _ SHA KE ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener . on Gesture Detected ( m Gesture Type , Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Type Ġ= ĠG EST URE _ TYPE _ NONE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Sh ake After Flag Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( NON _ DE TE CTION _ TIME ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Sh ake After Flag Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¾ħ æ©Ł ä¸Ń čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Sh ake Detect ing ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Old Linear Accel Z Ġ> Ġm Linear Accel Z Ġ&& Ġm Linear Accel Z Ġ> Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Tmp Point Ġ!= Ġ 0 . 0 f Ġ&& Ġm Linear Accel Z Ġ> Ġm Tmp Point ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Tmp Point Ġ= Ġm Linear Accel Z čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Linear Accel Z Ġ< Ġ 0 Ġ&& Ġm Tmp Point Ġ> Ġ 2 ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æļ « å®ļ ãģª å±± ãĤĴ ç¢º å®ļ ãģķ ãģĽ ãĤĭ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Mount Points . add ( m Tmp Point ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Tmp Point Ġ= Ġ 1 . 0 f čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å±± ãģĮ 2 ãģ¤ ä»¥ä¸Ĭ ãģĤ ãĤĮãģ° shake čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m Mount Points . size Ġ>= Ġ 2 ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gesture Type Ġ= ĠG EST URE _ TYPE _ SHA KE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener . on Gesture Detected ( m Gesture Type , Ġm Mount Points . size ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Old Linear Accel Z Ġ= Ġm Linear Accel Z čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// ãĤ» ãĥ³ ãĤµ ãĥ¼ãģ® è¨Ńå®ļ å¤ī ãģĪ ãģŁ ãģ¨ ãģį ãģ® ãĤĦ ãģ¤ ĠSensor EventListener ä½ľæĪĲ ãģ® éĥ½ åĲĪ ä¸Ĭ å¿ħè¦ģ čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Accuracy Changed ( sensor : ĠSensor ?, Ġaccuracy : ĠInt ) Ġ{ čĊčĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// ãĥĻ ãĤ¯ãĥĪ ãĥ«ãģ® å¤§ ãģį ãģķ čĊĠĠĠ Ġprivate Ġfun Ġcalc Vector Length ( val X : ĠFloat , Ġval Y : ĠFloat , Ġval Z : ĠFloat ): ĠFloat { čĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġval X . toDouble () čĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġval Y . toDouble () čĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġval Z . toDouble () čĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( a . pow ( 2 . 0 ) Ġ+ Ġb . pow ( 2 . 0 ) Ġ+ Ġc . pow ( 2 . 0 )). toFloat () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ// çĭ¬ èĩª Listener čĊĠĠĠ Ġinterface ĠSh ake Listener { čĊĠĠĠĠĠĠĠ Ġ// æĮ ¯ ãĤĮ æ¤ľ çŁ¥ æĻĤ ãģ« æĬķ ãģ Ĵ ãĤī ãĤĮãĤĭ čĊĠĠĠĠĠĠĠ Ġfun Ġon Gesture Detected ( Sh ake Type : Int , ĠSh ake Count : ĠInt ) čĊčĊĠĠĠĠĠĠĠ Ġ// ãģª ãĤĵ ãĤī ãģĭ ãģ® ãĥŃãĤ° åĩº ãģĻ ãģ¨ ãģį ãģ« ä½¿ ãģĨ čĊĠĠĠĠĠĠĠ Ġ// fun Ġon Message ( message : ĠString ) čĊĠĠĠ Ġ} č Ċ }