package Ġcom . b phil ip . bot ree Ċ Ċ import Ġandroid . app . Alarm Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Alarm Manager Compat Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ class ĠM edit ation Alarm Ġ{ ĊĠĠĠ Ġfun Ġstart Alarm Broadcast Receiver ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreates Ġthe Ġintent Ġto Ġsend Ġto ĠAlarm Broadcast Receiver . ĊĠĠĠĠĠĠĠ Ġval Ġintent : ĠIntent Ġ= ĠIntent ( context , ĠAlarm Broadcast Receiver :: class . java ) ĊĠĠĠĠĠĠĠ Ġ// ĠCreates Ġthe ĠPending Intent , Ġand Ġensures Ġit Ġupdates Ġany Ġexisting ĠPending Intent . ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent : ĠPending Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġalarm Ġmanager ĊĠĠĠĠĠĠĠ Ġval Ġalarm Manager : ĠAlarm Manager Ġ= Ġcontext . getSystem Service ( Context . ALARM _ SERVICE ) Ġas ĠAlarm Manager ĊĊĠĠĠĠĠĠĠ Ġ// ĠGets Ġall Ġthe ĠSharedPreferences Ġinstances Ġ( the Ġone Ġused Ġby Ġthe Ġpreference Ġfragment , Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġour Ġown Ġstore . ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences : ĠSharedPreferences Ġ= Ġcontext . get SharedPreferences ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . preference _ file _ key ), ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġdefault SharedPreferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġnotifications Ġare Ġenabled , Ġwe 'll Ġconfigure Ġit . ĊĠĠĠĠĠĠĠ Ġif Ġ( default SharedPreferences . getBoolean ( context . getString ( R . string . preference _ notification _ enable _ key ), Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalendar : ĠCalendar Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEns ures Ġthe ĠCalendar Ġhas Ġmost Ġof Ġthe Ġdate Ġelements Ġalready Ġcreated . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis Ġ= ĠSystem . currentTimeMillis () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPull s Ġthe Ġset Ġhour Ġand Ġminutes Ġfrom Ġthe Ġshared Ġpreferences . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . HOUR _ OF _ DAY , Ġshared Preferences . getInt ( context . getString ( R . string . saved _ notification _ hour _ key ), Ġ 9 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MINUTE , Ġshared Preferences . getInt ( context . getString ( R . string . saved _ notification _ minutes _ key ), Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHope fully Ġmakes Ġthe Ġnext Ġcheck Ġwork Ġreli ably . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . set ( Calendar . MILLI SECOND , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġis Ġtrying Ġto Ġset Ġthe Ġalarm Ġto Ġthe Ġpast , Ġclearly Ġwe 're Ġa Ġday Ġout . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( calendar . time In Millis Ġ< ĠSystem . currentTimeMillis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . add ( Calendar . DATE , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlarm Manager Compat Ġgrace fully Ġde grade s Ġacross ĠAndroid Ġversions . ĠHave Ġto Ġuse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Exact And Allow While Idle Ġto Ġhave Ġreliable Ġnotifications , Ġdue Ġto Ġincreasing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrestrictions Ġon Ġpower Ġuse Ġin ĠAndroid Ġversions . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlarm Manager Compat . set Exact And Allow While Idle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlarm Manager . RTC _ WAKE UP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar . time In Millis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Intent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnable Ġthe Ġboot Ġreceiver , Ġso Ġal arms Ġcan Ġpersist Ġacross Ġreboot s . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= ĠComponent Name ( context , ĠBoot Broadcast Rec ie ver :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . package Manager . set Component Enabled Setting ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . COMPONENT _ ENABLED _ STATE _ ENABLED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . D ONT _ KILL _ APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" M edit ation Alarm ", Ġ" Alarm Ġset Ġfor Ġ" Ġ+ ĠSimpleDateFormat (" HH : mm "). format ( calendar . time ) Ġ+ Ġ" Ġ" Ġ+ ĠSimpleDateFormat (" d / M "). format ( calendar . time )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠElse Ġcancel Ġthe Ġalarm . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" M edit ation Alarm ", Ġ" Alarm Ġcancelled .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . cancel ( pending Intent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisable Ġboot Ġreceiver Ġif Ġalarm Ġis Ġnot Ġenabled . ĠDon 't Ġwaste Ġresources Ġ:) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= ĠComponent Name ( context , ĠBoot Broadcast Rec ie ver :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . package Manager . set Component Enabled Setting ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . COMPONENT _ ENABLED _ STATE _ DISABLED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . D ONT _ KILL _ APP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ