/* Ċ Ġ* Ġ é¡¹çĽ® åĲį ï¼ļ 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 . main Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Configuration Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . Observer Ċ 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 . ui . detail . Detail Activity Ċ import Ġcom . fs yy . listener . utils . extension . to Post Ċ import Ġcom . fs yy . listener . utils . Log Utils Ċ import Ġcom . fs yy . listener . utils . extension . startActivity Ċ import Ġkotlinx . android . synt hetic . main . fragment _ en counter .* Ċ Ċ class ĠEn counter Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠEn counter ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠEn counter Adapter ĊĠĠĠ Ġprivate Ġval Ġlimit = 2 0 ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠviewModel = ViewModel Provider ( this ). get ( Encounter ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġobserve ViewModel () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ en counter , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġrefresh Posts () ĊĠĠĠĠĠĠĠ Ġinit Swipe Refresh () ĊĠĠĠĠĠĠĠ Ġinit Adapter () ĊĠĠĠĠĠĠĠ Ġinit RecyclerView () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve ViewModel (){ ĊĠĠĠĠĠĠĠ ĠviewModel . posts LiveData . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposts = it . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// else å·²ç»ı åľ¨ Repository ä¸Ń å¤ĦçĲĨ è¿ĩ ï¼Į è¿ĻéĩĮ åıª éľĢè¦ģ å¤ĦçĲĨ posts != null çļĦ æĥħåĨµ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( posts != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . post List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( post Ġin Ġposts ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . post List . add ( post . to Post ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Lik es ( posts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencounter _ swipe Refresh . is Refresh ing = false ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . more Posts LiveData . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposts = it . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( posts != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( post Ġin Ġposts ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . post List . add ( post . to Post ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Lik es ( posts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencounter _ swipe Refresh . is Refresh ing = false ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . likes LiveData . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlikes = it . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( likes != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" like è¡¨ çļĦ æķ°éĩı ${ likes . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( like Ġin Ġlikes ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æŁ¥è¯¢ like è¡¨ ä¸ŃçļĦ æīĢæľī æķ°æį® ï¼Į ä¸İ åĪļ åĪļ åĬłè½½ çļĦ åĩłä¸ª post è¿Ľè¡Į å¯¹ æ¯Ķ ï¼Į åĪ¤æĸŃ æĺ¯åĲ¦ çĤ¹ èµ ŀ è¿ĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// todo Ġ è¿ĻéĩĮ æ²¡æľī include çļĦè¯Ŀ ï¼Į éĤ£ä¹Ī getPost æľī åı¯èĥ½ æĺ¯ null ï¼Į æµĭè¯ķ ä¸Ģä¸ĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Id = like . get AV Object < AV Object >(" post "). objectId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange = Ġlimit * viewModel . load Count LiveData . value !! Ġuntil ĠviewModel . post List . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġrange ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( post Id == viewModel . post List [ i ]. objectId ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . post List [ i ]. is Like = true ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . post List [ i ]. like ObjectId = like . objectId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" post List [ 0 ] çļĦ like ObjectId æĺ¯ ${ viewModel . post List [ 0 ]. like ObjectId }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġå°Ĩ is Refresh ing ç§» åĪ°äºĨ è¿ĻéĩĮ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencounter _ swipe Refresh . is Refresh ing = false ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencounter _ swipe Refresh . is Refresh ing = false ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġrefresh Posts (){ ĊĠĠĠĠĠĠĠ ĠviewModel . clear Load Count () ĊĠĠĠĠĠĠĠ ĠviewModel . load Posts ( limit ) ĊĠĠĠĠĠĠĠ Ġencounter _ swipe Refresh . is Refresh ing = true ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġload More Posts (){ ĊĠĠĠĠĠĠĠ ĠviewModel . plus Load Count () ĊĠĠĠĠĠĠĠ ĠviewModel . load More Posts ( limit , viewModel . load Count LiveData . value !! ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit Swipe Refresh (){ ĊĠĠĠĠĠĠĠ Ġencounter _ swipe Refresh . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Posts () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit Adapter (){ ĊĠĠĠĠĠĠĠ Ġadapter = Encounter Adapter ( viewModel . post List , activity !! ) ĊĠĠĠĠĠĠĠ Ġadapter . setOn ItemClickListener { Ġ_, Ġpos -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost = viewModel . post List [ pos ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. startActivity < Detail Activity > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" post ", post ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . setOn Like ClickListener Ġ{ Ġ_, Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI ( pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Server ( pos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit RecyclerView (){ ĊĠĠĠĠĠĠĠ Ġencounter _ recyclerview . add On Scroll Listener ( object Ġ: RecyclerView . On Scroll Listener (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Pull Up = false ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager = re cyclerView . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Visible Item Pos = layout Manager . find Last Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æ»ĳ åĬ¨ çĽĳ æµĭ ï¼ļ last Visible Item Pos =$ last Visible Item Pos , item Count =${ adapter . item Count }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( newState == RecyclerView . SCROLL _ STATE _ IDLE Ġ&& Ġlast Visible Item Pos + 1 == adapter . item Count && is Pull Up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& adapter . item Count ==( viewModel . load Count LiveData . value !! + 1 )* limit ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æī§è¡Į åĬłè½½ æĽ´å¤ļ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload More Posts () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( dy <- View Configuration . get ( this @ Encounter Fragment . activity ). scaled Touch S lop ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Pull Up = true ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġencounter _ recyclerview . layout Manager = Linear LayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġencounter _ recyclerview . adapter = adapter ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( pos : Int ){ ĊĠĠĠĠĠĠĠ Ġ// æł¹æį® like çļĦ çĬ¶æĢģ ï¼Į åıĺ æĽ´ post çļĦ çĬ¶æĢģ ï¼Į æĽ´æĸ° adapter ĊĠĠĠĠĠĠĠ Ġval Ġpost = viewModel . post List [ pos ] ĊĠĠĠĠĠĠĠ Ġif ( post . is Like ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . is Like = false ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . like Count -- ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . is Like = true ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . like Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . notify Item Changed ( pos ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġupdate Server ( pos : ĠInt ){ ĊĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° like è¡¨ ï¼Į åĪłéĻ¤ like è¡¨ ä¸ŃçļĦ è¿Ļä¸Ģ è¡Į æķ°æį® ï¼Į save Event ually ï¼Į æĽ´æĸ° post è¡¨ çļĦ like count æķ°æį® ĊĠĠĠĠĠĠĠ Ġval Ġpost = viewModel . post List [ pos ] ĊĠĠĠĠĠĠĠ Ġif ( post . is Like ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æĪĳ è¦ģ å¼Ģå§ĭ å°Ĩ like ä¿ĿåŃĺ è¿Ľ like è¡¨ äºĨ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Av Object = AV Object . create Without Data (" Post ", post . objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save Like ( map Of (" user " Ġto ĠAV User . currentUser (), " post " Ġto Ġpost Av Object )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æĪĳ è¦ģ å¼Ģå§ĭ å°Ĩ çĤ¹ èµ ŀ æķ°éĩı ä¿ĿåŃĺ è¿Ľ Post è¡¨ äºĨ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost . like ObjectId = it . objectId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Av Object . increment (" like Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Av Object . save Event ually () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" æĪĳ è¦ģ åĪłéĻ¤ ï¼Į ä½Ĩæĺ¯ post . like ObjectId åį´ æĺ¯ ${ post . like ObjectId }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlike = AV Object . create Without Data (" Like ", post . like ObjectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlike . delete Event ually () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Av Object = AV Object . create Without Data (" Post ", post . objectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Av Object . decrement (" like Count ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Av Object . save Event ually () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }