/* Ċ Ġ* Ġ é¡¹çĽ® åĲį ï¼ļ Listener Ċ Ġ* Ġä½ľèĢħ ï¼ļ @ happy _ fs yy Ċ Ġ* Ġ èģĶç³» æĪĳ ï¼ļ https :// github . com / happy fs yy Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . ĠLorem Ġipsum Ġdolor Ġsit Ġamet , Ġconsectetur Ġadipiscing Ġelit . Ċ Ġ* ĠMor bi Ġnon Ġlorem Ġport t itor Ġneque Ġfe ugiat Ġbland it . ĠUt Ġvitae Ġipsum Ġeget Ġquam Ġlac in ia Ġaccum san . Ċ Ġ* ĠE ti am Ġsed Ġturpis Ġac Ġipsum Ġcon dim ent um Ġf ring illa . ĠMa ec enas Ġmagna . Ċ Ġ* ĠPro in Ġd ap ibus Ġsapi en Ġvel Ġante . ĠAli quam Ġerat Ġvol ut pat . ĠP ellentesque Ġsag itt is Ġlig ula Ġeget Ġmetus . Ċ Ġ* ĠV estibulum Ġcommodo . ĠUt Ġr hon cus Ġgrav ida Ġarcu . Ċ Ġ*/ Ċ Ċ package Ġcom . fs yy . listener . ui . detail Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Configuration Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcn . lean cloud . AV Object Ċ import Ġcn . lean cloud . AV User Ċ import Ġcom . fs yy . listener . R Ċ import Ġcom . fs yy . listener . logic . model . Comment Ċ import Ġcom . fs yy . listener . logic . model . Inner Comment Ċ import Ġcom . fs yy . listener . logic . model . Post Ċ import Ġcom . fs yy . listener . logic . model . Tree Hole Ċ import Ġcom . fs yy . listener . ui . My Application Ċ import Ġcom . fs yy . listener . ui . homepage . HomePage Activity Ċ import Ġcom . fs yy . listener . utils . Log Utils Ċ import Ġcom . fs yy . listener . utils . Popup Util Ċ import Ġcom . fs yy . listener . utils . Soft Keyboard Utils Ċ import Ġcom . fs yy . listener . utils . Toast Util Ċ import Ġcom . fs yy . listener . utils . extension . startActivity Ċ import Ġcom . fs yy . listener . utils . extension . to Comment Ċ import Ġcom . fs yy . listener . utils . extension . to Inner Comment Ċ import Ġkotlinx . android . synt hetic . main . activity _ detail .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠDetail Activity Ġ: ĠAppCompatActivity (), View . OnClickListener Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠDetail Adapter ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġlazy Ġ{ ĠViewModel Provider ( this ). get ( Detail ViewModel :: class . java ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġlimit = 1 0 ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ detail ) ĊĠĠĠĠĠĠĠ ĠLog Utils . e (" Detail ï¼ļ intent . get () æĺ¯ ${ intent . get Serializable Extra (" post ") Ġas ĠPost }") ĊĠĠĠĠĠĠĠ ĠviewModel . post = intent . get Serializable Extra (" post ") Ġas ĠPost ĊĠĠĠĠĠĠĠ ĠviewModel . to UserName LiveData . value =" æ¥¼ ä¸» " ĊĠĠĠĠĠĠĠ ĠLog Utils . e ( viewModel . post . toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel . post . comment Count > 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Comment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Toolbar () ĊĠĠĠĠĠĠĠ Ġinit Observer () ĊĠĠĠĠĠĠĠ Ġinit Adapter () ĊĠĠĠĠĠĠĠ Ġinit RecyclerView () ĊĠĠĠĠĠĠĠ Ġinit Listener () ĊĠĠĠĠĠĠĠ Ġrefresh Data () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit Toolbar (){ ĊĠĠĠĠĠĠĠ Ġdetail _ header . set Right Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . popup Window = Popup Util . show Popup Window ( viewModel . popup View , window . decor View ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . report . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . share 2 We Chat . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . cancel . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( v ?. id ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . report . id -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . popup Window . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast Util . show Center Toast ( R . drawable . success , getString ( R . string . toast _ report _ success )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Report () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . share 2 We Chat . id -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . popup Window . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast Util . show Center Toast ( R . drawable . failure , getString ( R . string . toast _ share _ wechat )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . cancel . id -> ĠviewModel . popup Window . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġsave Report (){ ĊĠĠĠĠĠĠĠ Ġval Ġav Object = AV Object (" Report ") ĊĠĠĠĠĠĠĠ Ġav Object . put (" author ", AV User . currentUser ()) ĊĠĠĠĠĠĠĠ Ġav Object . put (" post ", AV Object . create Without Data (" Post ", viewModel . post . objectId )) ĊĠĠĠĠĠĠĠ Ġav Object . save Event ually () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Observer (){ ĊĠĠĠĠĠĠĠ ĠviewModel . all Comments LiveData . observe ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Comments = it . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( all Comments != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment AV List = all Comments . comment List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Comment AV List = all Comments . inner Comment List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( av Object Ġin Ġcomment AV List ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAV User . create Without Data ("_ User "," objectId ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List . add ( av Object . to Comment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æī§è¡Į load Lik es æĸ¹æ³ķ åīį ï¼Į datal ist . size æĺ¯ ${ viewModel . data List . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Lik es ( comment AV List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Comment List = ArrayList < Inner Comment >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( av Object Ġin Ġinner Comment AV List ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Comment List . add ( av Object . to Inner Comment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( inner Comment Ġin Ġinner Comment List ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloor = inner Comment . floor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange = 1 Ġuntil ĠviewModel . data List . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġrange ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment = viewModel . data List [ i ] Ġas ĠComment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( comment . floor == floor ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . inner Comment List . add ( inner Comment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . likes LiveData . observe ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" å·²ç»ı èİ·å¾Ĺ è¯Ħè®º çļĦ çĤ¹ èµ ŀ æĥħåĨµ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlikes = it . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( likes != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æł¹æį® objectId ï¼Į æŁ¥è¯¢ å¯¹åºĶçļĦ comment ï¼Į å°± å°Ĩ å®ĥçļĦ is Like è®¾ç½®ä¸º true ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Pos = if ( viewModel . load Count LiveData . value == 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit * viewModel . load Count LiveData . value !! + 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange = Ġstart Pos Ġuntil ĠviewModel . data List . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" å½ĵåīį æķ°æį®çļĦ å¤§å°ı æĺ¯ ${ viewModel . data List . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" start Pos æĺ¯ $ start Pos , datal ist . size - start Post æĺ¯ ${ viewModel . data List . size - start Pos }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( like Ġin Ġlikes ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment Id = like . get AV Object < AV Object >(" comment "). objectId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġrange ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( comment Id == viewModel . data List [ i ]. objectId ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ i ]. is Like = true ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ i ]. like ObjectId = like . objectId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Range Changed ( start Pos , viewModel . data List . size - start Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ swipe _ refresh . is Refresh ing = false ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . new Post LiveData . observe ( this ){ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Post = result . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( new Post != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment Count = new Post . getInt (" comment Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloor = comment Count + 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . publish Comment ( map Of (" from Author " Ġto ĠAV User . currentUser (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" content " Ġto Ġdetail _ edit . text . toString (), " post " Ġto ĠAV Object . create Without Data (" Post ", viewModel . post . objectId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" floor " Ġto Ġfloor )){ comment -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġæµ ĭ è¯ķ å¦Ĥæŀľ ä¸įæĺ¯ ç©º çļĦ AV Object ï¼Į èĢĮ æĺ¯ å¸¦ æľī æķ°æį®çļĦ AV Object ï¼Į ä¾ĭå¦Ĥ like Count = 0 çļĦ ï¼Į çĦ¶åĲİ increment ä¹ĭåĲİ save ï¼Į è¿Ļ æľŁ éĹ´ è¢« äºº çĤ¹ èµ ŀ äºĨ ï¼Į save ä¹ĭåĲİ ï¼Į éĤ£ä¹Ī æľįåĬ¡åĻ¨ çļĦ like Count æĺ¯ å¤ļå°ĳ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġempty Post = AV Object . create Without Data (" Post ", viewModel . post . objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Post . increment (" comment Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Post . save Event ually () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġ çĽĳ æµĭ save In Background ä¹ĭåĲİ çļĦæķ°æį® åĮħæĭ¬ author çļĦ username åĲĹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æĪĳ è¦ģ å°Ĩ åıĳå¸ĥ çļĦ è¯Ħè®º è½¬ åĮĸ ä¸º æľ¬åľ° çļĦ Comment äºĨ ï¼Į ä¼ļ ä¸įä¼ļ åĩº éĶĻ ï¼Į åĽłä¸º æ²¡ include Ġauthor ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List . add ( comment . to Comment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear UI () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . popup Window 2 ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast Util . show Center Toast ( R . drawable . success , ĠgetString ( R . string . toast _ comment _ success )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . to UserName LiveData . observe ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" Ob serve äºĨ ï¼Į value æĺ¯ ${ viewModel . to UserName LiveData . value }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail _ edit . hint = String . format ( getString ( R . string . detail _ edit _ hint ), viewModel . to UserName LiveData . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . new Comment LiveData . observe ( this ){ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Comment = it . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( new Comment != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment Count = new Comment . getInt (" comment Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequested Inner Floor = comment Count + 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloor = viewModel . floor LiveData . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Floor = viewModel . inner Floor LiveData . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æĪĳ è¦ģ æµĭè¯ķ ï¼ģï¼ģ ï¼ģï¼ģ ï¼ģ å½ĵåīį çļĦ inner Floor æĺ¯ $ inner Floor ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment = viewModel . data List [ floor ] Ġas ĠComment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Author = if ( inner Floor == - 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAV Object . create Without Data ("_ User ", comment . userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAV Object . create Without Data ("_ User ", comment . inner Comment List [ inner Floor ]. userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent = detail _ edit . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . publish Comment ( map Of (" from Author " Ġto ĠAV User . currentUser (), Ġ" to Author " Ġto Ġto Author , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" content " Ġto Ġcontent ," post " Ġto ĠAV Object . create Without Data (" Post ", viewModel . post . objectId ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" floor " Ġto Ġfloor ," inner Floor " Ġto Ġrequested Inner Floor ," is Inner " Ġto Ġtrue )){ inner Comment -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment AV = AV Object . create Without Data (" Comment ", comment . objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment AV . increment (" comment Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment AV . save Event ually () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . comment Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġ ä¿ĿåŃĺ å¥½ ä¹ĭåĲİ ï¼Į æŁ¥è¯¢ è¿Ļä¸ª è¯Ħè®º çļĦæīĢæľī inner Comment ï¼Į å±ķç¤º åĩºæĿ¥ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load All Inner Comments ( viewModel . post . objectId , floor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . all Inner Comments . observe ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinner Comments = it . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( inner Comments != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġlist æĽ´æĸ° ï¼Į å¯¹åºĶ floor çļĦ adapter æĽ´æĸ° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloor = viewModel . floor LiveData . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment : Comment = viewModel . data List [ floor ] Ġas ĠComment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . inner Comment List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( inner Comment AV Ġin Ġinner Comments ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . inner Comment List . add ( inner Comment AV . to Inner Comment ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear UI () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . popup Window 2 ?. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify Item Changed ( floor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġload Comment (){ ĊĠĠĠĠĠĠĠ ĠLog Utils . e (" load Comment () ä¸ŃçļĦ load Count æĺ¯ 0 ") ĊĠĠĠĠĠĠĠ ĠviewModel . load Comment ( limit , viewModel . post . objectId , 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġload More Comment (){ ĊĠĠĠĠĠĠĠ ĠLog Utils . e (" åĬłè½½ æĽ´å¤ļ è¯Ħè®º ") ĊĠĠĠĠĠĠĠ ĠviewModel . plus Load Count () ĊĠĠĠĠĠĠĠ ĠviewModel . load Comment ( limit , viewModel . post . objectId , viewModel . load Count LiveData . value !! ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit Adapter (){ ĊĠĠĠĠĠĠĠ ĠviewModel . data List . add ( viewModel . post ) ĊĠĠĠĠĠĠĠ Ġadapter = ĠDetail Adapter ( viewModel . data List , this ) ĊĠĠĠĠĠĠĠ Ġadapter . setOn Post Like ClickListener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI ( 0 , Tree Hole . POST ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . setOn Comment Like ClickListener Ġ{ Ġ_, Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI ( pos , Tree Hole . COMMENT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . setOn ItemClickListener Ġ{ Ġview , Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" pos æĺ¯ $ pos ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( pos == 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . to UserName LiveData . value =" æ¥¼ ä¸» " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . floor LiveData . value = 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . inner Floor LiveData . value =- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . floor LiveData . value = pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . inner Floor LiveData . value =- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment = viewModel . data List [ pos ] Ġas ĠComment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . to UserName LiveData . value = comment . userName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . setOn Photo ClickListener Ġ{ Ġ_, Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserId = viewModel . data List [ pos ]. userId ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity < HomePage Activity > Ġ{ Ġput Extra (" userId ", userId ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . setOn Inner Comment ClickListener Ġ{ Ġpos , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġèİ·åıĸ username ï¼Į æĽ´æĶ¹ edit Text çļĦ hint ï¼Į ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" pos æĺ¯ $ pos , index æĺ¯ $ index ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . floor LiveData . value = pos ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . inner Floor LiveData . value = index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment = viewModel . data List [ pos ] Ġas ĠComment ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . to UserName LiveData . value = comment . inner Comment List [ index ]. userName ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . setOn Inner Comment Load More Listener Ġ{ view , floor -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġèİ·åıĸ è¿Ļä¸ª floor çļĦæīĢæľī inner Comment ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . floor LiveData . value = floor ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load All Inner Comments ( viewModel . post . objectId , floor ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( pos : Int , type : Int ){ ĊĠĠĠĠĠĠĠ Ġval Ġis Like = viewModel . data List [ pos ]. is Like ĊĠĠĠĠĠĠĠ Ġif ( is Like ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ pos ]. is Like = false ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ pos ]. like Count -- ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAV Object . create Without Data (" Like ", viewModel . data List [ pos ]. like ObjectId ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Event ually () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Hole AV : AV Object Ġ= Ġif ( type == Tree Hole . POST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAV Object . create Without Data (" Post ", viewModel . data List [ pos ]. objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAV Object . create Without Data (" Comment ", viewModel . data List [ pos ]. objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree Hole AV . decrement (" like Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree Hole AV . save Event ually () ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ pos ]. is Like = true ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ pos ]. like Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type == Tree Hole . COMMENT ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment = AV Object . create Without Data (" Comment ", viewModel . data List [ pos ]. objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save Like ( map Of (" user " Ġto ĠAV User . currentUser (), " comment " Ġto Ġcomment )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ pos ]. like ObjectId = it . objectId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . increment (" like Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment . save Event ually () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost = AV Object . create Without Data (" Post ", viewModel . data List [ pos ]. objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save Like ( map Of (" user " Ġto ĠAV User . currentUser (), " post " Ġto Ġpost )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . data List [ pos ]. like ObjectId = it . objectId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost . increment (" like Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost . save Event ually () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Changed ( pos ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit RecyclerView (){ ĊĠĠĠĠĠĠĠ Ġdetail _ recyclerview . add On Scroll Listener ( object Ġ: RecyclerView . On Scroll Listener (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Visible Pos = 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æ»ĳ åĬ¨ çĬ¶æĢģ æĽ´æĶ¹ , newState =$ newState ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( newState == RecyclerView . SCROLL _ STATE _ IDLE && last Visible Pos + 1 == viewModel . data List . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& viewModel . data List . size ==( viewModel . load Count LiveData . value !! + 1 )* limit Ġ+ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æī§è¡Į ä¸Ĭ æĭī åĬłè½½ æĽ´å¤ļ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload More Comment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" dy =$ dy , touch s lop =${ View Configuration . get ( this @ Detail Activity ). scaled Touch S lop }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager = re cyclerView . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Visible Pos = layout Manager . find Last Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġdetail _ recyclerview . layout Manager = Linear LayoutManager ( this ) ĊĠĠĠĠĠĠĠ Ġdetail _ recyclerview . adapter = adapter ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit Listener (){ ĊĠĠĠĠĠĠĠ Ġdetail _ swipe _ refresh . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" ä¸ĭ æĭī åĪ·æĸ° äºĨ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdetail _ submit . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo ĠæıĲ äº¤ çļĦæĹ¶åĢĻ ï¼Į èİ·åıĸ æľĢ æĸ°çļĦ comment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent = detail _ edit . text . toString (). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( content ! =" "){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġ æĺ¾ç¤º è¿Ľ åº¦ æĿ¡ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . popup Window 2 = Popup Util . show Popup Window ( viewModel . popup View 2 , window . decor View , false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( viewModel . floor LiveData . value == 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . fetch New Post ( viewModel . post . objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment = viewModel . data List [ viewModel . floor LiveData . value !! ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . fetch New Comment ( comment . objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast Util . show Center Toast ( R . drawable . info , getString ( R . string . edit _ content _ toast )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġrefresh Data (){ ĊĠĠĠĠĠĠĠ Ġ// todo Ġ è¿ĻéĩĮ åºĶè¯¥ æĺ¯ åĪ·æĸ° æķ´ä¸ª é¡µéĿ¢ å¹¶ä¸Ķ æĽ¿æį¢ å½ĵåīį intent èİ·å¾Ĺ çļĦ AV Object ĊĊĠĠĠĠĠĠĠ ĠviewModel . data List . clear () ĊĠĠĠĠĠĠĠ ĠviewModel . data List . add ( viewModel . post ) ĊĠĠĠĠĠĠĠ ĠviewModel . clear Load Count () ĊĠĠĠĠĠĠĠ ĠLog Utils . e (" æī§è¡Į refresh Data () ") ĊĠĠĠĠĠĠĠ Ġload Comment () ĊĠĠĠĠĠĠĠ Ġdetail _ swipe _ refresh . is Refresh ing = true ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġclear UI (){ ĊĠĠĠĠĠĠĠ ĠSoft Keyboard Utils . hide Keyboard 2 ( this , detail _ edit ) ĊĠĠĠĠĠĠĠ Ġdetail _ edit . setText ("") ĊĠĠĠĠĠĠĠ Ġdetail _ edit . clear Focus () ĊĠĠĠ Ġ} Ċ }