/* Ċ Ġ* Ġ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 . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . example . android dev challenge . utils . get Mutable State Of Ċ Ċ enum Ġclass ĠScreen Name Ġ{ ĠHOME , ĠDET AIL Ġ} Ċ Ċ private Ġconst Ġval ĠS IS _ P UP PY _ ID Ġ= Ġ" pup py _ id " Ċ private Ġconst Ġval ĠS IS _ NAME Ġ= Ġ" screen _ name " Ċ Ċ sealed Ġclass ĠScreen ( val Ġid : ĠScreen Name ) Ġ{ ĊĠĠĠ Ġobject ĠHome Ġ: ĠScreen ( Screen Name . HOME ) ĊĠĠĠ Ġdata Ġclass ĠDetail ( val Ġp up py Id : ĠString ) Ġ: ĠScreen ( Screen Name . DETAIL ) Ċ } Ċ Ċ private Ġfun ĠScreen . to Bundle (): ĠBundle Ġ{ ĊĠĠĠ Ġreturn Ġbundle Of ( SIS _ NAME Ġto Ġid . name ). also Ġ{ Ġb Ġ-> ĊĠĠĠĠĠĠĠ Ġ( this Ġas ? ĠScreen . Detail )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . putString ( SIS _ P UP PY _ ID , Ġp up py Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠBundle . to Screen (): ĠScreen Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( getString ( SIS _ NAME )?. let Ġ{ ĠScreen Name . valueOf ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ ĠScreen Name . HOME Ġ-> ĠScreen . Home ĊĠĠĠĠĠĠĠ ĠScreen Name . DETAIL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp up py Id Ġ= ĠgetString ( SIS _ P UP PY _ ID ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScreen . Detail ( pup py Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScreen . Home ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠNavigation ViewModel ( saved State Handle : ĠSaved State Handle ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHold Ġthe Ġcurrent Ġscreen Ġin Ġan Ġobservable , Ġrestored Ġfrom Ġsaved State Handle Ġafter Ġprocess ĊĠĠĠĠ Ġ* Ġdeath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġmutable State Of Ġis Ġan Ġobservable Ġsimilar Ġto ĠLive Data Ġthat 's Ġdesigned Ġto Ġbe Ġread Ġby Ġcompose . ĠIt ĊĠĠĠĠ Ġ* Ġsupports Ġobserv ability Ġvia Ġproperty Ġdelegate Ġsyntax Ġas Ġshown Ġhere . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcurrent Screen : ĠScreen Ġby Ġsaved State Handle . get Mutable State Of < Screen >( ĊĠĠĠĠĠĠĠ Ġkey Ġ= ĠS IS _ P UP PY _ ID , ĊĠĠĠĠĠĠĠ Ġdefault Ġ= ĠScreen . Home , ĊĠĠĠĠĠĠĠ Ġsave Ġ= Ġ{ Ġit . to Bundle () Ġ}, ĊĠĠĠĠĠĠĠ Ġrestore Ġ= Ġ{ Ġit . to Screen () Ġ} ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset Ġ// Ġlimit Ġthe Ġwrites Ġto Ġonly Ġinside Ġthis Ġclass . ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGo Ġback Ġ( always Ġto Ġ[ Home ]). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthis Ġcall Ġcaused Ġuser - visible Ġnavigation . ĠWill Ġalways Ġreturn Ġfalse ĊĠĠĠĠ Ġ* Ġwhen Ġ[ current Screen ] Ġis Ġ[ Home ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġon Back (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwas Handled Ġ= Ġcurrent Screen Ġ!= ĠScreen . Home ĊĠĠĠĠĠĠĠ Ġcurrent Screen Ġ= ĠScreen . Home ĊĠĠĠĠĠĠĠ Ġreturn Ġwas Handled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNavigate Ġto Ġrequested Ġ[ Screen ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġrequested Ġscreen Ġis Ġnot Ġ[ Home ], Ġit Ġwill Ġalways Ġcreate Ġa Ġback Ġstack Ġwith Ġone Ġelement : ĊĠĠĠĠ Ġ* Ġ([ Home ] Ġ-> Ġ[ screen ]). ĠMore Ġback Ġentries Ġare Ġnot Ġsupported Ġin Ġthis Ġapp . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġnavigate To ( screen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Screen Ġ= Ġscreen ĊĠĠĠ Ġ} Ċ } Ċ