/* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// 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 Ġandroidx . compose . foundation . layout . benchmark Ċ Ċ import Ġandroidx . compose . foundation . Experimental Foundation Api Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Box With Constraints Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . required Width Ċ import Ġandroidx . compose . foundation . lazy . Grid Cells Ċ import Ġandroidx . compose . foundation . lazy . Lazy Vertical Grid Ċ import Ġandroidx . compose . material . Bottom Navigation Ċ import Ġandroidx . compose . material . Bottom Navigation Item Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . Navigation R ail Ċ import Ġandroidx . compose . material . Navigation R ail Item Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . filled . Home Ċ import Ġandroidx . compose . material . icons . filled . Search Ċ import Ġandroidx . compose . material . icons . filled . Settings Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Composition Local Provider Ċ import Ġandroidx . compose . runtime . composition Local Of Ċ 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 . test utils . Layer ed Compose TestCase Ċ import Ġandroidx . compose . test utils . Toggle able TestCase Ċ import Ġandroidx . compose . test utils . benchmark . Compose Benchmark Rule Ċ import Ġandroidx . compose . test utils . benchmark . benchmark To First Pixel Ċ import Ġandroidx . compose . test utils . benchmark . toggle State Benchmark Compose Measure Layout Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . unit . Dp Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . sp Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ Large Test Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ /** Ċ Ġ* ĠA Ġw ider Ġintegration Ġbenchmark Ġthat Ġcomp ares Ġusing Ġ[ Box With Constraints ] Ġto Ġchange Ġan Ġapp 's Ċ Ġ* Ġlayout Ġdepending Ġon Ġavailable Ġspace , Ġcompared Ġto Ġjust Ġusing Ġa Ġtheoret ical ĠComp osition Local Ċ Ġ* Ġthat Ġcontains Ġscreen Ġwidth . ĠThis Ġallows Ġmeas uring Ġthe Ġperformance Ġimpact Ġof Ġsub composition Ġon Ċ Ġ* Ġfirst Ġcomposition Ġand Ġre composition Ġof Ġa Ġrelatively Ġcomplex Ġscreen . Ċ Ġ*/ Ċ class ĠBox With Constraints Integration Benchmark Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġbenchmark Rule Ġ= ĠCompose Benchmark Rule () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbox with constraints _ app _ benchmark To First Pixel () Ġ{ ĊĠĠĠĠĠĠĠ Ġbenchmark Rule . benchmark To First Pixel Ġ{ ĠBox With Constraints App TestCase () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbox with constraints _ app _ toggle State Benchmark Compose Measure Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġbenchmark Rule . toggle State Benchmark Compose Measure Layout ({ ĠBox With Constraints App TestCase () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcomposition local _ app _ benchmark To First Pixel () Ġ{ ĊĠĠĠĠĠĠĠ Ġbenchmark Rule . benchmark To First Pixel Ġ{ ĠComp osition Local App TestCase () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcomposition local _ app _ toggle State Benchmark Compose Measure Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġbenchmark Rule . toggle State Benchmark Compose Measure Layout ({ ĠComp osition Local App TestCase () Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTest Ġcase Ġsim ulating Ġan Ġapp Ġthat Ġuses Ġ[ Box With Constraints ] Ġto Ġmake Ġcomplex Ġlayout Ġchanges . Ċ Ġ*/ Ċ private Ġclass ĠBox With Constraints App TestCase Ġ: ĠLayer ed Compose TestCase (), ĠToggle able TestCase Ġ{ ĊĠĠĠ Ġprivate Ġval Ġphone Width Ġ= Ġ 3 6 0 . dp ĊĠĠĠ Ġprivate Ġval Ġtablet Width Ġ= Ġ 9 0 0 . dp ĊĊĠĠĠ Ġprivate Ġval Ġscreen Width Ġ= Ġmutable State Of ( phone Width ) ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġoverride Ġfun ĠMe as ured Content () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġscreen Width . value ĊĠĠĠĠĠĠĠ ĠBox ( Modifier . required Width ( width )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġprivate Ġfun ĠApp () Ġ{ ĊĠĠĠĠĠĠĠ ĠBox With Constraints Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠmaxWidth ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp ( width ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtoggle State () Ġ{ ĊĠĠĠĠĠĠĠ Ġscreen Width . value Ġ= Ġif Ġ( screen Width . value Ġ== Ġphone Width ) Ġtablet Width Ġelse Ġphone Width ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTest Ġcase Ġsim ulating Ġan Ġapp Ġthat Ġuses Ġa Ġtheoret ical Ġscreen Ġwidth ĠComp osition Local Ġto Ġmake Ċ Ġ* Ġcomplex Ġlayout Ġchanges . Ċ Ġ*/ Ċ private Ġclass ĠComp osition Local App TestCase Ġ: ĠLayer ed Compose TestCase (), ĠToggle able TestCase Ġ{ ĊĠĠĠ Ġprivate Ġval Ġphone Width Ġ= Ġ 3 6 0 . dp ĊĠĠĠ Ġprivate Ġval Ġtablet Width Ġ= Ġ 9 0 0 . dp ĊĊĠĠĠ Ġprivate Ġval Ġscreen Width Ġ= Ġmutable State Of ( phone Width ) ĊĊĠĠĠ Ġprivate Ġval ĠLocal Screen Width Ġ= Ġcomposition Local Of Ġ{ Ġphone Width Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġoverride Ġfun ĠMe as ured Content () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġscreen Width . value ĊĠĠĠĠĠĠĠ ĠComp osition Local Provider ( Local Screen Width Ġprovides Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( Modifier . required Width ( width )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġprivate Ġfun ĠApp () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠLocal Screen Width . current ĊĠĠĠĠĠĠĠ ĠApp ( width ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtoggle State () Ġ{ ĊĠĠĠĠĠĠĠ Ġscreen Width . value Ġ= Ġif Ġ( screen Width . value Ġ== Ġphone Width ) Ġtablet Width Ġelse Ġphone Width ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠApp ( width : ĠD p ) Ġ{ ĊĠĠĠ Ġval Ġgrid Columns Ġ= Ġwidth . value . toInt () Ġ/ Ġ 1 5 0 ĊĠĠĠ Ġif Ġ( width Ġ> Ġ 8 0 0 . dp ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTable t Screen ( grid Columns ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠPhone Screen ( grid Columns ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠPhone Screen ( grid Columns : ĠInt ) Ġ{ ĊĠĠĠ ĠColumn Ġ{ ĊĠĠĠĠĠĠĠ ĠGrid ( grid Columns , ĠModifier . weight ( 1 f )) ĊĠĠĠĠĠĠĠ Ġvar Ġselected Item Ġby Ġremember Ġ{ Ġmutable State Of ( 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠlistOf (" Home ", Ġ" Search ", Ġ" Settings ") ĊĠĠĠĠĠĠĠ Ġval Ġicons Ġ= ĠlistOf ( Icons . Filled . Home , ĠIcons . Filled . Search , ĠIcons . Filled . Settings ) ĊĠĠĠĠĠĠĠ ĠBottom Navigation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Indexed Ġ{ Ġindex , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Navigation Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġ{ ĠIcon ( icons [ index ], Ġcontent Description Ġ= Ġitem ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ{ ĠText ( item ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġselected Item Ġ== Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġselected Item Ġ= Ġindex Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠTable t Screen ( grid Columns : ĠInt ) Ġ{ ĊĠĠĠ ĠRow Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġselected Item Ġby Ġremember Ġ{ Ġmutable State Of ( 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠlistOf (" Home ", Ġ" Search ", Ġ" Settings ") ĊĠĠĠĠĠĠĠ Ġval Ġicons Ġ= ĠlistOf ( Icons . Filled . Home , ĠIcons . Filled . Search , ĠIcons . Filled . Settings ) ĊĠĠĠĠĠĠĠ ĠNavigation R ail Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Indexed Ġ{ Ġindex , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation R ail Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġ{ ĠIcon ( icons [ index ], Ġcontent Description Ġ= Ġitem ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ{ ĠText ( item ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġselected Item Ġ== Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġselected Item Ġ= Ġindex Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGrid ( grid Columns ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Opt In ( Experimental Foundation Api :: class ) Ċ @ Composable Ċ private Ġfun ĠGrid ( grid Columns : ĠInt , Ġmodifier : ĠModifier Ġ= ĠModifier ) Ġ{ ĊĠĠĠ ĠLazy Vertical Grid ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġcells Ġ= ĠGrid Cells . Fixed ( grid Columns ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitems ( 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ"$ it ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontSize Ġ= Ġ 2 0 . sp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Color . Gray . copy ( alpha Ġ= Ġ( it Ġ% Ġ 1 0 ) Ġ/ Ġ 1 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 8 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ