package Ġru . i pl c . gallery . screens . add friends Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġru . i pl c . gallery . R Ċ import Ġru . i pl c . gallery . databinding . Activity Add Friends Binding Ċ import Ġru . i pl c . gallery . databinding . Add Friends Item Binding Ċ import Ġru . i pl c . gallery . models . User Ċ import Ġru . i pl c . gallery . screens . common . Simple Callback Ċ import Ġru . i pl c . gallery . screens . common . load User Photo Ċ // import Ġkotlinx . android . synt hetic . main . add _ friends _ item . view .* Ċ Ċ class ĠF riends Adapter ( private Ġval Ġlistener : ĠListener ) ĊĠĠĠ Ġ: ĠRecyclerView . Adapter < Friends Adapter . ViewHolder >() Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠAdd Friends Item Binding ĊĠĠĠ Ġclass ĠViewHolder ( val Ġview : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ) ĊĊĠĠĠ Ġinterface ĠListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfollow ( uid : ĠString ) ĊĠĠĠĠĠĠĠ Ġfun Ġun follow ( uid : ĠString ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Users Ġ= ĠlistOf < User >() ĊĠĠĠ Ġprivate Ġvar Ġm Positions Ġ= Ġmap Of < String , ĠInt >() ĊĠĠĠ Ġprivate Ġvar Ġm Follow s Ġ= Ġmap Of < String , ĠBoolean >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . add _ friends _ item , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠAdd Friends Item Binding . bind ( view ) ĊĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( holder . view ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġm Users [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . photo Image . load User Photo ( user . photo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . username Text . text Ġ= Ġuser . username ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . name Text . text Ġ= Ġuser . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . follow Btn . setOnClickListener Ġ{ Ġlistener . follow ( user . uid ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . un follow Btn . setOnClickListener Ġ{ Ġlistener . un follow ( user . uid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfollows Ġ= Ġm Follow s [ user . uid ] Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( follow s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . follow Btn . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . un follow Btn . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . follow Btn . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . un follow Btn . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count () Ġ= Ġm Users . size ĊĊĠĠĠ Ġfun Ġupdate ( users : ĠList < User >, Ġfollows : ĠMap < String , ĠBoolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdiff Result Ġ= ĠDiff Util . calculate Diff ( Simple Callback ( m Users , Ġusers ) Ġ{ Ġit . uid Ġ}) ĊĠĠĠĠĠĠĠ Ġm Users Ġ= Ġusers ĊĠĠĠĠĠĠĠ Ġm Positions Ġ= Ġusers . with Index (). map Ġ{ Ġ( idx , Ġuser ) Ġ-> Ġuser . uid Ġto Ġidx Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġm Follow s Ġ= Ġfollows ĊĠĠĠĠĠĠĠ Ġdiff Result . dispatch Updates To ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfollowed ( uid : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Follow s Ġ+= Ġ( uid Ġto Ġtrue ) ĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( m Positions [ uid ] !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġun follow ed ( uid : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Follow s Ġ-= Ġuid ĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( m Positions [ uid ] !! ) ĊĠĠĠ Ġ} Ċ }