/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġcom . google . samples . apps . ios ched . ui . filters Ċ Ċ import Ġcom . google . samples . apps . ios ched . model . filters . Filter Ċ import Ġcom . google . samples . apps . ios ched . util . compat Remove If Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . Sharing Started Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . state In Ċ Ċ /** Ċ Ġ* ĠInterface Ġto Ġadd Ġfilters Ġfunctionality Ġto Ġa Ġscreen Ġthrough Ġa ĠViewModel . Ċ Ġ*/ Ċ interface ĠFilters ViewModel Delegate Ġ{ ĊĠĠĠ Ġ/** ĠThe Ġfull Ġlist Ġof Ġfilter Ġch ips . Ġ*/ ĊĠĠĠ Ġval Ġfilter Chips : ĠFlow < List < Filter Chip >> ĊĠĠĠ Ġ/** ĠThe Ġlist Ġof Ġselected Ġfilters . Ġ*/ ĊĠĠĠ Ġval Ġselected Filters : ĠState Flow < List < Filter >> ĊĠĠĠ Ġ/** ĠThe Ġlist Ġof Ġselected Ġfilter Ġch ips . Ġ*/ ĊĠĠĠ Ġval Ġselected Filter Chips : ĠState Flow < List < Filter Chip >> ĊĠĠĠ Ġ/** ĠTrue Ġif Ġthere Ġare Ġany Ġselected Ġfilters . Ġ*/ ĊĠĠĠ Ġval Ġhas Any Filters : ĠState Flow < Boolean > ĊĠĠĠ Ġ/** ĠNumber Ġof Ġresults Ġfrom Ġapplying Ġfilters . ĠCan Ġbe Ġset Ġby Ġimplement ers . Ġ*/ ĊĠĠĠ Ġval Ġresult Count : ĠMutable State Flow < Int > ĊĠĠĠ Ġ/** ĠWhether Ġto Ġshow Ġthe Ġresult Ġcount Ġinstead Ġof Ġthe Ġ" Filters " Ġheader . Ġ*/ ĊĠĠĠ Ġval Ġshow Result Count : ĠState Flow < Boolean > ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġlist Ġof Ġfilters . Ġ*/ ĊĠĠĠ Ġfun Ġset Supported Filters ( filters : ĠList < Filter >) ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġselected Ġstate Ġof Ġthe Ġfilter . ĠMust Ġbe Ġone Ġof Ġthe Ġsupported Ġfilters . Ġ*/ ĊĠĠĠ Ġfun Ġtoggle Filter ( filter : ĠFilter , Ġenabled : ĠBoolean ) ĊĊĠĠĠ Ġ/** ĠClear Ġall Ġselected Ġfilters . Ġ*/ ĊĠĠĠ Ġfun Ġclear Filters () Ċ } Ċ Ċ class ĠFilters ViewModel Delegate Impl ( ĊĠĠĠ Ġexternal Scope : ĠCor outine Scope Ċ ) Ġ: ĠFilters ViewModel Delegate Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ filter Chips Ġ= ĠMutable State Flow < List < Filter Chip >>( emptyList ()) ĊĠĠĠ Ġoverride Ġval Ġfilter Chips : ĠFlow < List < Filter Chip >> Ġ= Ġ_ filter Chips ĊĊĠĠĠ Ġprivate Ġval Ġ_ selected Filters Ġ= ĠMutable State Flow < List < Filter >>( emptyList ()) ĊĠĠĠ Ġoverride Ġval Ġselected Filters : ĠState Flow < List < Filter >> Ġ= Ġ_ selected Filters ĊĊĠĠĠ Ġprivate Ġval Ġ_ selected Filter Chips Ġ= ĠMutable State Flow < List < Filter Chip >>( emptyList ()) ĊĠĠĠ Ġoverride Ġval Ġselected Filter Chips : ĠState Flow < List < Filter Chip >> Ġ= Ġ_ selected Filter Chips ĊĊĠĠĠ Ġoverride Ġval Ġhas Any Filters Ġ= Ġselected Filter Chips ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ. state In ( external Scope , ĠSh aring Started . L az ily , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġval Ġresult Count Ġ= ĠMutable State Flow ( 0 ) ĊĊĠĠĠ Ġ// ĠDefault Ġbehavior : Ġshow Ġcount Ġwhen Ġthere Ġare Ġactive Ġfilters . ĊĠĠĠ Ġoverride Ġval Ġshow Result Count Ġ= Ġhas Any Filters ĊĊĠĠĠ Ġ// ĠState Ġfor Ġinternal Ġlogic ĊĠĠĠ Ġprivate Ġvar Ġ_ filters Ġ= Ġmutable ListOf < Filter >() ĊĠĠĠ Ġprivate Ġval Ġ_ selected Filters List Ġ= Ġmutable Set Of < Filter >() ĊĠĠĠ Ġprivate Ġvar Ġ_ filter Chips List Ġ= Ġmutable ListOf < Filter Chip >() ĊĠĠĠ Ġprivate Ġvar Ġ_ selected Filter Chips List Ġ= Ġmutable ListOf < Filter Chip >() ĊĊĠĠĠ Ġoverride Ġfun Ġset Supported Filters ( filters : ĠList < Filter >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġorphan ed Ġfilters ĊĠĠĠĠĠĠĠ Ġval Ġselected Changed Ġ= Ġ_ selected Filters List . compat Remove If Ġ{ Ġit Ġ! in Ġfilters Ġ} ĊĠĠĠĠĠĠĠ Ġ_ filters Ġ= Ġfilters . to Mutable List () ĊĠĠĠĠĠĠĠ Ġ_ filter Chips List Ġ= Ġ_ filters . map To ( mutable ListOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . as Chip ( it Ġin Ġ_ selected Filters List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( selected Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filter Chips List Ġ= Ġ_ filter Chips List . filter To ( mutable ListOf ()) Ġ{ Ġit . isSelected Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpublish ( selected Changed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpublish ( selected Changed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ filter Chips . value Ġ= Ġ_ filter Chips List ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filters . value Ġ= Ġ_ selected Filters List . toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filter Chips . value Ġ= Ġ_ selected Filter Chips List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtoggle Filter ( filter : ĠFilter , Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filter Ġ! in Ġ_ filters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unsupported Ġfilter : Ġ$ filter ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchanged Ġ= Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filters List . add ( filter ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filters List . remove ( filter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filter Chips List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filters List . map To ( mutable ListOf ()) Ġ{ Ġit . as Chip ( true ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġ_ filter Chips List . indexOf First Ġ{ Ġit . filter Ġ== Ġfilter Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ filter Chips List [ index ] Ġ= Ġfilter . as Chip ( enabled ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Filters () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ selected Filters List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filters List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ selected Filter Chips List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ filter Chips List Ġ= Ġ_ filter Chips List . map To ( mutable ListOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isSelected ) Ġit . copy ( isSelected Ġ= Ġfalse ) Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ