/* Ċ Ġ* Ġ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 Ġandroid . os . Bundle Ċ import Ġandroidx . activity . compose . setContent Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . click able Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . Padding Values Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . lazy . Lazy Column Ċ import Ġandroidx . compose . foundation . lazy . items Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . layout . Content Scale Ċ import Ġandroidx . compose . ui . res . p ainter Resource Ċ import Ġandroidx . compose . ui . text . style . Text Align Ċ import Ġandroidx . compose . ui . text . style . Text Decoration Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Host Controller Ċ import Ġandroidx . navigation . compose . Nav Host Ċ import Ġandroidx . navigation . compose . comp osable Ċ import Ġandroidx . navigation . compose . navigate Ċ import Ġandroidx . navigation . compose . remember Nav Controller Ċ import Ġcom . example . android dev challenge . ui . theme . My Theme Ċ Ċ private Ġval Ġcats Ġ= ĠlistOf ( ĊĠĠĠ ĠCat ( Cat Id (" c 1 "), Ġ" H ector ", Ġ" B eng al ", Ġ 4 , Ġ" Fi est y "), ĊĠĠĠ ĠCat ( Cat Id (" c 2 "), Ġ" Hor atio ", Ġ" B eng al ", Ġ 2 , Ġ" Attention Ġsee king "), ĊĠĠĠ ĠCat ( Cat Id (" c 3 "), Ġ" H erc ules ", Ġ" B eng al ", Ġ 8 , Ġ" Ch illed "), ĊĠĠĠ ĠCat ( Cat Id (" c 4 "), Ġ" T ib bles ", Ġ" Tab by ", Ġ 7 , Ġ" Ch illed "), ĊĠĠĠ ĠCat ( Cat Id (" c 5 "), Ġ" Michael ", Ġ" Pers ian ", Ġ 4 , Ġ" Un co uth "), ĊĠĠĠ ĠCat ( Cat Id (" c 6 "), Ġ" Spot ", Ġ" Tab by ", Ġ 7 , Ġ" Happy Ġgo Ġluck y "), ĊĠĠĠ ĠCat ( Cat Id (" c 7 "), Ġ" F elix ", Ġ" Si ame se ", Ġ 1 , Ġ" H unter "), ĊĠĠĠ ĠCat ( Cat Id (" c 8 "), Ġ" Ros ie ", Ġ" R ag d oll ", Ġ 5 , Ġ" Friendly "), ĊĠĠĠ ĠCat ( Cat Id (" c 9 "), Ġ" Jim ", Ġ" R ag d oll ", Ġ 4 , Ġ" Friendly "), ĊĠĠĠ ĠCat ( Cat Id (" c 1 0 "), Ġ" T ut em ", Ġ" S ph yn x ", Ġ 2 , Ġ" Withdraw n "), ĊĠĠĠ ĠCat ( Cat Id (" c 1 1 "), Ġ" Ka ", Ġ" S ph yn x ", Ġ 2 , Ġ" A lo of "), ĊĠĠĠ ĠCat ( Cat Id (" c 1 2 "), Ġ" Moon ", Ġ" S ph yn x ", Ġ 3 , Ġ" Boss "), Ċ ) Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Theme Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġremember Nav Controller () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNav Host ( nav Controller , Ġstart Destination Ġ= Ġ" overview ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp osable (" overview ") Ġ{ ĠMy App ( nav Controller ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp osable (" details /{ cat Id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA do ption Details ( Cat Id ( it . arguments ?. getString (" cat Id ") !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠStart Ġbuilding Ġyour Ġapp Ġhere ! Ċ @ Composable Ċ fun ĠMy App ( nav Controller : ĠNav Host Controller ) Ġ{ ĊĠĠĠ ĠSurface ( color Ġ= ĠMaterial Theme . colors . background ) Ġ{ ĊĠĠĠĠĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeader (" Kit ty ĠK at do ption ĠCenter ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC ats List ( cats Ġ= Ġcats , Ġnav Controller ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠHeader ( title : ĠString ) Ġ{ ĊĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġtitle , ĊĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠText Align . Center , ĊĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġtext Decoration Ġ= ĠText Decoration . Underline , ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Color . Green ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( Padding Values ( 2 0 . dp )) ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ fun ĠC ats List ( ĊĠĠĠ Ġcats : ĠList < Cat >, ĊĠĠĠ Ġnav Controller : ĠNav Controller , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , Ċ ) Ġ{ ĊĠĠĠ ĠBox ( modifier ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLazy Column ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Padding Ġ= ĠPadding Values ( 2 0 . dp ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġshould Ġbe Ġin ĠViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrouped : ĠMap < String , ĠList < Cat >> Ġ= Ġcats . groupBy Ġ{ Ġit . type Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrouped . forEach Ġ{ Ġ( initial , Ġcats ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter Header ( char Ġ= Ġinitial , ĠModifier . fill Parent Max Width ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems ( cats ) Ġ{ Ġcat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCat ListItem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcat Ġ= Ġcat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate (" details /${ cat . id . raw }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠCat ListItem ( ĊĠĠĠ Ġcat : ĠCat , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ ĠonClick Action : Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. click able Ġ{ ĠonClick Action . invoke () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Alignment Ġ= ĠAlignment . Center Vert ically , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( Padding Values ( 0 . dp , Ġ 1 0 . dp , Ġ 0 . dp , Ġ 1 0 . dp )) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter Resource ( id Ġ= ĠR . drawable . ic _ cat ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġ" Picture Ġof Ġ${ cat . name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 6 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 6 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( Padding Values ( end Ġ= Ġ 1 0 . dp )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Scale Ġ= ĠContent Scale . Fit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColumn ( Modifier . padding ( Padding Values ( end Ġ= Ġ 5 . dp ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġcat . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġcat . att itude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColumn ( Modifier . padding ( Padding Values ( start Ġ= Ġ 5 . dp ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġcat . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Age Ġ${ cat . age }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠCharacter Header ( ĊĠĠĠ Ġchar : ĠString , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , Ċ ) Ġ{ ĊĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġchar [ 0 ]. toString () ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Preview (" Light ĠTheme ", Ġwidth Dp Ġ= Ġ 3 6 0 , Ġheight Dp Ġ= Ġ 6 4 0 ) Ċ @ Composable Ċ fun ĠLight Preview () Ġ{ ĊĠĠĠ ĠMy Theme Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠMy App ( nav Controller ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Preview (" Dark ĠTheme ", Ġwidth Dp Ġ= Ġ 3 6 0 , Ġheight Dp Ġ= Ġ 6 4 0 ) Ċ @ Composable Ċ fun ĠDark Preview () Ġ{ ĊĠĠĠ ĠMy Theme ( dark Theme Ġ= Ġtrue ) Ġ{ Ċ // ĠĠĠĠĠĠĠ ĠMy App ( nav Controller ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠCat ( ĊĠĠĠ Ġval Ġid : ĠCat Id , ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġtype : ĠString , ĊĠĠĠ Ġval Ġage : ĠInt , ĊĠĠĠ Ġval Ġatt itude : ĠString Ċ ) Ċ Ċ data Ġclass ĠCat Id ( val Ġraw : ĠString ) Ċ Ċ @ Composable Ċ fun ĠA do ption Details ( ĊĠĠĠ Ġcat Id : ĠCat Id , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcat Ġ= Ġcats . find Ġ{ Ġit . id Ġ== Ġcat Id Ġ} !! ĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 1 0 . dp ), ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter Resource ( id Ġ= ĠR . drawable . ic _ cat ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 2 2 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( Padding Values ( bottom Ġ= Ġ 1 0 . dp )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Scale Ġ= ĠContent Scale . Crop , ĊĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Name : Ġ${ cat . name }") ĊĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Age : Ġ${ cat . age }") ĊĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Type : Ġ${ cat . type }") ĊĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Att itude : Ġ${ cat . att itude }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Preview (" A do ption ĠDetails ", Ġwidth Dp Ġ= Ġ 3 6 0 , Ġheight Dp Ġ= Ġ 6 4 0 ) Ċ @ Composable Ċ fun ĠA do ption Details Preview () Ġ{ ĊĠĠĠ ĠMy Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠA do ption Details ( cats [ 0 ]. id ) ĊĠĠĠ Ġ} Ċ } Ċ