/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ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 . example . android dev challenge Ċ Ċ import Ġandroidx . compose . foundation . Border Stroke Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . Padding Values Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . lazy . Lazy Row Ċ import Ġandroidx . compose . foundation . lazy . items Indexed Ċ import Ġandroidx . compose . foundation . selection . selectable Ċ import Ġandroidx . compose . foundation . shape . Rounded Corner Shape Ċ import Ġandroidx . compose . material . Back drop Sca ffold Ċ import Ġandroidx . compose . material . Back drop Value Ċ import Ġandroidx . compose . material . Experimental Material Api Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . IconButton Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . Top AppBar Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . filled . Close Ċ import Ġandroidx . compose . material . icons . filled . T une Ċ import Ġandroidx . compose . material . remember Back drop Sca ffold State Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . clip Ċ import Ġandroidx . compose . ui . semantics . Role Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġcom . example . android dev challenge . data . P up py Ċ import Ġcom . example . android dev challenge . data . static P up p ies Ċ import Ġcom . example . android dev challenge . ui . theme . P up py Theme Ċ import Ġcom . example . android dev challenge . ui . theme . blue 1 0 0 Ċ import Ġcom . example . android dev challenge . ui . theme . blue 3 0 0 Ċ import Ġkotlinx . coroutines . launch Ċ Ċ @ Opt In ( Experimental Material Api :: class ) Ċ @ Composable Ċ fun ĠP up p ies Home Screen ( ĊĠĠĠ Ġp up p ies : ĠList < P up py >, ĊĠĠĠ Ġnavigate To P up py Details : Ġ( P up py ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġscaffold State Ġ= Ġremember Back drop Sca ffold State ( Back drop Value . Con ce aled ) ĊĠĠĠ Ġval Ġscope Ġ= Ġremember Coroutine Scope () ĊĊĠĠĠ Ġ// ĠTODO Ġa Ġlot Ġof Ġthis Ġcould Ġand Ġshould Ġbe Ġmoved Ġout Ġof Ġhere ĊĠĠĠ Ġval Ġb reed Filters Ġ= Ġremember Ġ{ Ġmutable State Of ( listOf < String >()) Ġ} ĊĠĠĠ Ġval Ġb reed s Ġ= Ġremember Ġ{ ĊĠĠĠĠĠĠĠ Ġp up p ies . map Ġ{ Ġit . bre ed Ġ}. distinct () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdisplay P up p ies Ġ= Ġif Ġ( bre ed Filters . value . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġp up p ies . filter Ġ{ Ġit . bre ed Ġin Ġb reed Filters . value Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġp up p ies ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠBack drop Sca ffold ( ĊĠĠĠĠĠĠĠ Ġscaffold State Ġ= Ġscaffold State , ĊĠĠĠĠĠĠĠ Ġapp Bar Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP up p ies AppBar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilters Open Ġ= Ġscaffold State . is Re ve aled , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Filters Open Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scaffold State . is Re ve aled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġscaffold State . con ce al () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġscaffold State . reveal () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġback Layer Content Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP up py Filters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb reed s Ġ= Ġb reed s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected B reed s Ġ= Ġb reed Filters . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon B reed Selection Changed Ġ= Ġ{ Ġb reed Filters . value Ġ= Ġit Ġ} Ġ// ĠTODO ĠgetValue / setValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġfront Layer Content Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP up py List ( display P up p ies , Ġnavigate To P up py Details ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠP up p ies AppBar ( ĊĠĠĠ Ġfilters Open : ĠBoolean , ĊĠĠĠ Ġtoggle Filters Open : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġicon Ġ= Ġwhen Ġ( filters Open ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠIcons . Filled . Close ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠIcons . Filled . T une ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġdescription Ġ= Ġwhen Ġ( filters Open ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ" close Ġfilters " ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ" open Ġfilters " ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtitle Ġ= Ġwhen Ġ( filters Open ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ" Filters " ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ" A dopt Ġa ĠP up py " ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠTop AppBar ( ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġtitle ) Ġ}, ĊĠĠĠĠĠĠĠ Ġelevation Ġ= Ġ 0 . dp , ĊĠĠĠĠĠĠĠ Ġactions Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġ{ Ġtoggle Filters Open () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Vector Ġ= Ġicon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġdescription ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠP up py Filters ( ĊĠĠĠ Ġb reed s : ĠList < String >, ĊĠĠĠ Ġselected B reed s : ĠList < String >, ĊĠĠĠ Ġon B reed Selection Changed : Ġ( List < String >) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠ ĠBox ( Modifier . padding ( horizontal Ġ= Ġ 1 6 . dp )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText (" B reed : Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSp acer ( Modifier . height ( 4 . dp )) ĊĠĠĠĠĠĠĠ ĠB reed Chip Group ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb reed s Ġ= Ġb reed s , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected B reed s Ġ= Ġselected B reed s , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon B reed Selection Changed Ġ= Ġon B reed Selection Changed , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠSp acer ( Modifier . height ( 1 2 . dp )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠB reed Chip Group ( ĊĠĠĠ Ġb reed s : ĠList < String >, ĊĠĠĠ Ġselected B reed s : ĠList < String >, ĊĠĠĠ Ġon B reed Selection Changed : Ġ( List < String >) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠLazy Row ( ĊĠĠĠĠĠĠĠ Ġcontent Padding Ġ= ĠPadding Values ( horizontal Ġ= Ġ 1 6 . dp , Ġvertical Ġ= Ġ 0 . dp ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitems Indexed ( bre eds ) Ġ{ Ġindex , Ġb reed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCh ip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġb reed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġselected B reed s . contains ( bre ed ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Selected Changed Ġ= Ġ{ Ġselected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon B reed Selection Changed ( selected B reed s Ġ+ Ġb reed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon B reed Selection Changed ( selected B reed s Ġ- Ġb reed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġb reed s . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( Modifier . width ( 8 . dp )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠTODO Ġextract Ċ // ĠTODO Ġanimate Ġcolor Ġchanges Ċ @ Composable Ċ private Ġfun ĠCh ip ( ĊĠĠĠ Ġtext : ĠString , ĊĠĠĠ Ġselected : ĠBoolean , ĊĠĠĠ Ġon Selected Changed : Ġ( Boolean ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠSurface ( ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġif Ġ( selected ) Ġblue 3 0 0 Ġelse Ġblue 1 0 0 , Ġ// ĠT BD ĊĠĠĠĠĠĠĠ Ġshape Ġ= ĠCh ip Shape , ĊĠĠĠĠĠĠĠ Ġborder Ġ= Ġif Ġ( selected ) Ġnull Ġelse ĠBorder Stroke ( 1 . dp , Ġblue 3 0 0 ), ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. clip ( Chip Shape ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. selectable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġselected , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrole Ġ= ĠRole . Checkbox , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġon Selected Changed (! selected ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . body 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( horizontal Ġ= Ġ 1 6 . dp , Ġvertical Ġ= Ġ 8 . dp ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠCh ip Shape Ġ= ĠRo unded Corner Shape ( percent Ġ= Ġ 5 0 ) Ċ Ċ @ Preview Ċ @ Composable Ċ private Ġfun ĠP up p ies Home Preview () Ġ{ ĊĠĠĠ ĠP up py Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠP up p ies Home Screen ( static P up p ies , Ġnavigate To P up py Details Ġ= Ġ{}) ĊĠĠĠ Ġ} Ċ } Ċ