/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠChris ĠB an es Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . chr is ban es . snap per . sample Ċ Ċ import Ġandroidx . compose . foundation . border Ċ import Ġandroidx . compose . foundation . layout . Arrange ment Ċ import Ġandroidx . compose . foundation . layout . Padding Values Ċ import Ġandroidx . compose . foundation . layout . aspect Ratio Ċ import Ġandroidx . compose . foundation . layout . calculate End Padding Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . lazy . Lazy Row Ċ import Ġandroidx . compose . foundation . lazy . remember Lazy List State Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . unit . Layout Direction Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġdev . chr is ban es . snap per . Experimental Snap per Api Ċ import Ġdev . chr is ban es . snap per . Snap Offsets Ċ import Ġdev . chr is ban es . snap per . remember Snap per Fl ing Behavior Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ internal Ġval ĠLazy Row Samples Ġ= ĠlistOf ( ĊĠĠĠ ĠSample ( title Ġ= Ġ" Lazy Row Ġsample ") Ġ{ ĠLazy Row Sample () Ġ} Ċ ) Ċ Ċ private Ġconst Ġval ĠITE MS _ IN _ GROUP Ġ= Ġ 4 Ċ private Ġconst Ġval ĠFAST _ FL ING _ THRESHOLD Ġ= Ġ 9 Ċ private Ġconst Ġval ĠFL ING _ DISTANCE _ IN _ ITEMS Ġ= Ġ 1 6 Ċ Ċ @ Opt In ( Experimental Snap per Api :: class ) Ċ @ Composable Ċ private Ġfun ĠLazy Row Sample () Ġ{ ĊĠĠĠ Ġval Ġlazy List State Ġ= Ġremember Lazy List State () ĊĠĠĠ Ġval Ġcontent Padding Ġ= ĠPadding Values ( 1 6 . dp ) ĊĊĠĠĠ ĠLazy Row ( ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġlazy List State , ĊĠĠĠĠĠĠĠ Ġfl ing Behavior Ġ= Ġremember Snap per Fl ing Behavior ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Offset For Item Ġ= ĠSnap Offsets . Start , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnap Index Ġ= Ġ{ Ġlayout , index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠindexOf First Item In Group Ġ= Ġindex . first Item In Group ( layout . total Items Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Item Ġ= Ġlayout . currentItem Ġ?: Ġreturn @ run ĠindexOf First Item In Group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentItem . index Ġ- Ġindex Ġ> ĠFL ING _ DISTANCE _ IN _ ITEMS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠindexOf First Item In Group Ġ= Ġ( currentItem . index Ġ- ĠFL ING _ DISTANCE _ IN _ ITEMS ) Ġ/ ĠITE MS _ IN _ GROUP Ġ* ĠITE MS _ IN _ GROUP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( index Ġ- Ġcurrent Item . index Ġ> ĠFL ING _ DISTANCE _ IN _ ITEMS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠindexOf First Item In Group Ġ= Ġ( currentItem . index Ġ+ ĠFL ING _ DISTANCE _ IN _ ITEMS ) Ġ/ ĠITE MS _ IN _ GROUP Ġ* ĠITE MS _ IN _ GROUP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfl ing Forward Ġ= Ġindex Ġ> Ġcurrent Item . index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fl ing Forward Ġ&& Ġindex Ġ- Ġcurrent Item . index Ġ> ĠFAST _ FL ING _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run ĠindexOf First Item In Group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! fl ing Forward Ġ&& Ġcurrent Item . index Ġ- Ġindex Ġ> ĠFAST _ FL ING _ THRESHOLD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġmin ( indexOf First Item In Group Ġ+ ĠITE MS _ IN _ GROUP , Ġlayout . total Items Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠindexOf First Item Of Next Group Ġ= ĠindexOf First Item In Group Ġ+ ĠITE MS _ IN _ GROUP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Size Ġ= Ġcurrent Item . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance To First Item Ġ= Ġ- layout . distance To Index Snap ( indexOf First Item In Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance To Next Group Ġ= Ġlayout . distance To Index Snap ( indexOf First Item Of Next Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance To First Item Ġ- Ġitem Size Ġ< Ġdistance To Next Group Ġ-> ĠindexOf First Item In Group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmin ( indexOf First Item Of Next Group , Ġlayout . total Items Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlazy List State Ġ= Ġlazy List State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġprovide Ġthe Ġun resolved Ġend Ġvalue , Ġso Ġuse ĠL tr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Content Padding Ġ= Ġcontent Padding . calculate End Padding ( Layout Direction . L tr ), ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġcontent Padding Ġ= Ġcontent Padding , ĊĠĠĠĠĠĠĠ Ġhorizontal Arrange ment Ġ= ĠArrange ment . spaced By ( 4 . dp ), ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . fill Max Width (), ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitems ( 5 0 ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ"$ index ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. width ( 1 6 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. aspect Ratio ( 3 Ġ/ Ġ 4 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. border ( 1 . dp , Ġif Ġ( index Ġ% ĠITE MS _ IN _ GROUP Ġ== Ġ 0 ) ĠColor . Blue Ġelse ĠColor . Red ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠInt . first Item In Group ( total Items Count : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġ( min ( max ( this , Ġ 0 ) Ġ/ ĠITE MS _ IN _ GROUP , Ġtotal Items Count Ġ/ ĠITE MS _ IN _ GROUP )) Ġ* ĠITE MS _ IN _ GROUP Ċ } Ċ