package Ġcom . fort ie 4 0 . words _ filtering 3 . adapters Ċ Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . text . Sp ann able Ċ import Ġandroid . text . Sp ann able String Ċ import Ġandroid . text . style . BackgroundColor Span Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Filter Ċ import Ġandroid . widget . Filter able Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . fort ie 4 0 . words _ filtering 3 . HEADER Ċ import Ġcom . fort ie 4 0 . words _ filtering 3 . HEADER _ TITLE Ċ import Ġcom . fort ie 4 0 . words _ filtering 3 . NAMES Ċ import Ġcom . fort ie 4 0 . words _ filtering 3 . R Ċ import Ġcom . fort ie 4 0 . words _ filtering 3 . interfaces . IC lick Listener Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠSearch Adapter ( names : ĠList < String >, Ġlistener : ĠI ClickListener ): ĊĠĠĠ ĠRecyclerView . Adapter < RecyclerView . ViewHolder >(), ĠFilter able Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsearch String : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġview Inflater ( parent : ĠViewGroup , Ġlayout : ĠInt ): ĠView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Inflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlayout Inflater . inflate ( layout , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġoriginal List : ĠList < String > Ġ= Ġnames ĊĠĠĠ Ġvar Ġstring : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġresults Found : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Filter edList : ĠList < String > Ġ= Ġnames ĊĠĠĠ Ġprivate Ġval Ġclick Handler : ĠI ClickListener Ġ= Ġlistener ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHEADER Ġ-> ĠHeader ViewHolder . create Header ViewHolder ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNAMES Ġ-> ĠSearch ViewHolder . create Search ViewHolder ( parent , Ġclick Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSearch ViewHolder . create Search ViewHolder ( parent , Ġclick Handler ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Filter edList . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġm Filter edList [ position ] ĊĠĠĠĠĠĠĠ Ġval ĠitemView Type Ġ= ĠgetItem ViewType ( position ) ĊĠĠĠĠĠĠĠ Ġif Ġ( item ViewType Ġ== ĠNAMES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġholder Ġas ĠSearch ViewHolder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh . bind ( name , Ġstring ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh . i Position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( holder Ġas ĠHeader ViewHolder ). bind ( results Found , Ġ( m Filter edList . size Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( m Filter edList [ position ] Ġ== ĠHEADER _ TITLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHEADER ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNAMES ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Filter (): ĠFilter Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . filter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfilter Ġ= Ġobject Ġ: ĠFilter () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġperform Filtering ( constraint : ĠCharSequence ?): ĠFilter Results Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar String Ġ= Ġconstraint . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Filter edList Ġ= Ġif Ġ( char String . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġchar String . trim (). replace (". ". to Regex (), Ġ"$ 0 .* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġ" .* $ pattern ". to Regex () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter edList Ġ= Ġoriginal List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . toLowerCase ( Locale . getDefault ()). matches ( regex ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" adapter ", Ġ" ******** ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" adapter ", Ġ" filtered ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch String Ġ= Ġchar String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter edList ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Results Ġ= ĠFilter Results () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Results . values Ġ= Ġm Filter edList ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Ġfilter Results ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpublish Results ( constraint : ĠCharSequence ?, Ġresults : ĠFilter Results ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Found Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Results Ġ= Ġresults !!. values Ġas ĠArrayList < String > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Results . size Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Results . add ( 0 , ĠHEADER _ TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Filter edList Ġ= Ġall Results ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠHeader ViewHolder Ġprivate Ġconstructor ( n Item View : ĠView ): ĠRecyclerView . ViewHolder ( n Item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate Header ViewHolder ( parent : ĠViewGroup ): ĠHeader ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemView Ġ= Ġview Inflater ( parent , ĠR . layout . header _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHeader ViewHolder ( item View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġheader Ġ= Ġn Item View . findViewById < TextView >( R . id . header ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġresults Ġ= Ġn Item View . findViewById < TextView >( R . id . results _ found ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext Ġ= ĠitemView . context ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( results Found : ĠBoolean , Ġitem Count : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! results Found ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader . text Ġ= Ġcontext . getString ( R . string . recent _ sear ches ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults String Ġ= Ġcontext . getString ( R . string . results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader . text Ġ= Ġresults String . toUpperCase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . text Ġ= Ġcontext . getString ( R . string . results _ found , Ġitem Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSearch ViewHolder Ġprivate Ġconstructor ( n Item View : ĠView ): ĠRecyclerView . ViewHolder ( n Item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġclick Handler : ĠI ClickListener ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate Search ViewHolder ( parent : ĠViewGroup , Ġclick Handler : ĠI ClickListener ): ĠSearch ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠitemView Ġ= Ġview Inflater ( parent , ĠR . layout . search _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . click Handler Ġ= Ġclick Handler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSearch ViewHolder ( item View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhistory Ġ= Ġn Item View . findViewById < ImageView >( R . id . history ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġresults Ġ= Ġn Item View . findViewById < TextView >( R . id . results ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrestore Ġ= Ġn Item View . findViewById < ImageView >( R . id . restore ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Position Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbind ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . text Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbind ( name : ĠSp ann able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . set Padding ( 8 , Ġ 0 , Ġ 8 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . text Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( name : ĠString , Ġstring : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( string Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsp ann able Ġ= ĠSp ann able String ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch String !!. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Pos Ġ= Ġname . toLowerCase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. indexOf ( it . toLowerCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Pos Ġ= Ġstart Pos Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp ann able . set Span ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBackground Color Span ( Color . YELLOW ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Pos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp ann able . SPAN _ EXCL USIVE _ EXCL USIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Pos Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( span nable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Handler !!. on Results Click ( i Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Handler !!. on Restore Click ( i Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }