/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . ui . demos Ċ Ċ import Ġandroidx . compose . Composable Ċ import Ġandroidx . compose . key Ċ import Ġandroidx . compose . on Commit Ċ import Ġandroidx . ui . core . Focus Manager Ambient Ċ import Ġandroidx . ui . core . Modifier Ċ import Ġandroidx . ui . core . Text Ċ Ċ import Ġandroidx . ui . core . TextField Ċ Ċ import Ġandroidx . ui . foundation . Icon Ċ import Ġandroidx . ui . foundation . Vertical Scroller Ċ import Ġandroidx . ui . graphics . composite Over Ċ import Ġandroidx . ui . layout . Column Ċ import Ġandroidx . ui . layout . Layout Align Ċ import Ġandroidx . ui . layout . Layout Gravity Ċ import Ġandroidx . ui . layout . Layout Height Ċ import Ġandroidx . ui . material . IconButton Ċ import Ġandroidx . ui . material . ListItem Ċ import Ġandroidx . ui . material . Material Theme Ċ import Ġandroidx . ui . material . Top AppBar Ċ import Ġandroidx . ui . material . icons . Icons Ċ import Ġandroidx . ui . material . icons . filled . Close Ċ import Ġandroidx . ui . text . Annotated String Ċ import Ġandroidx . ui . text . Span Style Ċ import Ġandroidx . ui . text . with Style Ċ import Ġandroidx . ui . unit . dp Ċ Ċ /** Ċ Ġ* ĠA Ġscroll able Ġlist Ġof Ġ[ launch able Dem os ], Ġfiltered Ġby Ġ[ filter Text ]. Ċ Ġ*/ Ċ @ Composable Ċ fun ĠDemo Filter ( launch able Dem os : ĠList < Demo >, Ġfilter Text : ĠString , Ġon Navigate : Ġ( Demo ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġfiltered Dem os Ġ= Ġlaunch able Dem os ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . title . contains ( filter Text , Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . title Ġ} ĊĠĠĠ ĠVertical Scroller Ġ{ ĊĠĠĠĠĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiltered Dem os . forEach Ġ{ Ġdemo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFilter ed Demo ListItem ( demo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Text Ġ= Ġfilter Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Navigate Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Navigate ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ Top AppBar ] Ġwith Ġa Ġtext Ġfield Ġallowing Ġfiltering Ġall Ġthe Ġde mos . Ċ Ġ*/ Ċ @ Composable Ċ fun ĠFilter AppBar ( filter Text : ĠString , Ġon Filter : Ġ( String ) Ġ-> ĠUnit , ĠonClose : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġwith ( Material Theme . colors ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Bar Color Ġ= Ġif Ġ( is Light ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBl ending Ġprimary Ġover Ġsurface Ġaccording Ġto ĠMaterial Ġdesign Ġguidance Ġfor Ġbrand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsurfaces Ġin Ġdark Ġtheme ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprimary . copy ( alpha Ġ= Ġ 0 . 0 8 f ). composite Over ( surface ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTop AppBar ( color Ġ= Ġapp Bar Color , Ġcontent Color Ġ= Ġon Surface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( modifier Ġ= ĠLayout Gravity . Center , ĠonClick Ġ= ĠonClose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( Icons . Filled . Close ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFilter Field ( filter Text , Ġon Filter , ĠLayout Gravity . Center ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ TextField ] Ġthat Ġedits Ġthe Ġcurrent Ġ[ filter Text ], Ġproviding Ġ[ on Filter ] Ġwhen Ġedited . Ċ Ġ*/ Ċ @ Composable Ċ private Ġfun ĠFilter Field ( ĊĠĠĠ Ġfilter Text : ĠString , ĊĠĠĠ Ġon Filter : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier . None Ċ ) Ġ{ ĊĠĠĠ Ġval Ġidentifier Ġ= Ġ" filter " ĊĠĠĠ Ġval Ġmanager Ġ= ĠFocus Manager Ambient . current ĊĠĠĠ Ġon Commit ( manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager . request Focus ById ( identifier ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠTODO : Ġreplace Ġwith ĠMaterial Ġtext Ġfield Ġwhen Ġavailable ĊĠĠĠ ĠTextField ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġfilter Text , ĊĠĠĠĠĠĠĠ Ġfocus Identifier Ġ= Ġidentifier , ĊĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġon Filter ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ[ ListItem ] Ġthat Ġdisplays Ġa Ġ[ demo ] Ġand Ġhighlight s Ġany Ġmatches Ġfor Ġ[ filter Text ] Ġinside Ġ[ Demo . title ] Ċ Ġ*/ Ċ @ Composable Ċ private Ġfun ĠFilter ed Demo ListItem ( ĊĠĠĠ Ġdemo : ĠDemo , ĊĠĠĠ Ġfilter Text : ĠString , ĊĠĠĠ Ġon Navigate : Ġ( Demo ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġprimary Ġ= ĠMaterial Theme . colors (). primary ĊĠĠĠ Ġval Ġannotated String Ġ= ĠAnnot ated String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġdemo . title ĊĠĠĠĠĠĠĠ Ġvar ĠcurrentIndex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġfilter Text . to Regex ( option Ġ= ĠRegex Option . IGNORE _ CASE ) ĊĠĠĠĠĠĠĠ Ġpattern . findAll ( title ). forEach Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġresult . range . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> ĠcurrentIndex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( title . substring ( currentIndex , Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Style ( Span Style ( color Ġ= Ġprimary )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġresult . range . last Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ<= Ġtitle . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( title . substring ( currentIndex , Ġtitle . length )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġkey ( demo . title ) Ġ{ ĊĠĠĠĠĠĠĠ ĠListItem ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠLayout Height ( 5 6 . dp ) Ġ+ ĠLayout Align . Center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġannotated String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġon Navigate ( demo ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ