package Ġcom . decimal ab . tod ok otlin . fragments . list Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Search View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . St agger ed Grid LayoutManager Ċ import Ġcom . decimal ab . tod ok otlin . R Ċ import Ġcom . decimal ab . tod ok otlin . data . models . ToDo Data Ċ import Ġcom . decimal ab . tod ok otlin . data . view model . ToDo ViewModel Ċ import Ġcom . decimal ab . tod ok otlin . databinding . Fragment List Binding Ċ import Ġcom . decimal ab . tod ok otlin . fragments . Base ViewModel Ċ import Ġcom . decimal ab . tod ok otlin . fragments . list . adapter . ListAdapter Ċ import Ġcom . decimal ab . tod ok otlin . utils . hide Keyboard Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġjp . was ab eef . recyclerview . anim ators . Slide In Up Animator Ċ Ċ class ĠList Fragment Ġ: ĠFragment (), ĠSearch View . On Query Text Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm ToDo ViewModel : ĠTo Do ViewModel Ġby Ġview Models () ĊĠĠĠ Ġprivate Ġval Ġm Base ViewModel : ĠBase ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment List Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĊĠĠĠ Ġprivate Ġval Ġadapter : ĠList Adapter Ġby Ġlazy Ġ{ ĠList Adapter () Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Data Ġbinding ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment List Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġbinding . m Base ViewModel Ġ= Ġm Base ViewModel ĊĊĠĠĠĠĠĠĠ Ġ// Setup ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġm ToDo ViewModel . getAll Data . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Base ViewModel . check If Database Empty ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . setData ( data ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠHide Ġsoft Ġkeyboard ĊĠĠĠĠĠĠĠ Ġhide Keyboard ( require Activity ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġbinding . re cyclerView ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSt agger ed Grid LayoutManager ( 2 , ĠSt agger ed Grid LayoutManager . VERTICAL ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . item Animator Ġ= ĠSlide In Up Animator (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Duration Ġ= Ġ 3 0 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġswipe ToDelete ( re cyclerView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġswipe ToDelete ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġswipe ToDelete Callback Ġ= Ġobject Ġ: ĠSw ipe ToDelete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sw ip ed ( view Holder : ĠRecyclerView . ViewHolder , Ġdirection : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleted Item Ġ= Ġadapter . data List [ view Holder . adapter Position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete ĠItem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . delete Item ( deleted Item ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Deleted ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Removed ( view Holder . adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRestore ĠDeleted ĠItem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Deleted Data ( view Holder . item View , Ġdeleted Item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitem Touch Helper Ġ= ĠItem Touch Helper ( swipe ToDelete Callback ) ĊĠĠĠĠĠĠĠ Ġitem Touch Helper . attach To RecyclerView ( re cyclerView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestore Deleted Data ( view : ĠView , Ġdeleted Item : ĠTo Do Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsn ackBar Ġ= ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview , Ġ" Deleted Ġ'${ deleted Item . title }' ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsn ackBar . setAction (" Undo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . insert Data ( deleted Item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackBar . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . list _ fragment _ menu , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch Ġ= Ġmenu . find Item ( R . id . menu _ search ) ĊĠĠĠĠĠĠĠ Ġval Ġsearch View Ġ= Ġsearch . action View Ġas ? ĠSearch View ĊĠĠĠĠĠĠĠ Ġsearch View ?. is Submit Button Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsearch View ?. setOn Query Text Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ delete _ all Ġ-> Ġconfirm Removal () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ priority _ high Ġ-> Ġm ToDo ViewModel . sortBy High Priority . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġadapter . setData ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ priority _ low Ġ-> Ġm ToDo ViewModel . sortBy Low Priority . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġadapter . setData ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Through Database ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( query Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Through Database ( query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch Through Database ( query : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsearch Query Ġ= Ġ"% $ query %" ĊĊĠĠĠĠĠĠĠ Ġm ToDo ViewModel . search Database ( search Query ). observe ( this , ĠObserver Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . setData ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfirm Removal () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠ Ġbuilder . set Positive Button (" Yes ") Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ToDo ViewModel . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Successfully ĠRemoved ĠEverything !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . set Negative Button (" No ") Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . setTitle (" Delete Ġeverything ?") ĊĠĠĠĠĠĠĠ Ġbuilder . setMessage (" Are Ġyou Ġsure Ġyou Ġwant Ġto Ġremove Ġeverything ?") ĊĠĠĠĠĠĠĠ Ġbuilder . create (). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊ Ċ }