package Ġcom . kick starter . ui . activities Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Pair Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . recyclerview . widget . Concat Adapter Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . kick starter . R Ċ import Ġcom . kick starter . databinding . ActivityThread Layout Binding Ċ import Ġcom . kick starter . libs . Base Activity Ċ import Ġcom . kick starter . libs . KS String Ċ import Ġcom . kick starter . libs . RecyclerView Paginator Ċ import Ġcom . kick starter . libs . qual ifiers . Requires Activity ViewModel Ċ import Ġcom . kick starter . libs . utils . Application Utils Ċ import Ġcom . kick starter . libs . utils . Url Utils Ċ import Ġcom . kick starter . libs . utils . extensions . show AlertDialog Ċ import Ġcom . kick starter . models . Comment Ċ import Ġcom . kick starter . ui . adapters . Rep lies Adapter Ċ import Ġcom . kick starter . ui . adapters . Rep lies Status Adapter Ċ import Ġcom . kick starter . ui . adapters . Root Comment Adapter Ċ import Ġcom . kick starter . ui . extensions . hide Keyboard Ċ import Ġcom . kick starter . ui . views . On Comment Composer View Clicked Listener Ċ import Ġcom . kick starter . view models . Thread ViewModel Ċ import Ġorg . joda . time . DateTime Ċ import Ġrx . android . schedul ers . Android Schedulers Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ Requires Activity ViewModel ( Thread ViewModel . ViewModel :: class ) Ċ class ĠThread Activity Ġ: ĊĠĠĠ ĠBase Activity < Thread ViewModel . ViewModel >(), ĊĠĠĠ ĠRep lies Status Adapter . Delegate , ĊĠĠĠ ĠRep lies Adapter . Delegate Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Thread Layout Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġks String : ĠK S String ĊĊĠĠĠ Ġ/** ĠRep lies Ġlist Ġadapter Ġ**/ ĊĠĠĠ Ġprivate Ġval Ġreplies Adapter Ġ= ĠRep lies Adapter ( this ) ĊĠĠĠ Ġ/** Ġ ĠRep lies Ġcell Ġstatus Ġview More Ġor ĠError Ġ Ġ**/ ĊĠĠĠ Ġprivate Ġval Ġreplies Status Adapter Ġ= ĠRep lies Status Adapter ( this ) ĊĠĠĠ Ġ/** ĠRep lies ĠRoot Ġcomment Ġcell Ġadapter Ġ**/ ĊĠĠĠ Ġprivate Ġval Ġroot Comment Adapter Ġ= ĠRoot Comment Adapter () ĊĠĠĠ Ġ/** Ġreverse ĠLayout Ġto Ġbind Ġthe Ġreplies Ġfrom Ġbottom Ġ**/ ĊĠĠĠ Ġprivate Ġval Ġlinear LayoutManager Ġ= ĠLinearLayoutManager ( this , ĠLinearLayoutManager . VERTICAL , Ġtrue ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView Paginator : ĠRecyclerView Paginator ĊĠĠĠ Ġvar Ġis Pag inated Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Thread Layout Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġks String Ġ= Ġenvironment (). ks String () ĊĠĠĠĠĠĠĠ Ġre cyclerView Paginator Ġ= ĠRecyclerView Paginator ( binding . comment Rep lies RecyclerView , Ġ{ ĠviewModel . inputs . next Page () Ġ}, ĠviewModel . outputs . is Fetching Rep lies (), Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġ/** Ġuse ĠConcat Adapter Ġto Ġbind Ġadapters Ġto Ġre cycler Ġview Ġand Ġreplace Ġthe Ġsection Ġissue Ġ**/ ĊĠĠĠĠĠĠĠ Ġbinding . comment Rep lies RecyclerView . adapter Ġ= ĠConcat Adapter ( replies Adapter , Ġreplies Status Adapter , Ġroot Comment Adapter ) ĊĠĠĠĠĠĠĠ Ġbinding . comment Rep lies RecyclerView . layout Manager Ġ= Ġlinear LayoutManager ĊĊĠĠĠĠĠĠĠ Ġthis . viewModel . outputs . getRoot Comment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġcomment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġbind Ġroot Ġcomment Ġby Ġupdating Ġthe Ġadapter Ġlist **/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Comment Adapter . update Root Comment Cell ( comment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . viewModel . outputs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Comment Rep lies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinear LayoutManager . stack From End Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġbind ĠView Ġmore Ġcell Ġif Ġthe Ġreplies Ġmore Ġthan Ġ 7 Ġor Ġupdate Ġafter Ġrefresh Ġinitial Ġerror Ġstate Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . replies Status Adapter . addView More Cell ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . first . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . replies Adapter . take Data ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . should Show Pagination Error UI () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġbind ĠError ĠPagination Ġcell Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplies Status Adapter . add Error Pagination Cell ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . initial Load Comments Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** Ġbind ĠError Ġinitial Ġloading Ġcell Ġ**/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplies Status Adapter . add Init ially Loading Error Cell ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . is Fetching Rep lies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . replies Loading Indicator . isVisible Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . viewModel . should Focus On Compose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 3 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġshould Open Keyboard Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . reply Composer . request Comment Composer Key Board ( should Open Keyboard ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . currentUser Avatar () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . reply Composer . set Avatar Url ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . reply Composer Status () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . reply Composer . set Comment Composer Status ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . scrollTo Bottom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 5 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġbinding . comment Rep lies RecyclerView . smooth Scroll To Position ( 0 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . show Reply Composer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . reply Composer . isVisible Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . load More Rep lies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView Paginator . reload () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . reply Composer . set Comment Composer Action ClickListener ( object Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOn Comment Composer View Clicked Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ActionListener ( string : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Reply ( string ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . show Comment Guide Lines Link () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Utils . open Url Ex tern ally ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUrl Utils . append Path ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment (). web Endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComments Activity . COMMENT _ K ICK STAR TER _ GUID EL IN ES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . has Pending Comments () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġhandle Back Action () Ġelse ĠviewModel . inputs . back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . outputs . close Thread Activity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( bind To Lifecycle ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Comments Activity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Back Action () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . show AlertDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . Your _ comment _ was nt _ posted ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . You _ will _ lose _ the _ comment _ if _ you _ leave _ this _ page ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . Cancel ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . Leave _ page ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Action Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Action Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . inputs . back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġback () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding . reply Composer . is Comment Composer Empty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . inputs . check If There Any Pending Comments () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Back Action () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Comments Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . back () ĊĠĠĠĠĠĠĠ Ġthis . finish Activity ( taskId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpost Reply ( comment : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . viewModel . inputs . insert New Reply ToList ( comment , ĠDateTime . now ()) ĊĠĠĠĠĠĠĠ Ġthis . binding . reply Composer . clear Comment Composer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexit Transition (): ĠPair < Int , ĠInt >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPair . create ( R . anim . fade _ in _ slide _ in _ left , ĠR . anim . slide _ out _ right ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Retry View Clicked ( comment : ĠComment ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Reply Button Clicked ( comment : ĠComment ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Flag Button Clicked ( comment : ĠComment ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Comment Guide Lines Clicked ( comment : ĠComment ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . inputs . on Show Guide Lines Link Clicked () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Comment Rep lies Clicked ( comment : ĠComment ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Comment Posted Failed ( comment : ĠComment , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . inputs . refresh Comment Card In Case Failed Posted ( comment , Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Comment Posted Success Fully ( comment : ĠComment , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . inputs . refresh Comment Card In Case Success Posted ( comment , Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload More Callback () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . inputs . reload Rep lies Page () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġretry Callback () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . inputs . reload Rep lies Page () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Show Comment Clicked ( comment : ĠComment ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . inputs . on Show Canceled P ledge Comment ( comment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġre cyclerView Paginator . stop () ĊĠĠĠĠĠĠĠ Ġbinding . comment Rep lies RecyclerView . adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . viewModel Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ