/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠR az ew are ĠLLC Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠNot with standing Ġthe Ġfore going , Ġyou Ġmay Ġnot Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ċ Ġ* Ġdistribute , Ġsublicense , Ġcreate Ġa Ġderivative Ġwork , Ġand / or Ġsell Ġcopies Ġof Ġthe Ċ Ġ* ĠSoftware Ġin Ġany Ġwork Ġthat Ġis Ġdesigned , Ġintended , Ġor Ġmarket ed Ġfor Ġped ag og ical Ġor Ċ Ġ* Ġinstruction al Ġpurposes Ġrelated Ġto Ġprogramming , Ġcoding , Ġapplication Ġdevelopment , Ċ Ġ* Ġor Ġinformation Ġtechnology . Ġ ĠPermission Ġfor Ġsuch Ġuse , Ġcopying , Ġmodification , Ċ Ġ* Ġmer ger , Ġpublication , Ġdistribution , Ġsublic ensing , Ġcreation Ġof Ġderivative Ġworks , Ċ Ġ* Ġor Ġsale Ġis Ġexpress ly Ġwith held . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . ray w ender lich . android . content pro vid ert od oc lient . controller Ċ Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . net . Uri Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroid . widget . Toast . LENGTH _ LONG Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . controller . provider . ToDo Contract . CONTENT _ PATH Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . controller . provider . ToDo Contract . CONTENT _ URI Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . controller . provider . ToDo Contract . ROW _ COUNT _ URI Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . controller . provider . ToDo Contract . ToDo Table . Columns . KEY _ TODO _ ID Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . controller . provider . ToDo Contract . ToDo Table . Columns . KEY _ TODO _ IS _ COMPLETED Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . controller . provider . ToDo Contract . ToDo Table . Columns . KEY _ TODO _ NAME Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . databinding . Dialog ToDo Item Binding Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . databinding . ToDo ListItem Binding Ċ import Ġcom . ray w ender lich . android . content pro vid ert od oc lient . model . ToDo Ċ Ċ class ĠTo Do Adapter ( private Ġval Ġcontext : ĠContext ) Ġ: ĠRecyclerView . Adapter < ToDo Adapter . ViewHolder >() Ġ{ ĊĠ Ġprivate Ġval Ġquery Uri Ġ= ĠCONTENT _ URI . toString () Ġ// Ġbase Ġuri ĊĠ Ġprivate Ġval Ġquery Count Uri Ġ= ĠROW _ COUNT _ URI . toString () ĊĠ Ġprivate Ġval Ġprojection Ġ= ĠarrayOf ( CONTENT _ PATH ) Ġ// table ĊĠ Ġprivate Ġvar Ġselection Clause : ĠString ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġselection Args : ĠArray < String >? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġsort Order Ġ= Ġ" ASC " ĊĊĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġposition : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠ Ġval Ġview Ġ= ĠTo Do ListItem Binding . inflate ( LayoutInflater . from ( parent . context ), Ġparent , Ġfalse ) ĊĠĠĠ Ġreturn ĠViewHolder ( view ) ĊĠ Ġ} ĊĊĠ Ġ// ĠGet Ġthe Ġcount Ġof Ġall Ġitems ĊĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠ Ġ// ĠGet Ġthe Ġnumber Ġof Ġrecords Ġfrom Ġthe ĠContent ĠResolver ĊĠĠĠ Ġval Ġcursor Ġ= Ġcontext . content Resolver . query ( ĊĠĠĠĠĠ ĠUri . parse ( query Count Uri ), ĊĠĠĠĠĠ Ġprojection , Ġselection Clause , ĊĠĠĠĠĠ Ġselection Args , Ġsort Order ĊĠĠĠ Ġ) ĊĠĠĠ Ġ// ĠReturn Ġthe Ġcount Ġof Ġrecords ĊĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Count Ġ= Ġcursor . getInt ( 0 ) ĊĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġitem Count ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ 0 ĊĠ Ġ} ĊĊĠ Ġ// ĠRow Ġby Ġrow , Ġpopulate Ġthe ĠRecyclerView ĊĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠ Ġ// Ġ 1 ĊĠĠĠ Ġval Ġcursor Ġ= Ġcontext . content Resolver . query ( ĊĠĠĠĠĠ ĠUri . parse ( query Uri ), ĊĠĠĠĠĠ Ġprojection , ĊĠĠĠĠĠ Ġselection Clause , ĊĠĠĠĠĠ Ġselection Args , Ġsort Order ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġ 2 ĊĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( cursor . moveTo Position ( position )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Do Id Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( KEY _ TODO _ ID )) ĊĠĠĠĠĠĠĠ Ġval Ġto Do Name Ġ= Ġcursor . getString ( cursor . getColumnIndex ( KEY _ TODO _ NAME )) ĊĠĠĠĠĠĠĠ Ġval Ġto Do Completed Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( KEY _ TODO _ IS _ COMPLETED )) Ġ> Ġ 0 ĊĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġval Ġto Do Ġ= ĠTo Do ( to Do Id , Ġto Do Name , Ġto Do Completed ) ĊĠĠĠĠĠĠĠ Ġholder . bind Views ( to Do ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// Insert Ġa ĠTo - Do Ġitem Ġfrom Ġthe ĠContent Resolver ĊĠ Ġfun Ġinsert ToDo ( to Do Name : ĠString ) Ġ{ ĊĠĠĠ Ġ// Ġ 1 ĊĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠ Ġvalues . put ( KEY _ TODO _ NAME , Ġto Do Name ) ĊĠĠĠ Ġ// Ġ 2 ĊĠĠĠ Ġcontext . content Resolver . insert ( CONTENT _ URI , Ġvalues ) ĊĠĠĠ Ġnotify DataSet Changed () ĊĠ Ġ} ĊĊĊĠ Ġinner Ġclass ĠViewHolder ( private Ġval Ġbinding : ĠTo Do ListItem Binding ) Ġ: ĊĠĠĠ ĠRecyclerView . ViewHolder ( binding . root ), ĠView . OnClickListener Ġ{ ĊĊĠĠĠ Ġ// ĠBind Ġthe ĠTo - Do ĠItem Ġfields Ġto Ġthe Ġcontrols Ġin Ġthe ĠRecyclerView Ġrow ĊĠĠĠ Ġfun Ġbind Views ( to Do : ĠTo Do ) Ġ{ ĊĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠ Ġtxt ToDo Name . text Ġ= Ġto Do . to Do Name ĊĠĠĠĠĠĠĠ Ġchk ToDo Completed . isChecked Ġ= Ġto Do . is Completed ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠ Ġimg Delete . setOnClickListener ( this @ ViewHolder ) ĊĠĠĠĠĠĠĠ Ġimg Edit . setOnClickListener ( this @ ViewHolder ) ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠ Ġchk ToDo Completed . setOn Checked ChangeListener Ġ{ Ġcompound Button , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġto Do . is Completed Ġ= Ġcompound Button . isChecked ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( KEY _ TODO _ IS _ COMPLETED , Ġto Do . is Completed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( KEY _ TODO _ ID , Ġto Do . to Do Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( KEY _ TODO _ NAME , Ġto Do . to Do Name ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġselection Args Ġ= ĠarrayOf ( to Do . to Do Id . toString ()) ĊĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . update ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( query Uri ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Clause , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠHandle Ġclicks Ġon Ġthe ĠRecyclerView Ġrows ĊĠĠĠ Ġoverride Ġfun ĠonClick ( img Button : ĠView ?) Ġ{ ĊĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontext . content Resolver . query ( ĊĠĠĠĠĠĠĠ ĠUri . parse ( query Uri ), ĊĠĠĠĠĠĠĠ Ġprojection , ĊĠĠĠĠĠĠĠ Ġselection Clause , ĊĠĠĠĠĠĠĠ Ġselection Args , ĊĠĠĠĠĠĠĠ Ġsort Order ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo Position ( binding Adapter Position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġto Do Id Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( KEY _ TODO _ ID )) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġto Do Name Ġ= Ġcursor . getString ( cursor . getColumnIndex ( KEY _ TODO _ NAME )) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġto Do Completed Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( KEY _ TODO _ IS _ COMPLETED )) Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġto Do Ġ= ĠTo Do ( to Do Id , Ġto Do Name , Ġto Do Completed ) ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( img Button ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . img Delete . id Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ToDo ( to Do . to Do Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . img Edit . id Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit ToDo ( to Do ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDelete Ġa ĠTo - Do Ġitem Ġfrom Ġthe ĠContent Resolver ĊĠĠĠ Ġprivate Ġfun Ġdelete ToDo ( id : ĠLong ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠ Ġselection Args Ġ= ĠarrayOf ( id . toString ()) ĊĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠ Ġcontext . content Resolver . delete ( Uri . parse ( query Uri ), Ġselection Clause , Ġselection Args ) ĊĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Item Ġdeleted .", ĠLEN GTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠEdit Ġan ĠItem Ġin Ġthe ĠContent Resolver ĊĠĠĠ Ġprivate Ġfun Ġedit ToDo ( to Do : ĠTo Do ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdialog Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠ Ġdialog . setTitle (" Update ĠTo ĠDo ĠItem ") ĊĠĠĠĠĠ Ġval Ġdialog ToDo Item Binding Ġ= ĠDialog ToDo Item Binding . inflate ( LayoutInflater . from ( context )) ĊĠĠĠĠĠ Ġdialog ToDo Item Binding . ed t ToDo Name . setText ( to Do . to Do Name ) ĊĠĠĠĠĠ Ġdialog . setView ( dialog ToDo Item Binding . root ) ĊĠĠĠĠĠ Ġdialog . set Positive Button (" Update ") Ġ{ Ġ_: ĠDialog Interface , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( dialog ToDo Item Binding . ed t ToDo Name . text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( KEY _ TODO _ NAME , Ġdialog ToDo Item Binding . ed t ToDo Name . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( KEY _ TODO _ ID , Ġto Do . to Do Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( KEY _ TODO _ IS _ COMPLETED , Ġto Do . is Completed ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . update ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( query Uri ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Clause , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Args ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġ 3 ĊĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġdialog . set Negative Button (" Cancel ") Ġ{ Ġ_: ĠDialog Interface , Ġ_: ĠInt Ġ-> Ġ} ĊĠĠĠĠĠ Ġdialog . show () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }