package Ġxyz . sent r ionic . har mony . ui . main . story ĊĊ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġkotlinx . android . synt hetic . main . fragment _ view _ comment .* Ċ import Ġkotlinx . android . synt hetic . main . snippet _ comment _ top .* Ċ import Ġxyz . sent r ionic . har mony . R Ċ import Ġxyz . sent r ionic . har mony . ui . Data State Ċ import Ġxyz . sent r ionic . har mony . ui . main . story . state . Story State Event Ċ import Ġxyz . sent r ionic . har mony . ui . main . story . state . Story ViewState Ċ import Ġxyz . sent r ionic . har mony . ui . main . story . view model .* Ċ import Ġxyz . sent r ionic . har mony . util . Date Utils Ċ import Ġxyz . sent r ionic . har mony . util . Error Handling Ċ import Ġxyz . sent r ionic . har mony . util . Top Spacing Item Decoration ĊĊ Ċ class ĠView Comment Fragment Ġ: ĠBase Story Fragment (), ĠSw ipe Refresh Layout . On Refresh Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cycler Adapter : ĠComment ListAdapter ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ view _ comment , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠĠĠĠĠ Ġswipe _ refresh . setOn Refresh Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġset Story Post Description () ĊĠĠĠĠĠĠĠ Ġinit RecyclerView () ĊĠĠĠĠĠĠĠ Ġsubscribe Observer s () ĊĠĠĠĠĠĠĠ Ġinit Comment Field () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) ĠviewModel . load First Comment Page () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe Observer s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . data State . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġdata State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Pagination ( data State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ChangeListener . on Data StateChange ( data State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . view State . observe ( view Lifecycle Owner , ĠObserver Ġ{ Ġview State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" View Comment Fragment , ĠView State : Ġ${ view State . view Comments Fields }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler Adapter . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreload G lide Images ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Manager Ġ= Ġrequest Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġview State . view Comments Fields . comment List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment List Ġ= Ġview State . view Comments Fields . comment List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Pagination ( data State : ĠData State < Story ViewState >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġincoming Ġdata Ġfrom ĠData State ĊĠĠĠĠĠĠĠ Ġdata State . data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . data ?. let { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getContent IfNot Handled ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . handle Incoming Comment List Data ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġpagination Ġend Ġ( no Ġmore Ġresults ) ĊĠĠĠĠĠĠĠ Ġ// Ġmust Ġdo Ġthis Ġb / c Ġserver Ġwill Ġreturn Ġan ĠApi ErrorResponse Ġif Ġpage Ġis Ġnot Ġvalid , ĊĠĠĠĠĠĠĠ Ġ// Ġ-> Ġmeaning Ġthere Ġis Ġno Ġmore Ġdata . ĊĠĠĠĠĠĠĠ Ġdata State . error ?. let Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . peek Content (). response . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Error Handling . is Pagination Done ( it )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandle Ġthe Ġerror Ġmessage Ġevent Ġso Ġit Ġdoesn 't Ġdisplay Ġin ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . getContent IfNot Handled () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġquery Ġex hausted Ġto Ġupdate ĠRecyclerView Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" No Ġmore Ġresults ..." Ġlist Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Comment Query Ex hausted ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit RecyclerView () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcomment _ recyclerview . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( this @ View Comment Fragment . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Spacing Decorator Ġ= ĠTop Spacing Item Decoration ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Item Decoration ( top Spacing Decorator ) Ġ// Ġdoes Ġnothing Ġif Ġnot Ġapplied Ġalready ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( top Spacing Decorator ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler Adapter Ġ= ĠComment ListAdapter ( request Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( object : ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Position Ġ= Ġlayout Manager . find Last Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Position Ġ== Ġre cycler Adapter . item Count . minus ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Story Fragment : Ġattempting Ġto Ġload Ġnext Ġpage ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . next Comment Page () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġre cycler Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Story Post Description () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstory Post Ġ= ĠviewModel . get Story Post () ĊĊĠĠĠĠĠĠĠ Ġrequest Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( story Post . profile _ image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( description _ profile _ image ) ĊĊĠĠĠĠĠĠĠ Ġdescription _ username . text Ġ= Ġstory Post . username ĊĠĠĠĠĠĠĠ Ġdescription . text Ġ= Ġstory Post . caption ĊĠĠĠĠĠĠĠ Ġdescription _ time _ posted . text Ġ= ĠDate Utils . convert Long ToString Date ( story Post . date _ published ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Comment Field () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcomment _ send . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġcomment _ edit text . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment _ send . isEnabled Ġ= Ġs ?. isNotBlank () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġcomment _ send . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Comment ( comment _ edit text . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . setState Event ( Story State Event . Post Comment Event ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear UI () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ// Ġclear Ġreferences Ġ( can Ġleak Ġmemory ) ĊĠĠĠĠĠĠĠ Ġcomment _ recyclerview . adapter Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Comments Loaded () ĊĠĠĠĠĠĠĠ Ġswipe _ refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Comments Loaded () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . load First Comment Page (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset UI () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomment _ recyclerview . smooth Scroll To Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġstate ChangeListener . hide Soft Keyboard () ĊĠĠĠĠĠĠĠ Ġfocus able _ view . request Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomment _ recyclerview . smooth Scroll To Position ( recycler Adapter . item Count ) ĊĠĠĠĠĠĠĠ Ġstate ChangeListener . hide Soft Keyboard () ĊĠĠĠĠĠĠĠ Ġfocus able _ view . request Focus () ĊĠĠĠĠĠĠĠ Ġcomment _ edit text . setText ("") ĊĠĠĠĠĠĠĠ ĠviewModel . set Comment ("") ĊĠĠĠ Ġ} Ċ } Ċ