/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 Ġandroidx . compose . samples . cr ane . calendar Ċ Ċ import Ġandroidx . compose . animation . core . Anim atable Ċ import Ġandroidx . compose . animation . core . Tween Spec Ċ import Ġandroidx . compose . animation . core . t ween Ċ import Ġandroidx . compose . foundation . layout . Experimental Layout Api Ċ import Ġandroidx . compose . foundation . layout . Padding Values Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ import Ġandroidx . compose . foundation . layout . Window Insets Ċ import Ġandroidx . compose . foundation . layout . consumed Window Insets Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . navigation Bars Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . window Insets Bottom Height Ċ import Ġandroidx . compose . foundation . layout . wrap Content Width Ċ import Ġandroidx . compose . foundation . lazy . Lazy Column Ċ import Ġandroidx . compose . foundation . lazy . Lazy List Scope Ċ import Ġandroidx . compose . foundation . lazy . items Indexed Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . La unched Effect Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . samples . cr ane . calendar . model . Calendar State Ċ import Ġandroidx . compose . samples . cr ane . calendar . model . Calendar Ui State Ċ import Ġandroidx . compose . samples . cr ane . calendar . model . Month Ċ import Ġandroidx . compose . samples . cr ane . ui . Cr ane Theme Ċ import Ġandroidx . compose . samples . cr ane . util . E ase Out Qu art Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġjava . time . DayOfWeek Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . temporal . Temporal Adjust ers Ċ import Ġjava . time . temporal . Week Fields Ċ Ċ @ Opt In ( Experimental Layout Api :: class ) Ċ @ Composable Ċ fun ĠCalendar ( ĊĠĠĠ Ġcalendar State : ĠCalendar State , ĊĠĠĠ Ġon Day Clicked : Ġ( date : ĠLocalDate ) Ġ-> ĠUnit , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġcontent Padding : ĠPadding Values Ġ= ĠPadding Values () Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcalendar Ui State Ġ= Ġcalendar State . calendar Ui State . value ĊĠĠĠ Ġval Ġnumber Selected Days Ġ= Ġcalendar Ui State . number Selected Days . toInt () ĊĊĠĠĠ Ġval Ġselected Animation Percentage Ġ= Ġremember ( number Selected Days ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAnim atable ( 0 f ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠStart Ġa ĠLaunch ĠEffect Ġwhen Ġthe Ġnumber Ġof Ġselected Ġdays Ġchange . ĊĠĠĠ Ġ// Ġusing Ġ. animate To () Ġwe Ġanimate Ġthe Ġpercentage Ġselection Ġfrom Ġ 0 f Ġ- Ġ 1 f ĊĠĠĠ ĠLa unched Effect ( number Selected Days ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( calendar Ui State . has Selected Dates ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Spec : ĠT ween Spec < Float > Ġ= Ġt ween ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Millis Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( number Selected Days . coerce At Least ( 0 ) Ġ* ĠD URATION _ M ILL IS _ PER _ DAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coerce At Most ( 2 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeasing Ġ= ĠE ase Out Qu art ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Animation Percentage . animate To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Spec Ġ= Ġanimation Spec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠLazy Column ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier . consumed Window Insets ( content Padding ), ĊĠĠĠĠĠĠĠ Ġcontent Padding Ġ= Ġcontent Padding ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcalendar State . list Months . forEach Ġ{ Ġmonth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Calendar Month ( calendar Ui State , Ġon Day Clicked , Ġ{ Ġselected Animation Percentage . value Ġ}, Ġmonth ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġitem ( key Ġ= Ġ" bottom Spacer ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . window Insets Bottom Height ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Insets . navigation Bars ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠLazy List Scope . items Calendar Month ( ĊĠĠĠ Ġcalendar Ui State : ĠCalendar Ui State , ĊĠĠĠ Ġon Day Clicked : Ġ( LocalDate ) Ġ-> ĠUnit , ĊĠĠĠ Ġselected Percentage Provider : Ġ() Ġ-> ĠFloat , ĊĠĠĠ Ġmonth : ĠMonth Ċ ) Ġ{ ĊĠĠĠ Ġitem ( month . year Month . month . name Ġ+ Ġmonth . year Month . year Ġ+ Ġ" header ") Ġ{ ĊĠĠĠĠĠĠĠ ĠMonth Header ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 3 2 . dp , Ġend Ġ= Ġ 3 2 . dp , Ġtop Ġ= Ġ 3 2 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonth Ġ= Ġmonth . year Month . month . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyear Ġ= Ġmonth . year Month . year . toString () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠExpand ing Ġwidth Ġand Ġcenter ing Ġh orizontally ĊĠĠĠ Ġval Ġcontent Modifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠ Ġ. wrap Content Width ( Alignment . Center H orizontally ) ĊĠĠĠ Ġitem ( month . year Month . month . name Ġ+ Ġmonth . year Month . year Ġ+ Ġ" days OfWeek ") Ġ{ ĊĠĠĠĠĠĠĠ ĠDays OfWeek ( modifier Ġ= Ġcontent Modifier ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġcustom Ġkey Ġneeds Ġto Ġbe Ġgiven Ġto Ġthese Ġitems Ġso Ġthat Ġthey Ġcan Ġbe Ġfound Ġin Ġtests Ġthat ĊĠĠĠ Ġ// Ġneed Ġscrolling . ĠThe Ġformat Ġof Ġthe Ġkey Ġis Ġ${ year / month / week Number }. ĠThus , ĊĠĠĠ Ġ// Ġthe Ġkey Ġfor Ġthe Ġfourth Ġweek Ġof ĠDecember Ġ 2 0 2 0 Ġis Ġ" 2 0 2 0 / 1 2 / 4 " ĊĠĠĠ Ġitems Indexed ( month . week s , Ġkey Ġ= Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġmonth . year Month . year . toString () Ġ+ Ġ"/" Ġ+ Ġmonth . year Month . month . value Ġ+ Ġ"/" Ġ+ Ġ( index Ġ+ Ġ 1 ). toString () ĊĠĠĠ Ġ}) Ġ{ Ġ_, Ġweek Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġbeginning Week Ġ= Ġweek . year Month . at Day ( 1 ). plus Week s ( week . number . to Long ()) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Day Ġ= Ġbeginning Week . with ( Temporal Adjust ers . previous Or Same ( DayOfWeek . MON DAY )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( calendar Ui State . has Selected Period Overlap ( current Day , Ġcurrent Day . plus Days ( 6 ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWeek Selection P ill ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġcalendar Ui State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Week Start Ġ= Ġcurrent Day , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Per Day Ġ= ĠCELL _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweek Ġ= Ġweek , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Percentage Total Provider Ġ= Ġselected Percentage Provider ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠWeek ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalendar Ui State Ġ= Ġcalendar Ui State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġcontent Modifier , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweek Ġ= Ġweek , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Day Clicked Ġ= Ġon Day Clicked ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠSp acer ( Modifier . height ( 8 . dp )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġval ĠCAL END AR _ START S _ ON Ġ= ĠWeek Fields . ISO Ċ Ċ @ Preview Ċ @ Composable Ċ fun ĠDay Preview () Ġ{ ĊĠĠĠ ĠCr ane Theme Ġ{ ĊĠĠĠĠĠĠĠ ĠCalendar ( Calendar State (), Ġon Day Clicked Ġ= Ġ{ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ