package Ġcom . z ul uzz a . get up Ċ Ċ import Ġandroid . app . Alarm Manager Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ 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 Manager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . we arable . activity . W ear able Activity Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . EditText Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Offset ĊĊ Ċ val ĠTAG Ġ= Ġ" Get Up App " Ċ val ĠAL ARM _ REQUEST _ CODE Ġ= Ġ 2 5 5 Ċ var ĠCHECK _ INTERVAL _ MIN : ĠLong Ġ= Ġ 6 0 Ċ Ċ class ĠMainActivity Ġ: ĠW ear able Activity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Alarm Manager : ĠAlarm Manager ? Ġ= Ġnull ĊĠĠĠ Ġlateinit Ġvar Ġnotification Manager Ġ: ĠNotification Manager ĊĠĠĠ Ġlateinit Ġvar Ġbuilder Ġ: ĠNotification Compat . Builder ĊĠĠĠ Ġprivate Ġval Ġchannel Id Ġ= Ġ" com . z ul uzz a . get up . notifications " ĊĠĠĠ Ġprivate Ġvar Ġsensor Filter : ĠIntent Filter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsensor Receiver : ĠSensor Receiver ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstart Of Active Period Ġ= Ġ 7 ĊĠĠĠ Ġprivate Ġvar Ġend Of Active Period Ġ= Ġ 2 0 ĊĊĠĠĠ Ġlateinit Ġvar Ġcontext : ĠContext ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinstance Ġ= Ġthis ; ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠThis Ġis Ġto Ġpass Ġaround Ġthe Ġapplication 's Ġcontext Ġfor Ġalarm Ġreceiver ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠMainActivity ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġstep Condition Checker Ġ= ĠStep Condition Checker () ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġnotification Channel Ġ: ĠNotification Channel ĊĊĠĠĠĠĠĠĠ Ġfun Ġapplication Context () Ġ: ĠContext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance !!. application Context ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Alarm ( check Interval Ms : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance ?. set Alarm ( check Interval Ms ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsend Notification () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance ?. send Notification () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Apps Notification Channel (): ĠNotification Channel Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnotification Channel ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstart Text Watcher Ġ= Ġobject Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! s . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Active Period ( Integer . parseInt ( s . toString ()), Ġend Of Active Period ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġend Text Watcher Ġ= Ġobject Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! s . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Active Period ( start Of Active Period , ĠInteger . parseInt ( s . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstep Goal Text Watcher Ġ= Ġobject Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! s . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Condition Checker . set Goal ( Integer . parseInt ( s . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġval Ġservice Intent Ġ= ĠIntent ( this , ĠStep Sensor :: class . java ) ĊĠĠĠĠĠĠĠ ĠContext Compat . start Foreground Service ( this , Ġservice Intent ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġapplication Context () ĊĊĠĠĠĠĠĠĠ Ġ// set Ġactive Ġperiod Ġand Ġstep Ġgoal Ġto Ġlayout ĊĠĠĠĠĠĠĠ Ġval Ġet Start Ġ= ĠfindViewById < View >( R . id . active Period Start ) Ġas ĠEditText ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Initial Ġactive Ġperiod Ġis Ġ${ start Of Active Period . toString ()} -${ end Of Active Period . toString () }") ĊĠĠĠĠĠĠĠ Ġet Start . setText ( start Of Active Period . toString ()) ĊĠĠĠĠĠĠĠ Ġet Start . add TextChanged Listener ( start Text Watcher ) ĊĠĠĠĠĠĠĠ Ġval Ġet End Ġ= ĠfindViewById < View >( R . id . active Period End ) Ġas ĠEditText ĊĠĠĠĠĠĠĠ Ġet End . setText ( end Of Active Period . toString ()) ĊĠĠĠĠĠĠĠ Ġet End . add TextChanged Listener ( end Text Watcher ) ĊĠĠĠĠĠĠĠ Ġval Ġet Steps Ġ= ĠfindViewById < View >( R . id . steps Goal ) Ġas ĠEditText ĊĠĠĠĠĠĠĠ Ġet Steps . setText ( step Condition Checker . get Step Goal (). toString ()) ĊĠĠĠĠĠĠĠ Ġet Steps . add TextChanged Listener ( step Goal Text Watcher ) ĊĊĠĠĠĠĠĠĠ Ġif ( sensor Filter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Filter Ġ= ĠIntent Filter (" com . z ul uzz a . get up . Step Sensor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Receiver Ġ= ĠSensor Receiver () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġregister Receiver ( sensor Receiver , Ġsensor Filter ) ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" MainActivity Ġregistered Ġreceiver Ġand Ġgoing Ġto Ġread Ġstep Ġsensor ") ĊĠĠĠĠĠĠĠ Ġset Alarm ( CHECK _ INTERVAL _ MIN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" MainActivity Ġon Resume Ġcalled ") ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Next Alarm Time ( interval Minutes : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= Ġnow . with Hour ( start Of Active Period ). with Minute ( 0 ). with Second ( 0 ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! temp . is After ( now )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" tri ed Ġout Ġ${ temp . at Zone ( Zone Offset . UTC ). to Instant (). to Epoch Milli () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= Ġtemp . plus Minutes ( interval Minutes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" ended Ġup Ġ Ġwith Ġ${ temp . at Zone ( Zone Offset . UTC ). to Instant (). to Epoch Milli () }") ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp . at Zone ( Zone Offset . system Default ()). to Instant (). to Epoch Milli () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Alarm ( time In Minutes : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Alarm Manager Ġ= Ġget System Service ( Context . ALARM _ SERVICE ) Ġas ĠAlarm Manager ? ĊĠĠĠĠĠĠĠ Ġif Ġ( m Alarm Manager Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" m Alarm M anger Ġwas Ġnot Ġset Ġwhile Ġtrying Ġto Ġset Ġan Ġalarm !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠAlarm Receiver :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( this , ĠAL ARM _ REQUEST _ CODE , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġalarm Time Ġ= Ġcalculate Next Alarm Time ( time In Minutes ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Setting Ġnew Ġalarm Ġto Ġ$ alarm Time Ġ($ time In Minutes )") ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġis ĠRTC _ WAKE UP Ġthe Ġbest Ġoption ? ĊĠĠĠĠĠĠĠ Ġm Alarm Manager !!. set Exact ( Alarm Manager . RTC _ WAKE UP , Ġalarm Time , Ġpending Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotification Channel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Id , Ġ" Step Ġnotifications ", Notification Manager . IMPORT ANCE _ HIGH ) ĊĠĠĠĠĠĠĠ Ġnotification Channel . enable Lights ( true ) ĊĠĠĠĠĠĠĠ Ġnotification Channel . light Color Ġ= ĠColor . GREEN ĊĠĠĠĠĠĠĠ Ġnotification Channel . enable V ibration ( true ) ĊĠĠĠĠĠĠĠ Ġnotification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( notification Channel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġsend Ġnotifications Ġoutside Ġof Ġactive Ġtime ĊĠĠĠĠĠĠĠ Ġif Ġ( now Ġ< ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Hour ( start Of Active Period ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Minute ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Second ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Nano ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus Minutes ( CHECK _ INTERVAL _ MIN Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( now . hour Ġ> Ġend Of Active Period Ġ|| Ġ( now . hour Ġ== Ġend Of Active Period Ġ&& Ġnow . minute Ġ> Ġ 5 )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġcreate Notification Channel (); ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sending Ġins ufficient Ġsteps Ġnotification ") ĊĠĠĠĠĠĠĠ Ġbuilder Ġ= ĠNotification Compat . Builder ( this , Ġchannel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title (" Get ĠUp !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text (" You Ġhave Ġnot Ġtaken Ġas Ġmany Ġsteps Ġas Ġyou 'd Ġwanted Ġto . ĠNow Ġit 's Ġtime Ġto Ġget Ġup !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( android . R . drawable . ic _ dialog _ alert ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set V ibrate ( long ArrayOf ( 1 0 0 , 2 0 0 , 1 0 0 , 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 2 3 4 5 , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Active Period ( start : ĠInt , Ġend : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(( start Ġin Ġ 0 .. 2 4 ) Ġ&& Ġ( end Ġin Ġ 0 .. 2 4 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Of Active Period Ġ= Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Of Active Period Ġ= Ġend ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Setting Ġactive Ġperiod Ġ$ start Of Active Period Ġ- Ġ$ end Of Active Period ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ