package Ġcom . pand ul ape ter . building list . feature Ċ Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . pand ul ape ter . building list . R Ċ import Ġcom . pand ul ape ter . building list . data . model . Country Ċ import Ġcom . pand ul ape ter . building list . data . repository . Repository Ċ import Ġcom . pand ul ape ter . building list . feature . list . Ui Model Ċ import Ġjava . util . UUID Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ class ĠBuilding List ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠRepository Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġitems : ĠLive Data < List < Ui Model >> Ġget () Ġ= Ġ_ items ĊĠĠĠ Ġprivate Ġval Ġ_ items Ġ= ĠMutable LiveData < List < Ui Model >>() ĊĠĠĠ Ġprivate Ġvar Ġis Filter By Country Expanded Ġby ĠRefresh ing Property ( true ) ĊĠĠĠ Ġprivate Ġvar Ġselected Country Ids Ġby ĠRefresh ing Property ( Country . values (). map Ġ{ Ġit . id Ġ}) ĊĠĠĠ Ġprivate Ġvar Ġis Sort By Expanded Ġby ĠRefresh ing Property ( true ) ĊĠĠĠ Ġprivate Ġvar Ġselected Sorting Mode Ġby ĠRefresh ing Property ( Sorting Mode . HEIGHT ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Items () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Expand able Header Clicked ( header Id : ĠString ) Ġ= Ġwhen Ġ( header Id ) Ġ{ ĊĠĠĠĠĠĠĠ ĠID _ FILTER _ BY _ COUNTRY Ġ-> Ġis Filter By Country Expanded Ġ= Ġ! is Filter By Country Expanded ĊĠĠĠĠĠĠĠ ĠID _ SORT _ BY Ġ-> Ġis Sort By Expanded Ġ= Ġ! is Sort By Expanded ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġheader ĠID : Ġ$ header Id ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Filter Option Clicked ( country Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Country Ids Ġ= Ġif Ġ( selected Country Ids . contains ( country Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Country Ids . filter Not Ġ{ Ġit Ġ== Ġcountry Id Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Country Ids . to Mutable List (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( country Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Sorting Option Clicked ( sorting Option Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Sorting Mode Ġ= ĠSort ingMode . values (). first Ġ{ Ġit . id Ġ== Ġsorting Option Id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Item Full Width ( position : ĠInt ) Ġ= Ġ_ items . value ?. get ( position )?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġit Ġis ĠUi Model . Filter Option Ġ|| Ġit Ġis ĠUi Model . Building ĊĠĠĠ Ġ} Ġ== Ġtrue ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ items . value Ġ= Ġmutable ListOf < Ui Model >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Filter Section () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sorting Section () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Building Section () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < Ui Model >. add Filter Section () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUi Model . Expand able Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠID _ FILTER _ BY _ COUNTRY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ResourceId Ġ= ĠR . string . filter _ by _ country , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Expanded Ġ= Ġis Filter By Country Expanded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Filter By Country Expanded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( Country . values (). map Ġ{ Ġcountry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi Model . Filter Option ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġcountry . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ResourceId Ġ= Ġcountry . name ResourceId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Checked Ġ= Ġselected Country Ids . contains ( country . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon ResourceId Ġ= Ġcountry . flag Drawable ResourceId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < Ui Model >. add Sorting Section () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUi Model . Expand able Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠID _ SORT _ BY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ResourceId Ġ= ĠR . string . sort _ by , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Expanded Ġ= Ġis Sort By Expanded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Sort By Expanded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( Sorting Mode . values (). map Ġ{ ĠsortBy Mode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi Model . Sorting Option ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠsortBy Mode . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ResourceId Ġ= ĠsortBy Mode . name ResourceId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Checked Ġ= ĠsortBy Mode Ġ== Ġselected Sorting Mode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMutable List < Ui Model >. add Building Section () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild ings Ġ= Ġrepository . build ings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġselected Country Ids . contains ( it . country . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( selected Sorting Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort ingMode . CON STR UCTION _ YEAR Ġ-> Ġit . construction Year ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort ingMode . HEIGHT Ġ-> Ġ- it . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUi Model . Build ings Header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠID _ BUILD INGS _ HEADER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilding Count Ġ= Ġbuild ings . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġadd All ( build ings . map Ġ{ Ġbuilding Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUi Model . Building ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġbuilding . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġbuilding . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġbuilding . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstruction Year Ġ= Ġbuilding . construction Year , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthumbnail Drawable ResourceId Ġ= Ġbuilding . thumbnail Drawable ResourceId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠSort ingMode ( ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠString Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠ Ġ@ String Res Ġval Ġname ResourceId : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠHEIGHT ( name ResourceId Ġ= ĠR . string . height ), ĊĠĠĠĠĠĠĠ ĠCON STR UCTION _ YEAR ( name ResourceId Ġ= ĠR . string . construction _ year ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRefresh ing Property < T >( private Ġvar Ġvalue : ĠT ) Ġ: ĠRead Write Property < Building List ViewModel , ĠT > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠBuilding List ViewModel , Ġproperty : ĠK Property <* >) Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠBuilding List ViewModel , Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . value Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ref . refresh Items () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID _ FILTER _ BY _ COUNTRY Ġ= Ġ" filter By Country " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID _ SORT _ BY Ġ= Ġ" sortBy " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠID _ BUILD INGS _ HEADER Ġ= Ġ" build ings Header " ĊĠĠĠ Ġ} Ċ }