/* Ċ Ġ* Ġ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 . jet news . ui . home Ċ Ċ import Ġandroidx . activity . compose . Back Handler Ċ import Ġandroidx . compose . foundation . lazy . remember Lazy List State Ċ import Ġandroidx . compose . material . Experimental Material Api Ċ import Ġandroidx . compose . material . Sca ffold Ċ import Ġandroidx . compose . material . Sca ffold State Ċ import Ġandroidx . compose . material . remember Sca ffold State Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . collect As State Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . key Ċ import Ġcom . example . jet news . ui . article . Article Screen Ċ Ċ /** Ċ Ġ* ĠDisplays Ġthe ĠHome Ġroute . Ċ Ġ* Ċ Ġ* ĠNote : ĠA AC ĠView Models Ġdon 't Ġwork Ġwith ĠCompose ĠPre views Ġcurrently . Ċ Ġ* Ċ Ġ* Ġ@ param Ġhome ViewModel ĠViewModel Ġthat Ġhandles Ġthe Ġbusiness Ġlogic Ġof Ġthis Ġscreen Ċ Ġ* Ġ@ param Ġis Expanded Screen Ġ( state ) Ġwhether Ġthe Ġscreen Ġis Ġexpanded Ċ Ġ* Ġ@ param Ġopen Drawer Ġ( event ) Ġrequest Ġopening Ġthe Ġapp Ġdrawer Ċ Ġ* Ġ@ param Ġscaffold State Ġ( state ) Ġstate Ġfor Ġthe Ġ[ Sca ffold ] Ġcomponent Ġon Ġthis Ġscreen Ċ Ġ*/ Ċ @ Composable Ċ fun ĠHome Route ( ĊĠĠĠ Ġhome ViewModel : ĠHome ViewModel , ĊĠĠĠ Ġis Expanded Screen : ĠBoolean , ĊĠĠĠ Ġopen Drawer : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġscaffold State : ĠScaffold State Ġ= Ġremember Sca ffold State () Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠUi State Ġof Ġthe ĠHome Screen ĊĠĠĠ Ġval Ġui State Ġby Ġhome ViewModel . ui State . collect As State () ĊĊĠĠĠ ĠHome Route ( ĊĠĠĠĠĠĠĠ Ġui State Ġ= Ġui State , ĊĠĠĠĠĠĠĠ Ġis Expanded Screen Ġ= Ġis Expanded Screen , ĊĠĠĠĠĠĠĠ Ġon Toggle Favorite Ġ= Ġ{ Ġhome ViewModel . toggle F avour ite ( it ) Ġ}, ĊĠĠĠĠĠĠĠ ĠonSelect Post Ġ= Ġ{ Ġhome ViewModel . select Article ( it ) Ġ}, ĊĠĠĠĠĠĠĠ Ġon Refresh Posts Ġ= Ġ{ Ġhome ViewModel . refresh Posts () Ġ}, ĊĠĠĠĠĠĠĠ ĠonError Dismiss Ġ= Ġ{ Ġhome ViewModel . error Shown ( it ) Ġ}, ĊĠĠĠĠĠĠĠ Ġon Interact With Feed Ġ= Ġ{ Ġhome ViewModel . inter acted With Feed () Ġ}, ĊĠĠĠĠĠĠĠ Ġon Interact With Article Details Ġ= Ġ{ Ġhome ViewModel . inter acted With Article Details ( it ) Ġ}, ĊĠĠĠĠĠĠĠ Ġopen Drawer Ġ= Ġopen Drawer , ĊĠĠĠĠĠĠĠ Ġscaffold State Ġ= Ġscaffold State , ĊĠĠĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠDisplays Ġthe ĠHome Ġroute . Ċ Ġ* Ċ Ġ* ĠThis Ġcomp osable Ġis Ġnot Ġcoup led Ġto Ġany Ġspecific Ġstate Ġmanagement . Ċ Ġ* Ċ Ġ* Ġ@ param Ġui State Ġ( state ) Ġthe Ġdata Ġto Ġshow Ġon Ġthe Ġscreen Ċ Ġ* Ġ@ param Ġis Expanded Screen Ġ( state ) Ġwhether Ġthe Ġscreen Ġis Ġexpanded Ċ Ġ* Ġ@ param Ġon Toggle Favorite Ġ( event ) Ġtoggle s Ġfavorite Ġfor Ġa Ġpost Ċ Ġ* Ġ@ param ĠonSelect Post Ġ( event ) Ġindicate Ġthat Ġa Ġpost Ġwas Ġselected Ċ Ġ* Ġ@ param Ġon Refresh Posts Ġ( event ) Ġrequest Ġa Ġrefresh Ġof Ġposts Ċ Ġ* Ġ@ param ĠonError Dismiss Ġ( event ) Ġerror Ġmessage Ġwas Ġshown Ċ Ġ* Ġ@ param Ġon Interact With Feed Ġ( event ) Ġindicate Ġthat Ġthe Ġfeed Ġwas Ġinteract ed Ġwith Ċ Ġ* Ġ@ param Ġon Interact With Article Details Ġ( event ) Ġindicate Ġthat Ġthe Ġarticle Ġdetails Ġwere Ġinteract ed Ċ Ġ* Ġwith Ċ Ġ* Ġ@ param Ġopen Drawer Ġ( event ) Ġrequest Ġopening Ġthe Ġapp Ġdrawer Ċ Ġ* Ġ@ param Ġscaffold State Ġ( state ) Ġstate Ġfor Ġthe Ġ[ Sca ffold ] Ġcomponent Ġon Ġthis Ġscreen Ċ Ġ*/ Ċ @ Opt In ( Experimental Material Api :: class ) Ċ @ Composable Ċ fun ĠHome Route ( ĊĠĠĠ Ġui State : ĠHome Ui State , ĊĠĠĠ Ġis Expanded Screen : ĠBoolean , ĊĠĠĠ Ġon Toggle Favorite : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ ĠonSelect Post : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ Ġon Refresh Posts : Ġ() Ġ-> ĠUnit , ĊĠĠĠ ĠonError Dismiss : Ġ( Long ) Ġ-> ĠUnit , ĊĠĠĠ Ġon Interact With Feed : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġon Interact With Article Details : Ġ( String ) Ġ-> ĠUnit , ĊĠĠĠ Ġopen Drawer : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġscaffold State : ĠScaffold State Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠConstruct Ġthe Ġlazy Ġlist Ġstates Ġfor Ġthe Ġlist Ġand Ġthe Ġdetails Ġoutside Ġof Ġdec iding Ġwhich Ġone Ġto ĊĠĠĠ Ġ// Ġshow . ĠThis Ġallows Ġthe Ġassociated Ġstate Ġto Ġsurv ive Ġbeyond Ġthat Ġdecision , Ġand Ġtherefore ĊĠĠĠ Ġ// Ġwe Ġget Ġto Ġpreserve Ġthe Ġscroll Ġthroughout Ġany Ġchanges Ġto Ġthe Ġcontent . ĊĠĠĠ Ġval Ġhome List Lazy List State Ġ= Ġremember Lazy List State () ĊĠĠĠ Ġval Ġarticle Detail Lazy List States Ġ= Ġwhen Ġ( ui State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠHome Ui State . Has Posts Ġ-> Ġui State . posts Feed . all Posts ĊĠĠĠĠĠĠĠ Ġis ĠHome Ui State . No Posts Ġ-> Ġempty List () ĊĠĠĠ Ġ}. associate Ġ{ Ġpost Ġ-> ĊĠĠĠĠĠĠĠ Ġkey ( post . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost . id Ġto Ġremember Lazy List State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhome Screen Type Ġ= Ġget Home Screen Type ( is Expanded Screen , Ġui State ) ĊĠĠĠ Ġwhen Ġ( home Screen Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠHome Screen Type . Feed With Article Details Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHome Feed With Article Details Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġui State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Top AppBar Ġ= Ġ! is Expanded Screen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Toggle Favorite Ġ= Ġon Toggle Favorite , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSelect Post Ġ= ĠonSelect Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Refresh Posts Ġ= Ġon Refresh Posts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Dismiss Ġ= ĠonError Dismiss , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Interact With List Ġ= Ġon Interact With Feed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Interact With Detail Ġ= Ġon Interact With Article Details , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Drawer Ġ= Ġopen Drawer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome List Lazy List State Ġ= Ġhome List Lazy List State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle Detail Lazy List States Ġ= Ġarticle Detail Lazy List States , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscaffold State Ġ= Ġscaffold State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠHome Screen Type . Feed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHome Feed Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġui State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Top AppBar Ġ= Ġ! is Expanded Screen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Toggle Favorite Ġ= Ġon Toggle Favorite , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSelect Post Ġ= ĠonSelect Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Refresh Posts Ġ= Ġon Refresh Posts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Dismiss Ġ= ĠonError Dismiss , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Drawer Ġ= Ġopen Drawer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome List Lazy List State Ġ= Ġhome List Lazy List State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscaffold State Ġ= Ġscaffold State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠHome Screen Type . Article Details Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGu arante ed Ġby Ġabove Ġcondition Ġfor Ġhome Ġscreen Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( ui State Ġis ĠHome Ui State . Has Posts ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠArticle Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ= Ġui State . selected Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Expanded Screen Ġ= Ġis Expanded Screen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Ġ= Ġon Interact With Feed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Favorite Ġ= Ġui State . favorites . contains ( ui State . selected Post . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Toggle Favorite Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Toggle Favorite ( ui State . selected Post . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlazy List State Ġ= Ġarticle Detail Lazy List States . getValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . selected Post . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġjust Ġshowing Ġthe Ġdetail , Ġhave Ġa Ġback Ġpress Ġswitch Ġto Ġthe Ġlist . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġdoesn 't Ġtake Ġanything Ġmore Ġthan Ġnotify ing Ġthat Ġwe Ġ" inter acted Ġwith Ġthe Ġlist " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsince Ġthat Ġis Ġwhat Ġdrives Ġthe Ġdisplay Ġof Ġthe Ġfeed ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBack Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Interact With Feed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġprecise Ġenumeration Ġof Ġwhich Ġtype Ġof Ġscreen Ġto Ġdisplay Ġat Ġthe Ġhome Ġroute . Ċ Ġ* Ċ Ġ* ĠThere Ġare Ġ 3 Ġoptions : Ċ Ġ* Ġ- Ġ[ Feed With Article Details ], Ġwhich Ġdisplays Ġboth Ġa Ġlist Ġof Ġall Ġarticles Ġand Ġa Ġspecific Ġarticle . Ċ Ġ* Ġ- Ġ[ Feed ], Ġwhich Ġdisplays Ġjust Ġthe Ġlist Ġof Ġall Ġarticles Ċ Ġ* Ġ- Ġ[ Article Details ], Ġwhich Ġdisplays Ġjust Ġa Ġspecific Ġarticle . Ċ Ġ*/ Ċ private Ġenum Ġclass ĠHome Screen Type Ġ{ ĊĠĠĠ ĠFeed With Article Details , ĊĠĠĠ ĠFeed , ĊĠĠĠ ĠArticle Details Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġcurrent Ġ[ Home Screen Type ] Ġto Ġdisplay , Ġbased Ġon Ġwhether Ġor Ġnot Ġthe Ġscreen Ġis Ġexpanded Ċ Ġ* Ġand Ġthe Ġ[ Home Ui State ]. Ċ Ġ*/ Ċ @ Composable Ċ private Ġfun Ġget Home Screen Type ( ĊĠĠĠ Ġis Expanded Screen : ĠBoolean , ĊĠĠĠ Ġui State : ĠHome Ui State Ċ ): ĠHome Screen Type Ġ= Ġwhen Ġ( is Expanded Screen ) Ġ{ ĊĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ui State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHome Ui State . Has Posts Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ui State . is Article Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHome Screen Type . Article Details ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHome Screen Type . Feed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHome Ui State . No Posts Ġ-> ĠHome Screen Type . Feed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġtrue Ġ-> ĠHome Screen Type . Feed With Article Details Ċ } Ċ