/* Ċ Ġ* Ġ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 . w es ley elli ott . weather Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . activity . add Callback Ċ import Ġandroidx . activity . compose . Local On Back Pressed Dispatcher Owner Ċ import Ġandroidx . activity . compose . setContent Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . compose . animation . Animated Visibility Ċ import Ġandroidx . compose . animation . Experimental Animation Api Ċ import Ġandroidx . compose . animation . slide In H orizontally Ċ import Ġandroidx . compose . animation . slide Out H orizontally Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Composition Local Provider Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . save able . Saver Ċ import Ġandroidx . compose . runtime . save able . remember Save able Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . core . view . Window Compat Ċ import Ġcom . google . ac comp an ist . in sets . Provide Window Insets Ċ import Ġcom . w es ley elli ott . weather . data . Weather Choice Ċ import Ġcom . w es ley elli ott . weather . nav . Nav Ċ import Ġcom . w es ley elli ott . weather . ui . choose . Choose Screen Ċ import Ġcom . w es ley elli ott . weather . ui . common . remember Accordion State Ċ import Ġcom . w es ley elli ott . weather . ui . theme . My Theme Ċ import Ġcom . w es ley elli ott . weather . ui . weather . Weather Screen Ċ import Ġcom . w es ley elli ott . weather . utils . Local Unit Provider Ċ import Ġcom . w es ley elli ott . weather . utils . Measurement Unit Ċ import Ġcom . w es ley elli ott . weather . utils . getLocale Units Ċ import Ġjava . util . Locale Ċ Ċ /** Ċ Ġ* ĠAllow Ġthe Ġ[ Weather App ] Ġto Ġdispatch Ġthe Ġsystem Ġ[ on Back Pressed ] Ġto Ġthe ĠActivity Ċ Ġ*/ Ċ interface ĠBack Dispatcher Ġ{ ĊĠĠĠ Ġfun Ġon Back Pressed () Ċ } Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠBack Dispatcher Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠWindow Compat . set Decor Fits System Windows ( window , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Unit System Ġ= Ġremember Save able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsa ver Ġ= ĠS aver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Serializable (" unit ", Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunit Ġ= Ġit . get Serializable (" unit ") Ġas ? ĠMeasurement Unit Ġ?: ĠLocale . getDefault (). getLocale Units () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable State Of ( unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable State Of ( Locale . getDefault (). getLocale Units ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProvide Window Insets Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Unit Provider Ġprovides Ġdefault Unit System ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Theme () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather App ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Animation Api :: class ) Ċ @ Composable Ċ fun ĠWeather App ( ĊĠĠĠ Ġback Dispatcher : ĠBack Dispatcher Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKeep Ġtrack Ġof Ġthe Ġnavigation Ġdestination Ġstate ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUsing Ġthis Ġinstead Ġof Ġthe ĠNav ĠComponent Ġas ĠI Ġwant Ġsome Ġtransition Ġsupport Ġwhen Ġnavig ating ĊĠĠĠĠ Ġ* Ġbetween Ġdest inations . ĊĠĠĠĠ Ġ* ĠSave able Ġas Ġwe Ġneed Ġto Ġsave Ġand Ġrestore Ġthe Ġstate Ġacross Ġconfig Ġchanges ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnav State Ġ= Ġremember Save able ( sa ver Ġ= ĠNav . Saver ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable State Of ( Nav . Choose ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġacc ordion Layout State Ġ= Ġremember Accordion State () ĊĊĠĠĠ Ġval Ġselected Weather Ġ= Ġremember Save able Ġ{ ĊĠĠĠĠĠĠĠ Ġmutable State Of < Weather Choice ? >( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCons ume Ġthe Ġback Ġbutton Ġto Ġallow Ġgoing Ġback Ġfrom Ġthe Ġ[ Weather Screen ] Ġto Ġthe Ġ[ Choose Screen ]. ĊĠĠĠĠ Ġ* ĠIf Ġwe 're Ġon Ġthe Ġ[ Choose Screen ], Ġgo Ġback Ġin Ġthe Ġacc ordion Ġuntil Ġthe Ġfirst Ġitem Ġis Ġexpanded . ĊĠĠĠĠ Ġ* ĠFinally , Ġdispatch Ġa Ġsystem Ġback Ġevent Ġif Ġthe Ġfirst Ġitem Ġis Ġexpanded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠLocal On Back Pressed Dispatcher Owner . current . on Back Pressed Dispatcher . add Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Nav Ġ= Ġnav State . value ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Nav Ġis ĠNav . Weather Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġwe 're Ġon Ġthe Ġweather Ġscreen , Ġgo Ġback Ġto Ġthe Ġchoice Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav State . value Ġ= ĠNav . Choose ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġacc ordion Layout State . currentItem . value Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġwe 're Ġon Ġthe Ġchoice Ġscreen , Ġand Ġthe Ġacc ordion Ġis Ġnot Ġin Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinitial Ġstate , Ġgo Ġback Ġin Ġthe Ġacc ordion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc ordion Layout State . go Back () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise , Ġuse Ġsystem Ġback ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback Dispatcher . on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSurface ( ĊĠĠĠĠĠĠĠ Ġcolor Ġ= ĠMaterial Theme . colors . background ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAnimated Visibility ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġnav State . value Ġ== ĠNav . Choose , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenter Ġ= Ġslide In H orizontally ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Offset X Ġ= Ġ{ Ġ- it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Ġ= Ġslide Out H orizontally ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Offset X Ġ= Ġ{ Ġ- it Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChoose Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc ordion Layout State Ġ= Ġacc ordion Layout State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav State . value Ġ= ĠNav . Weather ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Weather . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAnimated Visibility ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġnav State . value Ġis ĠNav . Weather , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenter Ġ= Ġslide In H orizontally ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Offset X Ġ= Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Ġ= Ġslide Out H orizontally ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Offset X Ġ= Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġselected Weather . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWeather Screen ( weather Choice Ġ= Ġcurrent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġmock Back Dispatcher Ġ= Ġobject Ġ: ĠBack Dispatcher Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠ Ġ} Ċ } Ċ @ Preview (" Light ĠTheme ", Ġwidth Dp Ġ= Ġ 3 6 0 , Ġheight Dp Ġ= Ġ 6 4 0 ) Ċ @ Composable Ċ fun ĠLight Preview () Ġ{ ĊĠĠĠ ĠMy Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠWeather App ( mock Back Dispatcher ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Preview (" Dark ĠTheme ", Ġwidth Dp Ġ= Ġ 3 6 0 , Ġheight Dp Ġ= Ġ 6 4 0 ) Ċ @ Composable Ċ fun ĠDark Preview () Ġ{ ĊĠĠĠ ĠMy Theme ( dark Theme Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ ĠWeather App ( mock Back Dispatcher ) ĊĠĠĠ Ġ} Ċ } Ċ