/* Ċ Ġ* Ġ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 . found ations Ċ Ċ import Ġandroidx . compose . animation . animate Color As State Ċ import Ġandroidx . compose . animation . core . Spring Ċ import Ġandroidx . compose . animation . core . animate Dp Ċ import Ġandroidx . compose . animation . core . spring Ċ import Ġandroidx . compose . animation . core . update Transition Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . border Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . offset Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . layout . wrap Content Size Ċ import Ġandroidx . compose . foundation . selection . selectable Ċ import Ġandroidx . compose . foundation . selection . selectable Group Ċ import Ġandroidx . compose . foundation . shape . Rounded Corner Shape Ċ import Ġandroidx . compose . material . Material Theme . colors Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . content Color For Ċ import Ġandroidx . compose . material . primary Surface Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . clip Ċ import Ġandroidx . compose . ui . layout . Sub compose Layout Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . Constraints Ċ import Ġandroidx . compose . ui . unit . Dp Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġcom . example . android dev challenge . ui . theme . Weather App Theme Ċ import Ġcom . example . android dev challenge . ui . theme . typography Ċ Ċ private Ġenum Ġclass ĠTab Slots Ġ{ ĊĠĠĠ ĠTabs , ĊĠĠĠ ĠIndicator Ċ } Ċ Ċ data Ġclass ĠTab Position ( ĊĠĠĠ Ġval Ġleft : ĠD p , ĊĠĠĠ Ġval Ġwidth : ĠD p Ċ ) Ġ{ ĊĠĠĠ Ġval Ġright Ġ= Ġleft Ġ+ Ġwidth Ċ } Ċ Ċ @ Composable Ċ fun ĠTab Row ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġindicator : Ġ@ Composable Ġ( tab Positions : ĠList < Tab Position >) Ġ-> ĠUnit , ĊĠĠĠ Ġtabs : Ġ@ Composable Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠSub compose Layout ( modifier . selectable Group ()) Ġ{ Ġconstraints Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġtab Row Width Ġ= Ġconstraints . maxWidth ĊĠĠĠĠĠĠĠ Ġval Ġtab Meas ur ables Ġ= Ġsub compose ( Tab Slots . Tabs , Ġtabs ) ĊĠĠĠĠĠĠĠ Ġval Ġtab Count Ġ= Ġtab Meas ur ables . size ĊĠĠĠĠĠĠĠ Ġval Ġtab Width Ġ= Ġ( tab Row Width Ġ/ Ġtab Count ) ĊĠĠĠĠĠĠĠ Ġval Ġtab Place ables Ġ= Ġtab Meas ur ables . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . measure ( constraints . copy ( min Width Ġ= Ġtab Width , ĠmaxWidth Ġ= Ġtab Width )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtab Row Height Ġ= Ġtab Place ables . max By OrNull Ġ{ Ġit . height Ġ} ?. height Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġtab Positions Ġ= ĠList ( tab Count ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab Position ( tab Width . to Dp () Ġ* Ġindex , Ġtab Width . to Dp ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlayout ( tab Row Width , Ġtab Row Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub compose ( Tab Slots . Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator ( tab Positions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . measure ( Constraints . fixed ( tab Row Width , Ġtab Row Height )). place Relative ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Place ables . forEach Indexed Ġ{ Ġindex , Ġplace able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace able . place Relative ( index Ġ* Ġtab Width , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠTab ( ĊĠĠĠ Ġtext : ĠString , ĊĠĠĠ ĠonClick : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġis Tab Selected : ĠBoolean Ġ= Ġfalse , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcolor Ġby Ġanimate Color As State ( ĊĠĠĠĠĠĠĠ Ġcontent Color For ( if Ġ( is Tab Selected ) Ġcolors . primary Surface Ġelse Ġcolors . background ) ĊĠĠĠ Ġ) ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . selectable ( is Tab Selected , ĠonClick Ġ= ĠonClick ), ĊĠĠĠĠĠĠĠ Ġcontent Alignment Ġ= ĠAlignment . Center ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġtext , Ġcolor Ġ= Ġcolor , Ġstyle Ġ= Ġty pography . body 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun Ġ< T Ġ: ĠEnum <* >> ĠTab Indicator ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġtab Positions : ĠList < Tab Position >, ĊĠĠĠ Ġtab : ĠT Ċ ) Ġ{ ĊĠĠĠ Ġval Ġtransition Ġ= Ġupdate Transition ( ĊĠĠĠĠĠĠĠ Ġtab , ĊĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" Tab Ġindicator " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġindicator Left Ġby Ġtransition . animate Dp ( ĊĠĠĠĠĠĠĠ Ġtransition Spec Ġ= Ġ{ Ġspring ( st iff ness Ġ= ĠSpring . St iff ness Medium ) Ġ}, ĊĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" Indicator Ġleft " ĊĠĠĠ Ġ) Ġ{ Ġpage Ġ-> Ġtab Positions [ page . ordinal ]. left Ġ} ĊĊĠĠĠ Ġval Ġindicator Right Ġby Ġtransition . animate Dp ( ĊĠĠĠĠĠĠĠ Ġtransition Spec Ġ= Ġ{ Ġspring ( st iff ness Ġ= ĠSpring . St iff ness Medium ) Ġ}, ĊĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" Indicator Ġright " ĊĠĠĠ Ġ) Ġ{ Ġpage Ġ-> Ġtab Positions [ page . ordinal ]. right Ġ} ĊĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap Content Size ( align Ġ= ĠAlignment . Center Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset ( x Ġ= Ġindicator Left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( indicator Right Ġ- Ġindicator Left ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( colors . primary ) ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ @ Preview Ċ fun ĠTab Row With Filled Selector Preview 2 () Ġ{ ĊĊĠĠĠ Ġvar Ġselected Tab Ġby Ġremember Ġ{ Ġmutable State Of ( Tab . Tab A ) Ġ} ĊĊĠĠĠ ĠWeather App Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠSurface ( color Ġ= Ġcolors . background ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab Row ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 4 8 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 3 5 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. border ( 1 . dp , Ġcolors . on Background ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Ġ= Ġ{ Ġtab Positions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTab Indicator ( Modifier . clip ( Rounded Corner Shape ( 2 5 f )), Ġtab Positions , Ġselected Tab ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtabs Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTab ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= ĠTab . Tab A . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġselected Tab Ġ= ĠTab . Tab A Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Tab Selected Ġ= Ġselected Tab Ġ== ĠTab . Tab A ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTab ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= ĠTab . Tab B . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġselected Tab Ġ= ĠTab . Tab B Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Tab Selected Ġ= Ġselected Tab Ġ== ĠTab . Tab B ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġenum Ġclass ĠTab Ġ{ ĊĠĠĠ ĠTab A , ĠTab B Ċ } Ċ