package Ġcom . alf resco . content . list view Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġcom . air bnb . e po xy . Async E po xy Controller Ċ import Ġcom . air bnb . e po xy . E po xy RecyclerView Ċ import Ġcom . air bnb . mv rx . Async Ċ import Ġcom . air bnb . mv rx . Fail Ċ import Ġcom . air bnb . mv rx . Loading Ċ import Ġcom . air bnb . mv rx . M aver icks State Ċ import Ġcom . air bnb . mv rx . M aver icks View Ċ import Ġcom . air bnb . mv rx . M aver icks ViewModel Ċ import Ġcom . air bnb . mv rx . with State Ċ import Ġcom . alf resco . content . actions . Action Add Favorite Ċ import Ġcom . alf resco . content . actions . Action Add Offline Ċ import Ġcom . alf resco . content . actions . Action Create Folder Ċ import Ġcom . alf resco . content . actions . Action Delete Ċ import Ġcom . alf resco . content . actions . Action Remove Favorite Ċ import Ġcom . alf resco . content . actions . Action Remove Offline Ċ import Ġcom . alf resco . content . actions . Context ual Actions Sheet Ċ import Ġcom . alf resco . content . data . Entry Ċ import Ġcom . alf resco . content . data . Response Paging Ċ import Ġcom . alf resco . content . simple Controller Ċ import Ġcom . alf resco . events . on Ċ import Ġcom . alf resco . list . replace Ċ Ċ interface ĠListView State Ġ: ĠM aver icks State Ġ{ ĊĠĠĠ Ġval Ġentries : ĠList < Entry > ĊĠĠĠ Ġval Ġhas More Items : ĠBoolean ĊĠĠĠ Ġval Ġrequest : ĠAsync < Response Paging > ĊĠĠĠ Ġval Ġis Compact : ĠBoolean ĊĊĠĠĠ Ġfun Ġcopy (_ entries : ĠList < Entry >): ĠListView State ĊĊĠĠĠ Ġfun Ġcopy Removing ( entry : ĠEntry ) Ġ= ĊĠĠĠĠĠĠĠ Ġcopy ( entries . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ!= Ġentry . id ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġfun Ġcopy Updating ( entry : ĠEntry ) Ġ= ĊĠĠĠĠĠĠĠ Ġcopy ( entries . replace ( entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ== Ġentry . id ĊĠĠĠĠĠĠĠ Ġ}) Ċ } Ċ Ċ abstract Ġclass ĠList ViewModel < S Ġ: ĠListView State >( ĊĠĠĠ ĠinitialState : ĠS Ċ ) Ġ: ĠM aver icks ViewModel < S >( initialState ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . on < Action Delete > Ġ{ ĠonDelete ( it . entry ) Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . on < Action Create Folder > Ġ{ ĠonCreate Folder ( it . entry ) Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . on < Action Add Favorite > Ġ{ Ġupdate Entry ( it . entry ) Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . on < Action Remove Favorite > Ġ{ Ġupdate Entry ( it . entry ) Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . on < Action Add Offline > Ġ{ Ġupdate Entry ( it . entry ) Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . on < Action Remove Offline > Ġ{ Ġupdate Entry ( it . entry ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonDelete ( entry : ĠEntry ) Ġ= Ġentry . run Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Entry ( entry ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonCreate Folder ( entry : ĠEntry ) Ġ= Ġentry . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġremove Entry ( entry : ĠEntry ) Ġ= ĊĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġcopy Removing ( entry ) Ġas ĠS Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġupdate Entry ( entry : ĠEntry ) Ġ= ĊĠĠĠĠĠĠĠ ĠsetState Ġ{ Ġcopy Updating ( entry ) Ġas ĠS Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > ĠList < T >. replace ( newValue : ĠT , Ġblock : Ġ( T ) Ġ-> ĠBoolean ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block ( it )) ĠnewValue Ġelse Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġrefresh () ĊĠĠĠ Ġabstract Ġfun Ġfetch Next Page () ĊĠĠĠ Ġabstract Ġfun Ġempty Message Args ( state : ĠListView State ): ĠTrip le < Int , ĠInt , ĠInt > ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠITE MS _ PER _ PAGE Ġ= Ġ 2 5 ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠList Fragment < VM Ġ: ĠList ViewModel < S >, ĠS Ġ: ĠListView State > Ġ: ĊĠĠĠ ĠFragment ( R . layout . fragment _ list ), ĠM aver icks View Ġ{ ĊĠĠĠ Ġabstract Ġval ĠviewModel : ĠVM ĊĊĠĠĠ Ġlateinit Ġvar Ġloading Animation : ĠView ĊĠĠĠ Ġlateinit Ġvar Ġre cyclerView : ĠE po xy RecyclerView ĊĠĠĠ Ġlateinit Ġvar Ġrefresh Layout : ĠSw ipe Refresh Layout ĊĠĠĠ Ġlateinit Ġvar Ġloading Message : ĠTextView ĊĠĠĠ Ġprivate Ġval Ġe po xy Controller : ĠAsync E po xy Controller Ġby Ġlazy Ġ{ Ġe po xy Controller () Ġ} ĊĠĠĠ Ġprivate Ġvar Ġdelayed Boundary : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġloading Animation Ġ= Ġview . findViewById ( R . id . loading _ animation ) ĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= Ġview . findViewById ( R . id . recycler _ view ) ĊĠĠĠĠĠĠĠ Ġrefresh Layout Ġ= Ġview . findViewById ( R . id . refresh _ layout ) ĊĠĠĠĠĠĠĠ Ġloading Message Ġ= Ġview . findViewById ( R . id . loading _ message ) ĊĊĠĠĠĠĠĠĠ Ġrefresh Layout . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . refresh () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġre cyclerView . set Controller ( e po xy Controller ) ĊĊĠĠĠĠĠĠĠ Ġe po xy Controller . adapter . register Adapter Data Observer ( object Ġ: ĠRecyclerView . Adapter Data Observer () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Range Inserted ( position Start : ĠInt , Ġitem Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Start Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ@ see : Ġhttps :// github . com / air bnb / e po xy / issues / 2 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager ?. scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ= Ġwith State ( viewModel ) Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠ Ġloading Animation . isVisible Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . request Ġis ĠLoading Ġ&& Ġstate . entries . isEmpty () Ġ&& Ġ! refresh Layout . is Refresh ing ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state . request . complete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġe po xy Controller . request Model Build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġe po xy Controller () Ġ= Ġsimple Controller ( viewModel ) Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( state . entries . isEmpty () Ġ&& Ġstate . request . complete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠviewModel . empty Message Args ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistView Message Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid (" empty _ message ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Res ( args . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( args . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( args . third ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state . entries . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . type Ġ== ĠEntry . Type . GROUP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist ViewGroup Header Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistView Row Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ( stable Id ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompact ( state . is Compact ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Listener Ġ{ Ġmodel , Ġ_, Ġ_, Ġ_ Ġ-> Ġon Item Clicked ( model . data ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmore ClickListener Ġ{ Ġmodel , Ġ_, Ġ_, Ġ_ Ġ-> Ġon Item More Clicked ( model . data ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . hasMore Items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . request Ġis ĠLoading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistView Page Loading Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid (" loading Ġat Ġ${ state . entries . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOn Ġfailure Ġdelay Ġcreating Ġthe Ġboundary Ġso Ġthat Ġthe Ġlist Ġscroll s Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthe Ġuser Ġhas Ġto Ġscroll Ġback Ġdown Ġto Ġactivate Ġa Ġretry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Fail Ġ= Ġstate . request Ġis ĠFail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Fail Ġ&& Ġ! delayed Boundary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Boundary Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Delayed ({ Ġthis . request Model Build () Ġ}, Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Fail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Boundary Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistView Page Boundary Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid (" boundary Ġat Ġ${ state . entries . size }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĠviewModel . fetch Next Page () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstable Id ( entry : ĠEntry ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( entry . is Upload ) Ġentry . box Id . toString () ĊĠĠĠĠĠĠĠ Ġelse Ġentry . id ĊĊĠĠĠ Ġabstract Ġfun Ġon Item Clicked ( entry : ĠEntry ) ĊĊĠĠĠ Ġopen Ġfun Ġon Item More Clicked ( entry : ĠEntry ) Ġ{ ĊĠĠĠĠĠĠĠ ĠContext ual Actions Sheet . with ( entry ). show ( child FragmentManager , Ġnull ) ĊĠĠĠ Ġ} Ċ } Ċ