package Ġcom . wa 2 c . android . cif sd ocument spro vider . presentation . ui . host Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . wa 2 c . android . cif sd ocument spro vider . R Ċ import Ġcom . wa 2 c . android . cif sd ocument spro vider . common . values . Host Sort Type Ċ import Ġcom . wa 2 c . android . cif sd ocument spro vider . databinding . Layout Host Item Binding Ċ import Ġcom . wa 2 c . android . cif sd ocument spro vider . domain . model . Host Data Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠHost Ġlist Ġadapter . Ċ Ġ*/ Ċ class ĠHost ListAdapter ( ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠHost ViewModel Ċ ): Ġ ĠRecyclerView . Adapter < RecyclerView . ViewHolder >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġitem List Ġ= Ġmutable ListOf < Host Data >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Data Binding Util . inflate ( LayoutInflater . from ( parent . context ), ĠR . layout . layout _ host _ item , Ġparent , false ) Ġas ĠLayout Host Item Binding ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot View Ġ= Ġit . root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot View . tag Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠRecyclerView . ViewHolder ( root View ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= Ġholder . item View . tag Ġas ĠLayout Host Item Binding ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġitem List . get OrNull ( position ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġbinding . data Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġbinding . root . setOnClickListener Ġ{ ĠviewModel . onClick Item ( item ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġitem List . count () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Data ( data : ĠHost Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( viewModel . sort Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . Detection Asc end Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġto Ġlast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem List . add ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Inserted ( item List . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . Detection Desc end Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġto Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem List . add ( 0 , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Inserted ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġand Ġsort ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem List . add ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsort () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbefore Size Ġ= Ġitem List . size ĊĠĠĠĠĠĠĠ Ġitem List . clear () ĊĠĠĠĠĠĠĠ Ġnotify Item Range Removed ( 0 , Ġbefore Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSort Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsort () Ġ{ ĊĠĠĠĠĠĠĠ ĠCollections . sort ( item List , Ġhost Comparator ) ĊĠĠĠĠĠĠĠ Ġnotify Item Range Changed ( 0 , Ġitem List . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSort Ġcomparator ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġhost Comparator Ġ= Ġobject Ġ: ĠComparator < Host Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( p 0 : ĠHost Data , Ġp 1 : ĠHost Data ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( viewModel . sort Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . Detection Asc end Ġ-> Ġp 0 . detection Time . compareTo ( p 1 . detection Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . Detection Desc end Ġ-> Ġp 1 . detection Time . compareTo ( p 0 . detection Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . HostName Asc end Ġ-> Ġcompare HostName ( p 0 , Ġp 1 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . HostName Desc end Ġ-> Ġcompare HostName ( p 0 , Ġp 1 , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . IpAddress Asc end Ġ-> Ġcompare IpAddress ( p 0 , Ġp 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHost Sort Type . IpAddress Desc end Ġ-> Ġcompare IpAddress ( p 1 , Ġp 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCompare Ġhost Ġname . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcompare HostName ( p 0 : ĠHost Data , Ġp 1 : ĠHost Data , Ġis Asc end : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasc end Ġ= Ġif Ġ( is Asc end ) Ġ 1 Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( p 0 . has HostName Ġ&& Ġp 1 . has HostName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp 0 . host Name . compareTo ( p 1 . host Name ) Ġ* Ġasc end ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( p 0 . has HostName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( p 1 . has HostName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompare IpAddress ( p 0 , Ġp 1 ) Ġ* Ġasc end ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCompare ĠIP Ġaddress ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcompare IpAddress ( p 0 : ĠHost Data , Ġp 1 : ĠHost Data ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 0 Address Ġ= Ġp 0 . ipAddress . split (". "). map Ġ{ Ġit . toInt OrNull () Ġ?: ĠInt . MAX _ VALUE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Address Ġ= Ġp 1 . ipAddress . split (". "). map Ġ{ Ġit . toInt OrNull () Ġ?: ĠInt . MAX _ VALUE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( p 0 Address . size Ġ== Ġ 4 Ġ&& Ġp 1 Address . size Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( p 0 Address [ i ]. compareTo ( p 1 Address [ i ])). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġ 0 ) Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp 0 . ipAddress . compareTo ( p 1 . ipAddress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ