package Ġar . edu . ut n . fr ba . mobile . a 2 0 1 9 c 1 . mer cury Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . DatePicker Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġar . edu . ut n . fr ba . mobile . a 2 0 1 9 c 1 . mer cury . db . Database Ċ import Ġar . edu . ut n . fr ba . mobile . a 2 0 1 9 c 1 . mer cury . model . Schedule Ċ import Ġar . edu . ut n . fr ba . mobile . a 2 0 1 9 c 1 . mer cury . model . Visit On Date Ċ import Ġar . edu . ut n . fr ba . mobile . a 2 0 1 9 c 1 . mer cury . util . notifications . Notification Scheduler Ċ import Ġkotlinx . android . synt hetic . main . schedule _ for _ list _ view . view .* Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . LocalDateTime Ċ Ċ class ĠSchedule ListAdapter ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġactivity : ĠActivity , ĊĠĠĠ Ġprivate Ġval Ġs chedules : ĠList < Schedule >, ĊĠĠĠ Ġprivate Ġval Ġview Schedule : Ġ( Schedule ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġupdate Schedule : Ġ( Schedule ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġdelete Schedule : Ġ( Schedule ) Ġ-> ĠUnit Ċ ) Ġ: ĠRecyclerView . Adapter < Schedule ListAdapter . Schedule ListItem ViewHolder >() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠSchedule ListItem ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . schedule _ for _ list _ view , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSchedule ListItem ViewHolder ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġs chedules . size ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠSchedule ListItem ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġschedule ToUpdate Ġ= Ġs chedules [ position ] ĊĠĠĠĠĠĠĠ Ġholder . bind ( position , Ġschedule ToUpdate , Ġupdate Schedule , Ġdelete Schedule ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Schedule On ( schedule : ĠSchedule , Ġschedule StartDate : ĠLocalDate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġschedule . start On ( schedule StartDate ) ĊĠĠĠĠĠĠĠ Ġschedule Notifications For New Vis its ( schedule ) ĊĠĠĠĠĠĠĠ ĠDatabase . update ( schedule ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschedule Notifications For New Vis its ( schedule : ĠSchedule ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Ant icipation In Minutes Ġ= Ġ 1 5 L ĊĊĠĠĠĠĠĠĠ Ġval Ġtoday : ĠLocalDateTime Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġschedule . next Visit Dates ( today . to LocalDate ()). forEach Ġ{ Ġvisit On Date Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Notification For Visit ( visit On Date , Ġtoday , Ġnotification Ant icipation In Minutes , Ġschedule . objectId !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġschedule Notification For Visit ( visit On Date : ĠVisit On Date , Ġtoday : ĠLocalDateTime , Ġnotification Ant icipation : ĠLong , Ġschedule Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisit Ġ= Ġvisit On Date . visit ĊĠĠĠĠĠĠĠ Ġval Ġvisit Time Ġ= Ġvisit . time To Visit ĊĠĠĠĠĠĠĠ Ġval Ġvisit DateTime : ĠLocalDateTime Ġ= Ġvisit On Date . date . at Time ( visit Time ) ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġ" Re un iÃ³n Ġcon Ġ${ visit . client . name }" ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" Ten Ã©s Ġuna Ġre un iÃ³n Ġa Ġlas Ġ${ visit Time } hs " ĊĊĠĠĠĠĠĠĠ ĠNotification Scheduler (). schedule Notification With Ant icipation ( visit DateTime , Ġtoday , Ġnotification Ant icipation , Ġtitle , Ġmessage , Ġactivity , Ġschedule Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠSchedule ListItem ViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule : ĠSchedule , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Schedule : Ġ( Schedule ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Schedule : Ġ( Schedule ) Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ name . text Ġ= Ġschedule . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschedule Duration Ġ= Ġschedule . duration () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ duration . text Ġ= Ġcontext . resources . get Quantity String ( R . plurals . LIST _ SCHED ULE __ SCHED ULE _ DURATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Duration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġschedule Duration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ active . isChecked Ġ= Ġschedule . isActive ( LocalDateTime . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ current _ day . text Ġ= Ġif Ġ( schedule . isActive ( LocalDateTime . now ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ ACTIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ IN ACTIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ active . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item View . schedule _ active . isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Schedule StartDate ( schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Disable Schedule Alert ( schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ details _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Schedule ( schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ edit _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Schedule ( schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ delete _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Dialog : ĠAlertDialog Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( context . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ DE LE TION _ MOD AL __ MESSAGE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( context . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ DE LE TION _ MOD AL __ CONFIRM ATION _ BUTTON )){ _, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Schedule ( schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Removed ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( context . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ MOD AL __ CANCEL _ BUTTON )) Ġ{ Ġ_, Ġ_ Ġ-> Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġselect Schedule StartDate ( schedule : ĠSchedule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Picker Ġ= ĠDate Picker ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġcontext . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ START _ DATE _ P ICK ER _ MOD AL __ TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfirm ButtonText Ġ= Ġcontext . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ START _ DATE _ P ICK ER _ MOD AL __ CONFIRM ATION _ BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcancel ButtonText Ġ= Ġcontext . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ START _ DATE _ P ICK ER _ MOD AL __ CANCEL _ BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Dialog : ĠAlertDialog Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( date Picker ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( confirm ButtonText ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġschedule StartDate : ĠLocalDate Ġ= ĠLocalDate . of ( date Picker . year , Ġdate Picker . month Ġ+ Ġ 1 , Ġdate Picker . day OfMonth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Schedule On ( schedule , Ġschedule StartDate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Schedule Active Is Checked ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( cancel ButtonText ) Ġ{ Ġ_, Ġ_ Ġ-> Ġset Schedule Active Is Checked ( false ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġshow Disable Schedule Alert ( schedule : ĠSchedule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfirm ButtonText Ġ= Ġcontext . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ DISABLE _ MOD AL __ CONFIRM ATION _ BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcancel ButtonText Ġ= Ġcontext . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ MOD AL __ CANCEL _ BUTTON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalert Dialog : ĠAlertDialog Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( context . getText ( R . string . LIST _ SCHED ULE __ SCHED ULE _ DISABLE _ MOD AL __ MESSAGE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( confirm ButtonText ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Schedule ( schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Schedule Active Is Checked ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( cancel ButtonText ) Ġ{ Ġ_, Ġ_ Ġ-> Ġ Ġset Schedule Active Is Checked ( true ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdisable Schedule ( schedule : ĠSchedule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Now Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule . disable ( right Now ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . update ( schedule ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Scheduler (). un schedule Notification ( schedule . objectId !! , Ġactivity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġset Schedule Active Is Checked ( isChecked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . schedule _ active . isChecked Ġ= Ġis Checked ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ