/** Ċ Ġ* ĠDesign ed Ġand Ġdeveloped Ġby ĠA id an ĠFol le st ad Ġ(@ af ol le st ad ) Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ @ file : Suppress (" Member Visibility Can Be Private ", Ġ" unused ") Ċ Ċ package Ġcom . af ol le st ad . date Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Check Result Ċ import Ġandroidx . annotation . Int Range Ċ import Ġcom . af ol le st ad . date . adapters . Month Item Adapter Ċ import Ġcom . af ol le st ad . date . adapters . Year Adapter Ċ import Ġcom . af ol le st ad . date . controllers . DatePicker Controller Ċ import Ġcom . af ol le st ad . date . data . Month Item Ċ import Ġcom . af ol le st ad . date . data . Month Item . Day OfMonth Ċ import Ġcom . af ol le st ad . date . render ers . Month Item Renderer Ċ import Ġcom . af ol le st ad . date . runners . DatePicker Layout Runner Ċ import Ġcom . af ol le st ad . date . view . DatePicker Saved State Ċ import Ġjava . lang . Long . MAX _ VALUE Ċ import Ġjava . util . Calendar Ċ Ċ type alias ĠOn Date Changed Ġ= Ġ( previous : ĠCalendar , Ġdate : ĠCalendar ) Ġ-> ĠUnit Ċ Ċ /** Ġ@ author ĠA id an ĠFol le st ad Ġ(@ af ol le st ad ) Ġ*/ Ċ Ċ class ĠDate Picker Ċ // ĠTODO ĠNEW Ġ{ Ċ @ Jvm Over loads Ċ constructor ( ĊĠ Ġcontext : ĠContext , ĊĠ Ġattrs : ĠAttributeSet ?, ĊĠ Ġbase Date : ĠCalendar Ġ= ĠCalendar . getInstance (), ĊĠ Ġvar Ġmin Date : ĠCalendar ? Ġ= Ġnull , ĊĠ Ġvar Ġmax Date : ĠCalendar ? Ġ= Ġnull Ċ ) Ġ: ĠViewGroup ( context , Ġattrs ) Ġ{ ĊĠ Ġprivate Ġvar Ġdate Picker Config Ġ= ĠDate Picker Config . create ( context , Ġattrs ) ĊĊĠ Ġinternal Ġval Ġcontroller : ĠDate Picker Controller ĊĠ Ġprivate Ġval Ġlayout Runner : ĠDate Picker Layout Runner ĊĊĠ Ġprivate Ġval Ġmonth Item Adapter : ĠMonth Item Adapter ĊĠ Ġprivate Ġval Ġyear Adapter : ĠYear Adapter ĊĠ Ġprivate Ġval Ġmonth Item Renderer : ĠMonth Item Renderer ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġlayout Runner Ġ= ĠDate Picker Layout Runner . inflate Into ( ĊĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠ Ġconfig Ġ= Ġdate Picker Config , ĊĠĠĠĠĠ Ġcontainer Ġ= Ġthis , ĊĠĠĠĠĠ Ġon Date Input Ġ= Ġ:: maybe Set Date From Input ĊĠĠĠ Ġ) ĊĠĠĠ Ġcontroller Ġ= ĠDate Picker Controller ( ĊĠĠĠĠĠ Ġconfig Ġ= Ġdate Picker Config , ĊĠĠĠĠĠ Ġrender Headers Ġ= Ġlayout Runner :: set Headers Content , ĊĠĠĠĠĠ Ġrender Month Items Ġ= Ġ:: render Month Items ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġmonth Item Renderer Ġ= ĠMonth Item Renderer ( date Picker Config ) ĊĠĠĠ Ġmonth Item Adapter Ġ= ĠMonth Item Adapter ( ĊĠĠĠĠĠ Ġitem Renderer Ġ= Ġmonth Item Renderer , ĊĠĠĠĠĠ ĠisIn Bounds Ġ= Ġ:: is Day OfMonth In Bounds ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is Day OfMonth In Bounds ( it )) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . set Day OfMonth ( it . date ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġyear Adapter Ġ= ĠYear Adapter ( ĊĠĠĠĠĠ Ġdate Picker Config , ĊĠĠĠĠĠ ĠisIn Bounds Ġ= Ġ:: is Year In Bounds ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( is Year In Bounds ( it )) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . set Year ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlayout Runner . set Adapters ( month Item Adapter , Ġyear Adapter ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Day OfMonth In Bounds ( day OfMonth : ĠDay OfMonth ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġcontroller . getFull Date ()?. clone ()?. let Ġ{ ĊĠĠĠĠĠ Ġ( it Ġas ĠCalendar ). set ( Calendar . YEAR , Ġcontroller . view ing Month ?. year Ġ?: Ġit . year ) ĊĠĠĠĠĠ Ġ( it Ġas ĠCalendar ). set ( Calendar . MONTH , Ġcontroller . view ing Month ?. month Ġ?: Ġit . month ) ĊĠĠĠĠĠ Ġ( it Ġas ĠCalendar ). set ( Calendar . DAY _ OF _ MONTH , Ġday OfMonth . date ) ĊĠĠĠĠĠ ĠisIn Bounds ( it ) ĊĠĠĠ Ġ} Ġ?: Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Year In Bounds ( year : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġcontroller . getFull Date ()?. clone ()?. let Ġ{ ĊĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ( it Ġas ĠCalendar ). set ( Calendar . MONTH , Ġcontroller . view ing Month ?. month Ġ?: Ġit . month ) ĊĠĠĠĠĠ Ġ( it Ġas ĠCalendar ). set ( Calendar . YEAR , Ġyear ) ĊĠĠĠĠĠ ĠisIn Bounds ( it ) ĊĠĠĠ Ġ} Ġ?: Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠisIn Bounds ( calendar : ĠCalendar ): ĠBoolean Ġ{ ĊĠĠĠ Ġmin Date ?. let Ġ{ Ġif Ġ( calendar . before ( it )) Ġreturn Ġfalse Ġ} ĊĠĠĠ Ġmax Date ?. let Ġ{ Ġif Ġ( calendar . after ( it )) Ġreturn Ġfalse Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĠ Ġ// ĠTODO ĠNEW Ġ} ĊĊĠ Ġ/** ĠSets Ġthe Ġdate Ġdisplayed Ġin Ġthe Ġview , Ġalong Ġwith Ġthe Ġselected Ġdate . Ġ*/ ĊĠ Ġfun Ġset Date ( ĊĠĠĠ Ġcalendar : ĠCalendar , ĊĠĠĠ Ġnotify Listeners : ĠBoolean Ġ= Ġtrue ĊĠ Ġ) Ġ= Ġcontroller . set Full Date ( calendar , Ġnotify Listeners ) ĊĊĠ Ġ/** ĠSets Ġthe Ġdate Ġand Ġyear Ġdisplayed Ġin Ġthe Ġview , Ġalong Ġwith Ġthe Ġselected Ġdate Ġ( option ally ). Ġ*/ ĊĠ Ġfun Ġset Date ( ĊĠĠĠ Ġ@ Int Range ( from Ġ= Ġ 1 , Ġto Ġ= ĠMAX _ VALUE ) Ġyear : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġ@ Int Range ( from Ġ= ĠMON TH _ MIN , Ġto Ġ= ĠMON TH _ MAX ) Ġmonth : ĠInt , ĊĠĠĠ Ġ@ Int Range ( from Ġ= ĠDAY _ MIN , Ġto Ġ= ĠDAY _ MAX ) Ġselected Date : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġnotify Listeners : ĠBoolean Ġ= Ġtrue ĊĠ Ġ) Ġ= Ġcontroller . set Full Date ( ĊĠĠĠ Ġyear Ġ= Ġyear , Ġmonth Ġ= Ġmonth , Ġselected Date Ġ= Ġselected Date , Ġnotify Listeners Ġ= Ġnotify Listeners ĊĠ Ġ) ĊĊĠ Ġ/** ĠGets Ġthe Ġselected Ġdate , Ġif Ġany . Ġ*/ ĊĠ Ġ@ Check Result Ġfun Ġget Date (): ĠCalendar ? Ġ= Ġcontroller . getFull Date () ĊĊĠ Ġ/** ĠApp ends Ġa Ġlistener Ġthat Ġis Ġinvoked Ġwhen Ġthe Ġselected Ġdate Ġchanges . Ġ*/ ĊĠ Ġfun Ġadd On Date Changed ( block : ĠOn Date Changed ) Ġ= Ġcontroller . add Date Changed Listener ( block ) ĊĊĠ Ġ/** ĠClear s Ġall Ġlisteners Ġadded Ġvia Ġ[ add On Date Changed ]. Ġ*/ ĊĠ Ġfun Ġclear On Date Changed () Ġ= Ġcontroller . clear Date Changed Listeners () ĊĊĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠ Ġcontroller . maybe Init () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able ? Ġ= ĊĠĠĠ ĠDate Picker Saved State ( getDate (), Ġsuper . on Save InstanceState ()) ĊĊĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ?) Ġ{ ĊĠĠĠ Ġif Ġ( state Ġis ĠDate Picker Saved State ) Ġ{ ĊĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state . super State ) ĊĠĠĠĠĠ Ġstate . selected Date ?. let Ġ{ Ġcontroller . set Full Date ( it , Ġfalse ) Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠ Ġsuper . on Finish Inf late () ĊĠĠĠ Ġlayout Runner . on Navigate ( ĊĠĠĠĠĠ Ġcontroller :: previous Month , ĊĠĠĠĠĠ Ġcontroller :: next Month ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Measure ( ĊĠĠĠ Ġwidth Measure Spec : ĠInt , ĊĠĠĠ Ġheight Measure Spec : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġlayout Runner . measure ( width Measure Spec , Ġheight Measure Spec , Ġ 0 ) ĊĠĠĠĠĠ Ġ. let Ġ{ Ġ( width , Ġheight ) Ġ-> Ġset Measured Dimension ( width , Ġheight ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Suppress Lint (" Check Result ") ĊĠ Ġoverride Ġfun Ġon Layout ( ĊĠĠĠ Ġchanged : ĠBoolean , ĊĠĠĠ Ġleft : ĠInt , ĊĠĠĠ Ġtop : ĠInt , ĊĠĠĠ Ġright : ĠInt , ĊĠĠĠ Ġbottom : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġlayout Runner . layout ( ĊĠĠĠĠĠ Ġtop Ġ= Ġ 0 , ĊĠĠĠĠĠ Ġleft Ġ= Ġ 0 , ĊĠĠĠĠĠ Ġright Ġ= Ġmeasured Width , ĊĠĠĠĠĠ Ġparent Width Ġ= Ġmeasured Width ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrender Month Items ( days : ĠList < Month Item >) Ġ{ ĊĠĠĠ Ġval Ġfirst Day OfMonth Ġ= Ġdays . first Ġ{ Ġit Ġis ĠDay OfMonth Ġ} Ġas ĠDay OfMonth ĊĠĠĠ Ġyear Adapter . selected Year Ġ= Ġfirst Day OfMonth ĊĠĠĠĠĠ Ġ. month ĊĠĠĠĠĠ Ġ. year ĊĠĠĠ Ġyear Adapter . getSelected Position () ĊĠĠĠĠĠ Ġ? . let ( layout Runner :: scrollTo Year Position ) ĊĠĠĠ Ġmonth Item Adapter . items Ġ= Ġdays ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmaybe Set Date From Input ( input : ĠCharSequence ) Ġ{ ĊĠĠĠ Ġcontroller . maybe Set Date From Input ( input ) ĊĠ Ġ} Ċ } Ċ Ċ internal Ġconst Ġval ĠMON TH _ MIN : ĠLong Ġ= Ġ 0 Ġ// ĠCalendar . J AN U ARY Ċ internal Ġconst Ġval ĠMON TH _ MAX : ĠLong Ġ= Ġ 1 1 Ġ// ĠCalendar . DE CE MBER Ċ internal Ġconst Ġval ĠDAY _ MIN : ĠLong Ġ= Ġ 1 Ċ internal Ġconst Ġval ĠDAY _ MAX : ĠLong Ġ= Ġ 3 1 Ċ