package Ġcom . d udo . sleep safe . service Ċ Ċ import Ġandroid . app .* Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . hardware . Sensor Ċ import Ġandroid . hardware . Sensor Event Ċ import Ġandroid . hardware . Sensor EventListener Ċ import Ġandroid . hardware . Sensor Manager Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . V ibration Effect Ċ import Ġandroid . os . V ibr ator Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġcom . d udo . sleep safe . R Ċ import Ġcom . d udo . sleep safe . data . database . App Database Ċ import Ġcom . d udo . sleep safe . data . model . Detected Activity Ċ import Ġcom . d udo . sleep safe . data . preferences . User Preferences Ċ import Ġcom . d udo . sleep safe . di . Injector Ċ import Ġcom . d udo . sleep safe . ui . tracking . Tracking Activity Ċ import Ġcom . d udo . sleep safe . utils . Sound Helper Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . math . abs Ċ Ċ class ĠTracking Service Ġ: ĠService (), ĠSensor EventListener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠID LE _ AC CELER ATION Ġ= Ġ" idle _ acc " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDATA SET Ġ= Ġ" dataset " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAL ARM Ġ= Ġ" alarm " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRUN _ IN _ BACKGROUND Ġ= Ġ" run _ in _ background " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION _ CLICK Ġ= Ġ" notif _ click " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IFICATION _ ID Ġ= Ġ 5 4 3 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ CANCEL Ġ= Ġ" com . d udo . sleep safe . ACTION _ CANCEL " ĊĠĠĠĠĠĠĠ Ġvar Ġrunning Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsensor Manager : ĠSensor Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġaccel erometer : ĠSensor ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnotification Receiver : ĠBroadcast Receiver ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvi br ator : ĠV ibr ator ĊĠĠĠ Ġprivate Ġvar Ġmedia Player : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġdataset Ġ= Ġmutable ListOf < Float >() ĊĠĠĠ Ġprivate Ġvar Ġidle Acceleration Value Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġcurrent Acceleration Value Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġtracking Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġcollecting Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġis Alarm Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġapp Database : ĠApp Database ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ ĠInject or . init Tracking Service Component () ĊĠĠĠĠĠĠĠ ĠInject or . tracking Service Component ?. inject ( this ) ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent , Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġnotification Receiver Ġ= ĠNotification Receiver () ĊĠĠĠĠĠĠĠ Ġstart Service With Notification () ĊĠĠĠĠĠĠĠ Ġidle Acceleration Value Ġ= Ġintent . get Float Extra ( IDLE _ AC CELER ATION , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġsensor Manager Ġ= Ġapplication Context . getSystem Service ( Context . SENSOR _ SERVICE ) Ġas ĠSensor Manager ĊĠĠĠĠĠĠĠ Ġaccel erometer Ġ= Ġsensor Manager . getDefault Sensor ( Sensor . TYPE _ AC CEL ERO METER ) ĊĠĠĠĠĠĠĠ Ġsensor Manager . register Listener ( this , Ġaccel erometer , ĠSensor Manager . SENSOR _ DELAY _ GAME ) ĊĠĠĠĠĠĠĠ Ġvi br ator Ġ= Ġapplication Context . getSystem Service ( Context . V IB R ATOR _ SERVICE ) Ġas ĠV ibr ator ĊĠĠĠĠĠĠĠ Ġval Ġsound Resource Ġ= ĠSound Helper . get Sound Resource ById ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Preferences ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" USER _ PRE F ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext . MODE _ PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). get Sound Index () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmedia Player Ġ= ĠMedia Player . create ( application Context , Ġsound Resource ) ĊĠĠĠĠĠĠĠ Ġmedia Player ?. is Loop ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġstart Service With Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Channel Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Notification Channel (" my _ service ", Ġ" My ĠBackground ĠService ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġnotification Intent Ġ= ĠIntent ( application Context , ĠTracking Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġnotification Intent . action Ġ= ĠNOT IFICATION _ CLICK ĊĠĠĠĠĠĠĠ Ġnotification Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP ĊĠĠĠĠĠĠĠ Ġval Ġcontent Pending Intent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getActivity ( this , Ġ 0 , Ġnotification Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġval Ġcancel Intent Ġ= ĠIntent ( ACTION _ CANCEL ) ĊĠĠĠĠĠĠĠ Ġval Ġcancel Pending Intent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . get Broadcast ( application Context , Ġ 0 , Ġcancel Intent , ĠPending Intent . FLAG _ ONE _ SHOT ) ĊĠĠĠĠĠĠĠ Ġval Ġnotification Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) ĠNotification . Builder ( this , Ġnotification Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠNotification . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġnotification Builder . setContent Title ( resources . getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Ticker ( resources . getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text (" Tracking ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . sleep safe _ logo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( content Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAction ( R . drawable . ic _ close , Ġ" Cancel ", Ġcancel Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġnotification . flags Ġ= Ġnotification . flags Ġor ĠNotification . FLAG _ NO _ CLEAR ĊĠĠĠĠĠĠĠ Ġstart Foreground ( NOTIFICATION _ ID , Ġnotification ) ĊĠĠĠĠĠĠĠ Ġapplication Context . register Receiver ( notification Receiver , ĠIntent Filter ( ACTION _ CANCEL )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel ( channelId : ĠString , Ġchannel Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchan Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Name , ĠNotification Manager . IMPORT ANCE _ NONE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġchan . light Color Ġ= ĠColor . BLUE ĊĠĠĠĠĠĠĠ Ġchan . lock screen Visibility Ġ= ĠNotification . VIS IBILITY _ PRIVATE ĊĠĠĠĠĠĠĠ Ġval Ġservice Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġservice . create Notification Channel ( chan ) ĊĠĠĠĠĠĠĠ Ġreturn Ġchannel Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sensor Changed ( event : ĠSensor Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġabs ( event . values [ 0 ]) ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġabs ( event . values [ 1 ]) ĊĠĠĠĠĠĠĠ Ġval Ġz Ġ= Ġabs ( event . values [ 2 ]) ĊĠĠĠĠĠĠĠ Ġdataset . add ( x Ġ+ Ġy Ġ+ Ġz ) ĊĠĠĠĠĠĠĠ Ġval Ġsend Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġsend Intent . action Ġ= Ġ" tracking . update " ĊĠĠĠĠĠĠĠ Ġif Ġ( collect ing Ġ&& Ġdataset . size Ġ== Ġ 6 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidle Acceleration Value Ġ= Ġdataset . sum () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollecting Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( dataset . size Ġ> Ġ 6 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdataset . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsend Intent . putExtra ( DATASET , Ġdataset . toFloat Array ()) ĊĠĠĠĠĠĠĠ Ġsend Intent . putExtra ( ALARM , Ġis Alarm ) ĊĠĠĠĠĠĠĠ Ġif Ġ( collect ing ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! tracking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( send Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Acceleration Value Ġ= Ġdataset . sum () ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġabs ( current Acceleration Value Ġ- Ġidle Acceleration Value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ> Ġ( idle Acceleration Value Ġ/ Ġ 6 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracking Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Alarm Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( User Preferences ( get SharedPreferences (" USER _ PRE F ", ĠContext . MODE _ PRIVATE )). is V ibration ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ibration Effect . create Wave form ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong ArrayOf ( 0 , Ġ 1 0 0 , Ġ 5 0 0 , Ġ 1 0 0 , Ġ 5 0 0 , Ġ 1 0 0 , Ġ 5 0 0 , Ġ 1 0 0 , Ġ 5 0 0 , Ġ 1 0 0 , Ġ 5 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( long ArrayOf ( 5 0 0 ), Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Activity To Db () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Tracking Activity () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsend Broadcast ( send Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠNotification Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnew Activity To Db () Ġ{ ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Database . activities Dao () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. insert Activity ( Detected Activity ( dataset Ġ= Ġdataset , ĠstartDate Ġ= ĠDate (), Ġlevel Ġ= Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Tracking Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( application Context , ĠTracking Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( ALARM , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Accuracy Changed ( sensor : ĠSensor ?, Ġaccuracy : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġapplication Context . unregister Receiver ( notification Receiver ) ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġrunning Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvi br ator . cancel () ĊĠĠĠĠĠĠĠ Ġmedia Player ?. stop () ĊĠĠĠĠĠĠĠ Ġmedia Player ?. release () ĊĠĠĠĠĠĠĠ Ġsensor Manager . unregister Listener ( this ) ĊĠĠĠĠĠĠĠ ĠInject or . release Tracking Service Component () ĊĠĠĠ Ġ} Ċ Ċ }