package Ġde . di ed rich sen . super apps . sens oren Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ 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 . text . method . Scrolling Movement Method Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . io . OutputStream Writer Ċ import Ġjava . time . LocalDateTime Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . round ĊĊ Ċ @ Suppress (" NAME _ SH ADO WING ") Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠSensor EventListener Ġ{ ĊĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater : ĠMenu Inflater Ġ= Ġmenu Inflater ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . sm enu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġshow Content () ĊĊĠĠĠĠĠĠĠ Ġval Ġs Storage : ĠSharedPreferences Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . get SharedPreferences (" data . pr ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġ// val Ġs Editor : ĠSharedPreferences . Editor Ġ= Ġs Storage . edit () ĊĊĠĠĠĠĠĠĠ Ġsensitivity Ġ= Ġs Storage . get Float (" s ensi ", Ġ 5 F ) ĊĠĠĠĠĠĠĠ Ġg Acc Ġ= Ġs Storage . get Float (" g Acc ", Ġ 9 . 8 1 F ) ĊĠĠĠĠĠĠĠ Ġthrow Switch Ġ= Ġs Storage . getBoolean (" throw ", Ġfalse ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠReset Ġthe Ġcounter Ġto Ġzero ĊĠĠĠĠĠĠĠ Ġbutton Res . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfree Fall . text Ġ= Ġ" Fall zeit : Ġ 0 s " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdist TextView . text Ġ= Ġ" Fall stre ck e : Ġ 0 m " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWrite Ġlatest Ġfree fall Ġdata Ġwith Ġtime Ġstamp Ġand Ġupdate Ġoutput ĊĠĠĠĠĠĠĠ Ġbutton Write . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ APPEND , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ze it : Ġ${ LocalDateTime . now ()}, ĠD au er : Ġ${ duration } s , ĠSt re ck e ( g =${ g Acc } m / s ^ 2 ): Ġ${ dist } m ;\ n ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" data . txt " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Content () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠĠĠĠĠ Ġsensor Manager Ġ= Ġget System Service ( Context . SENSOR _ SERVICE ) Ġas ĠSensor Manager ĊĠĠĠĠĠĠĠ Ġsensor Manager . register Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Manager . getDefault Sensor ( Sensor . TYPE _ AC CEL ERO METER ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSensor Manager . SENSOR _ DELAY _ FAST EST ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠSettings Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . delete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( Context . MODE _ PRIVATE , Ġ"", Ġ" data . txt ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext History . text Ġ= ĠgetString ( R . string . message _ after Delete History ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsensor Manager : ĠSensor Manager ĊĊĠĠĠ Ġprivate Ġvar Ġx acc : ĠFloat Ġ= Ġ 0 . 0 F ĊĠĠĠ Ġprivate Ġvar Ġy acc : ĠFloat Ġ= Ġ 0 . 0 F ĊĠĠĠ Ġprivate Ġvar Ġz acc : ĠFloat Ġ= Ġ 0 . 0 F ĊĠĠĠ Ġprivate Ġvar Ġxyz Acc : ĠFloat Ġ= Ġ 0 . 0 F ĊĊĊĠĠĠ Ġprivate Ġvar ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġprivate Ġvar Ġstop Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġprivate Ġvar Ġstarted Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġduration : ĠFloat Ġ= Ġ 0 . 0 F ĊĠĠĠ Ġprivate Ġvar Ġdist : ĠFloat Ġ= Ġ 0 . 0 F ĊĠĠĠ Ġprivate Ġvar Ġz Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġstart : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġsensitivity : ĠFloat Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġg Acc : ĠFloat Ġ= Ġ 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġthrow Switch : ĠBoolean Ġ= Ġfalse ĊĊĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġoverride Ġfun Ġon Sensor Changed ( event : ĠSensor Event ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġz ++ ĊĠĠĠĠĠĠĠ Ġx acc Ġ= Ġevent !!. values [ 0 ] ĊĠĠĠĠĠĠĠ Ġy acc Ġ= Ġevent . values [ 1 ] ĊĠĠĠĠĠĠĠ Ġz acc Ġ= Ġevent . values [ 2 ] ĊĠĠĠĠĠĠĠ Ġxyz Acc Ġ= Ġx acc Ġ* Ġx acc Ġ+ Ġy acc Ġ* Ġy acc Ġ+ Ġz acc Ġ* Ġz acc ĊĠĠĠĠĠĠĠ Ġxyz Acc Ġ= Ġxyz Acc . toDouble (). pow ( 0 . 5 ). toFloat () ĊĊĊĊ ĊĠĠĠĠĠĠĠ Ġif Ġ( z Ġ% Ġ 1 0 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxyz Accel erometer . text Ġ= Ġ" G es am tb esch le un igung : Ġ\ n ${ round ( xyz Acc Ġ* Ġ 1 0 0 0 ) Ġ/ Ġ 1 0 0 0 }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccel ero Meter _ data . text Ġ= Ġ" X : Ġ$ x acc Ġ\ n Y : Ġ$ y acc Ġ\ n Z : Ġ$ z acc " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! started Ġ&& Ġxyz Acc Ġ< Ġsensitivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstarted Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( stop Time Ġ- ĠstartTime ) Ġ/ Ġ 1 0 0 0 F Ġ> Ġduration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNew Ġfall Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ( stop Time Ġ- ĠstartTime ) Ġ/ Ġ 1 0 0 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist Ġ= Ġround (( 0 . 5 Ġ* Ġg Acc Ġ* Ġduration . toDouble (). pow ( 2 . 0 )). toFloat () Ġ* Ġ 1 0 0 ) Ġ/ Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( throw Switch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ/= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist Ġ= Ġround (( 0 . 5 Ġ* Ġg Acc Ġ* Ġduration . toDouble (). pow ( 2 . 0 )). toFloat () Ġ* Ġ 1 0 0 ) Ġ/ Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ*= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfree Fall . text Ġ= Ġ" D au er Ġdes Ġfre ien ĠF alls : Ġ${ round ( duration Ġ* Ġ 1 0 0 ) Ġ/ Ġ 1 0 0 } s " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdist TextView . text Ġ= Ġ" ca . Ġ${ dist } m " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( xyz Acc Ġ> Ġsensitivity ) Ġstarted Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Accuracy Changed ( p 0 : ĠSensor ?, Ġp 1 : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġfun Ġwrite ( data mode : ĠInt , Ġoutput : ĠString , Ġfile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile : ĠFileOutputStream Ġ= Ġopen File Output ( file , Ġdata mode ) ĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠOutputStream Writer ( file ) ĊĠĠĠĠĠĠĠ Ġwriter . write ( output ) ĊĠĠĠĠĠĠĠ Ġwriter . close () ĊĠĠĠĠĠĠĠ Ġfile . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontent ( file : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġt : ĠString ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile : ĠFileInputStream Ġ= Ġopen File Input ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠInputStreamReader ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= Ġreader . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= Ġ"( No ĠData )" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Content () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġcontent (" data . txt ") ĊĠĠĠĠĠĠĠ Ġif Ġ( t . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġlines Ġ= Ġt . split ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext History . movement Method Ġ= ĠScroll ing Movement Method () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext History . text Ġ= Ġcontent (" data . txt ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġs Storage : ĠSharedPreferences Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . get SharedPreferences (" data . pr ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġs Editor : ĠSharedPreferences . Editor Ġ= Ġs Storage . edit () ĊĠĠĠĠĠĠĠ Ġs Editor . putString (" t ", Ġt ) ĊĠĠĠĠĠĠĠ Ġs Editor . apply () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Restart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Restart () ĊĠĠĠĠĠĠĠ Ġthis . re create () ĊĠĠĠ Ġ} ĊĊ Ċ } ĊĊĊĊĊĊ