package Ġcom . art f . chat app . utils čĊč Ċ import Ġandroid . view . View č Ċ import Ġandroid . widget . ImageView č Ċ import Ġandroid . widget . LinearLayout č Ċ import Ġandroid . widget . TextView č Ċ import Ġandroidx . core . content . Context Compat č Ċ import Ġandroidx . databinding . Binding Adapter č Ċ import Ġandroidx . recyclerview . widget . RecyclerView č Ċ import Ġcom . art f . chat app . R č Ċ import Ġcom . art f . chat app . data . model . Chat č Ċ import Ġcom . art f . chat app . data . model . Message č Ċ import Ġcom . art f . chat app . data . model . User č Ċ import Ġcom . art f . chat app . utils . extension . save To č Ċ import Ġcom . art f . chat app . utils . extension . to Dp č Ċ import Ġcom . art f . chat app . view . chat Room . Msg Adapter č Ċ import Ġcom . art f . chat app . view . chat Rooms . Chat ListAdapter č Ċ import Ġcom . art f . chat app . view . search User . Search Adapter č Ċ import Ġcom . bump tech . glide . G lide č Ċ import Ġcom . bump tech . glide . request . RequestOptions č Ċ import Ġcom . google . firebase . Timestamp č Ċ import Ġkotlinx . coroutines . Coroutine Scope č Ċ import Ġkotlinx . coroutines . Dispatch ers č Ċ import Ġkotlinx . coroutines . launch č Ċ import Ġkotlinx . coroutines . with Context č Ċ import Ġjava . text . SimpleDateFormat č Ċ import Ġjava . util . Locale čĊč Ċ @ Binding Adapter (" msg List ") č Ċ fun Ġbind Msg RecyclerView ( re cyclerView : ĠRecyclerView , Ġdata : ĠList < Message > ?) Ġ{ čĊĠĠĠ Ġval Ġadapter Ġ= Ġre cyclerView . adapter Ġas ĠMsg Adapter čĊĠĠĠ Ġadapter . submit List ( data ) Ġ{ Ġre cyclerView . layout Manager ?. scrollTo Position ( adapter . item Count Ġ- Ġ 1 ) Ġ} čĊĠĠĠ Ġadapter . notify DataSet Changed () č Ċ } čĊč Ċ @ Binding Adapter (" user Search List ") č Ċ fun Ġbind User Search RecyclerView ( re cyclerView : ĠRecyclerView , Ġdata : ĠList < User > ?) Ġ{ čĊĠĠĠ Ġval Ġadapter Ġ= Ġre cyclerView . adapter Ġas ĠSearch Adapter čĊĠĠĠ Ġadapter . submit List ( data ) čĊĠĠĠ Ġadapter . notify DataSet Changed () č Ċ } čĊč Ċ @ Binding Adapter (" user Chat List ") č Ċ fun Ġbind User Chat RecyclerView ( re cyclerView : ĠRecyclerView , Ġdata : ĠList < Chat > ?) Ġ{ čĊĠĠĠ Ġval Ġadapter Ġ= Ġre cyclerView . adapter Ġas ĠChat ListAdapter čĊĠĠĠ Ġadapter . submit List ( data ) čĊĠĠĠ Ġadapter . notify DataSet Changed () č Ċ } čĊč Ċ @ Binding Adapter (" imageUrl ") č Ċ fun Ġbind Image ( img View : ĠImageView , Ġimg Url : ĠString ?) Ġ{ čĊčĊĠĠĠ Ġif Ġ( img Url . isNull OrEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠ Ġimg View . visibility Ġ= ĠView . GONE čĊĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠ Ġ} Ġelse Ġimg View . visibility Ġ= ĠView . VISIBLE čĊčĊĠĠĠ Ġif Ġ( img Url Ġ== Ġ" loading ") Ġ{ čĊĠĠĠĠĠĠĠ Ġimg View . setImage Resource ( R . drawable . loading _ animation ) čĊĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠ Ġ} čĊčĊĠĠĠ ĠG lide . with ( img View . context ) čĊĠĠĠĠĠĠĠ Ġ. load ( img Url ) čĊĠĠĠĠĠĠĠ Ġ. apply ( čĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Options () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . loading _ animation ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error ( R . drawable . ic _ broken _ image ) čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ. into ( img View ) č Ċ } čĊč Ċ @ Binding Adapter (" profile Img Url ") č Ċ fun Ġbind Profile Img ( img View : ĠImageView , Ġimg Url : ĠString ?) Ġ{ čĊčĊĠĠĠ Ġif Ġ( img Url . isNull OrEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠ Ġimg View . setImage Resource ( R . drawable . ic _ account _ circle _ black _ 2 4 dp ) čĊĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠ Ġ} čĊčĊĠĠĠ ĠG lide . with ( img View . context ) čĊĠĠĠĠĠĠĠ Ġ. load ( img Url ) čĊĠĠĠĠĠĠĠ Ġ. apply ( čĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Options () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . loading _ animation ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error ( R . drawable . ic _ account _ circle _ black _ 2 4 dp ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. circle Crop () čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ. into ( img View ) č Ċ } čĊč Ċ @ Binding Adapter (" hour Time ") č Ċ fun Ġbinding Text Hour Time ( textView : ĠTextView , Ġtimestamp : ĠAny ?) Ġ{ čĊĠĠĠ Ġif Ġ( timestamp Ġis ĠTimestamp ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġdf Ġ= ĠSimpleDateFormat (" HH : mm ", ĠLocale . getDefault ()) čĊĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġdf . format ( timestamp . toDate ()) čĊĠĠĠ Ġ} č Ċ } čĊč Ċ @ Binding Adapter (" text Or G one Name ", Ġ" group Chat ") č Ċ fun Ġbinding Text Or G one Username ( textView : ĠTextView , Ġtext : ĠString ?, Ġis Group Chat : ĠBoolean ?) Ġ{ čĊĠĠĠ Ġval Ġgroup Chat Ġ= Ġis Group Chat Ġ?: Ġfalse čĊčĊĠĠĠ Ġif Ġ( text Ġ== Ġnull Ġ|| Ġgroup Chat . not ()) Ġ{ čĊĠĠĠĠĠĠĠ ĠtextView . visibility Ġ= ĠView . GONE čĊĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠ ĠtextView . visibility Ġ= ĠView . VISIBLE čĊĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġtext čĊĠĠĠ Ġ} č Ċ } čĊč Ċ @ Binding Adapter (" text Or G one ") č Ċ fun Ġbinding Text Or G one ( textView : ĠTextView , Ġtext : ĠString ?) Ġ{ čĊĠĠĠ Ġif Ġ( text Ġ== Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠ ĠtextView . visibility Ġ= ĠView . GONE čĊĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠ ĠtextView . visibility Ġ= ĠView . VISIBLE čĊĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġtext čĊĠĠĠ Ġ} č Ċ } čĊč Ċ @ Binding Adapter (" last Msg ") č Ċ fun Ġbinding Last Msg ( textView : ĠTextView , Ġmessage : ĠMessage ?) Ġ{ čĊĠĠĠ Ġif Ġ( message Ġ== Ġnull ) Ġreturn čĊĠĠĠ Ġmessage . audio Url ?. let Ġ{ ĠtextView . text Ġ= Ġ"\ uD 8 3 C \ uD FA 4 ĠRecord " Ġ} čĊĠĠĠ Ġmessage . photoUrl ?. let Ġ{ ĠtextView . text Ġ= Ġ"\ uD 8 3 D \ u DC F 7 ĠPhoto " Ġ} čĊĠĠĠ Ġmessage . text ?. let Ġ{ ĠtextView . text Ġ= Ġit Ġ} č Ċ } čĊč Ċ @ Binding Adapter (" g one If Null ") č Ċ fun Ġbinding G one If Null ( view : ĠView , Ġtext : ĠString ?) Ġ{ čĊĠĠĠ Ġview . visibility Ġ= Ġif Ġ( text Ġ== Ġnull ) ĠView . GONE Ġelse ĠView . VISIBLE č Ċ } čĊč Ċ @ Binding Adapter (" g one If NotNull ") č Ċ fun Ġbinding G one If NotNull ( view : ĠView , Ġtext : ĠString ?) Ġ{ čĊĠĠĠ Ġview . visibility Ġ= Ġif Ġ( text Ġ== Ġnull ) ĠView . VISIBLE Ġelse ĠView . GONE č Ċ } čĊč Ċ @ Binding Adapter (" audio Time ") č Ċ fun Ġbinding Audio Time ( textView : ĠTextView , Ġaudio File : ĠLong ?) Ġ{ čĊĠĠĠ Ġaudio File ?. let Ġ{ ĠUtility . set Audio Time Mm Ss ( textView , Ġaudio File ) Ġ} č Ċ } čĊč Ċ @ Binding Adapter (" fake Audio Progress ") č Ċ fun Ġbinding Fake Audio Progress ( view : ĠView , Ġmsg : ĠMessage ?) Ġ{ čĊĠĠĠ Ġif Ġ( msg Ġ== Ġnull ) Ġreturn čĊĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ čĊĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . VISIBLE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Audio ( msg ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . audio Downloaded Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . GONE čĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= ĠView . GONE čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } čĊč Ċ @ Binding Adapter (" online Tint ") č Ċ fun Ġbinding Online Tint ( view : ĠImageView , Ġis Online : ĠBoolean ?) Ġ{ čĊĠĠĠ Ġis Online ?. let Ġ{ čĊĠĠĠĠĠĠĠ Ġview . setColor Filter ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Online ) ĠContext Compat . getColor ( view . context , ĠR . color . online On ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠContext Compat . getColor ( view . context , ĠR . color . online Off ) čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠ Ġ} č Ċ } čĊč Ċ @ Binding Adapter (" read Icon Tint ") č Ċ fun Ġbinding Read Icon Tint ( view : ĠImageView , Ġtimestamp : ĠAny ?) Ġ{ čĊĠĠĠ Ġview . setColor Filter ( čĊĠĠĠĠĠĠĠ Ġif Ġ( timestamp Ġ!= Ġnull ) ĠContext Compat . getColor ( view . context , ĠR . color . read On ) čĊĠĠĠĠĠĠĠ Ġelse ĠContext Compat . getColor ( view . context , ĠR . color . read Off ) čĊĠĠĠ Ġ) č Ċ } čĊč Ċ /** čĊ Ġ* ĠWhen Ġ@ RecyclerView Ġis Ġin Ġparent Ġlayout _ height =" wrap _ content " Ġit Ġb links Ġon Ġdata Ġchange . čĊ Ġ* ĠSetting Ġlayout _ height Ġprogram matically Ġprevent Ġblink ing Ġon Data Change . čĊ Ġ*/ č Ċ @ Binding Adapter (" prevent Search B linking ") č Ċ fun Ġbind Prevent Search B linking ( linear Layout : ĠLinearLayout , Ġdata : ĠList < User > ?) Ġ{ čĊĠĠĠ Ġdata ?. let Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġparent Height Ġ= Ġ( linear Layout . parent Ġas ĠLinearLayout ). height čĊĠĠĠĠĠĠĠ Ġval Ġcustom Height Ġ= Ġit . size Ġ* Ġ 7 4 . to Dp () Ġ+ Ġ 1 6 . to Dp () čĊĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġif Ġ( custom Height Ġ> Ġparent Height ) Ġparent Height Ġelse Ġcustom Height čĊĠĠĠĠĠĠĠ Ġlinear Layout . layout Params . height Ġ= Ġif Ġ( it . isEmpty ()) Ġ 9 0 . to Dp () Ġelse Ġnew Height čĊĠĠĠ Ġ} č Ċ } čĊč Ċ suspend Ġfun Ġget Audio ( msg : ĠMessage ) Ġ{ čĊĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ Ġmsg . audio File ?. let Ġ{ Ġmsg . audio Url ?. save To ( it ) Ġ} Ġ} č Ċ }