package Ġcom . rol and v ite zh u . tod oc loud . ui . activity . main . adapter Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . rol and v ite zh u . tod oc loud . app . App Controller . Companion . instance Ċ import Ġcom . rol and v ite zh u . tod oc loud . app . App Controller . Companion . is Action Mode Ċ import Ġcom . rol and v ite zh u . tod oc loud . data . Todo Ċ import Ġcom . rol and v ite zh u . tod oc loud . database . Todo Cloud Database Dao Ċ import Ġcom . rol and v ite zh u . tod oc loud . databinding . Item Todo Binding Ċ import Ġcom . rol and v ite zh u . tod oc loud . di . Fragment Scope Ċ import Ġcom . rol and v ite zh u . tod oc loud . receiver . Reminder Setter Ċ import Ġcom . rol and v ite zh u . tod oc loud . ui . activity . main . adapter . Todo Adapter . Item ViewHolder Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . collections . ArrayList Ċ Ċ @ Fragment Scope Ċ class ĠTodo Adapter Ġ@ Inject Ġconstructor () Ġ: ĠRecyclerView . Adapter < Item ViewHolder >() Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġtodo Cloud Database Dao : ĠTodo Cloud Database Dao ĊĊĠĠĠ Ġprivate Ġval Ġtodos : ĠMutable List < Todo > ĊĠĠĠ Ġvar Ġitem Touch Helper : ĠItem Touch Helper ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġupdate ( todos : ĠMutable List < Todo >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . todos . clear () ĊĊĠĠĠĠĠĠĠ Ġ// ĠOrder Ġtodo Ġlist Ġitems Ġascending Ġby Ġposition Ġvalue ĊĠĠĠĠĠĠĠ ĠArrayList ( todos ). sort With ( compare By < Todo > Ġ{ Ġit . position Ġ}) ĊĠĠĠĠĠĠĠ Ġthis . todos . addAll ( todos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġtodos . clear () ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Todos (): ĠList < Todo > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtodos ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠItem ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠItem ViewHolder . from ( parent , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠItem ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtodo Ġ= Ġtodos [ position ] ĊĠĠĠĠĠĠĠ Ġholder . bind View ( todo , Ġitem Touch Helper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Todo From Adapter ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtodos . remove At ( position ) ĊĠĠĠĠĠĠĠ Ġnotify Item Removed ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Reminder Service ( todo : ĠTodo ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( todo . completed Ġ!= Ġnull Ġ&& Ġtodo . completed !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRem inder Setter . cancel Reminder Service ( todo ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( isSet Reminder ( todo )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRem inder Setter . create Reminder Service ( todo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisSet Reminder ( todo : ĠTodo ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtodo . reminder DateTime !! Ġ> Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtodos . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Todo ( position : ĠInt ): ĠTodo Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtodos [ position ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Selection ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtodos [ position ]. isSelected Ġ= Ġis Not Selected ( position ) ĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Selection () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( todo Ġin Ġtodos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodo . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġselected ItemCount : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġselected ItemCount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodos . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isSelected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected ItemCount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġselected ItemCount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġselected Todos : ĠArrayList < Todo > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Todos Ġ= ĠArrayList < Todo >( selected ItemCount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtodos . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isSelected ) Ġselected Todos . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġselected Todos ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Not Selected ( position : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! todos [ position ]. isSelected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġupdate Todo ( todo : ĠTodo ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtodo . dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtodo Cloud Database Dao . update Todo ( todo ) ĊĠĠĠĠĠĠĠ Ġtodo Cloud Database Dao . fix Todo Positions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshould Handle CheckBox Touch Event ( event : ĠMotion Event , Ġholder : ĠItem ViewHolder ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġreproduce Ġ" holder . get Adapter Position () Ġ== Ġ- 1 ", Ġdo Ġthe Ġfollowing : Ġselect Ġ 1 Ġtodo Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġtouch Ġit 's ĠCheckBox . ĊĠĠĠĠĠĠĠ Ġreturn Ġ(! is Action Mode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġevent . action Ġ== ĠMotion Event . ACTION _ UP Ġ&& Ġholder . adapter Position Ġ!= Ġ- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Completed ( todo : ĠTodo ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtodo . completed Ġ= Ġtodo . completed ?. not () Ġ?: Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠItem ViewHolder Ġprivate Ġconstructor ( val Ġbinding : ĠItem Todo Binding , Ġval Ġtodo Adapter : ĠTodo Adapter ): ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind View ( todo : ĠTodo , Ġitem Touch Helper : ĠItem Touch Helper ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . todo Ġ= Ġtodo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . todo Adapter Ġ= Ġtodo Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . item ViewHolder Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( parent : ĠViewGroup , Ġtodo Adapter : ĠTodo Adapter ): ĠItem ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Inflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠItem Todo Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Inflater , Ġparent , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠItem ViewHolder ( binding , Ġtodo Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠObjects . requireNonNull ( instance )?. app Component ?. fragment Component ()?. create ()?. inject ( this ) ĊĠĠĠĠĠĠĠ Ġtodos Ġ= ĠArrayList () ĊĠĠĠ Ġ} Ċ }