/** Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ package Ġcom . af ol le st ad . date . data Ċ Ċ import Ġandroidx . annotation . Check Result Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġcom . af ol le st ad . date . data . Month Item . Day OfMonth Ċ import Ġcom . af ol le st ad . date . data . Month Item . Week Header Ċ import Ġcom . af ol le st ad . date . data . snapshot . Date Snapshot Ċ import Ġcom . af ol le st ad . date . data . snapshot . snapshot Ċ import Ġcom . af ol le st ad . date . data . snapshot . snapshot Month Ċ import Ġcom . af ol le st ad . date . day OfMonth Ċ import Ġcom . af ol le st ad . date . day OfWeek Ċ import Ġcom . af ol le st ad . date . month Ċ import Ġcom . af ol le st ad . date . total Days In Month Ċ import Ġcom . af ol le st ad . date . year Ċ import Ġjava . util . Calendar Ċ Ċ /** Ġ@ author ĠA id an ĠFol le st ad Ġ(@ af ol le st ad ) Ġ*/ Ċ internal Ġclass ĠMonth Graph ( ĊĠ Ġinitial Calendar : ĠCalendar , ĊĠ Ġ@ Visible ForTesting Ġtoday : ĠCalendar Ġ= ĠCalendar . getInstance () Ċ ) Ġ{ ĊĠ Ġprivate Ġval Ġtoday : ĠDate Snapshot Ġ= Ġtoday . snapshot () ĊĠ Ġ@ Visible ForTesting Ġval Ġcalendar Ġ= Ġ( initial Calendar . clone () Ġas ĠCalendar ). apply Ġ{ Ġday OfMonth Ġ= Ġ 1 Ġ} ĊĠ Ġ@ Visible ForTesting Ġvar Ġdays In Month : ĠInt Ġ= Ġcalendar . total Days In Month ĊĠ Ġ@ Visible ForTesting Ġvar Ġfirst Week Day In Month : ĠDay OfWeek Ġ= Ġcalendar . day OfWeek ĊĠ Ġvar Ġordered Week Days : ĠList < DayOfWeek > Ġ= Ġcalendar . first DayOfWeek ĊĠĠĠĠĠ Ġ. as DayOfWeek () ĊĠĠĠĠĠ Ġ. and The Rest () ĊĊĠ Ġ@ Check Result Ġfun Ġget Month Items ( selected Date : ĠDate Snapshot ): ĠList < Month Item > Ġ{ ĊĠĠĠ Ġval Ġdays OfMonth Ġ= Ġmutable ListOf < Month Item >() ĊĠĠĠ Ġval Ġmonth Ġ= Ġcalendar . snapshot Month () ĊĊĠĠĠ Ġ// ĠAdd Ġweek day Ġheaders ĊĠĠĠ Ġdays OfMonth . addAll ( ĊĠĠĠĠĠĠĠ Ġordered Week Days ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠWeek Header ( it ) Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠAdd Ġprefix Ġdays Ġfirst , Ġdays Ġthe Ġlead Ġup Ġfrom Ġlast Ġmonth Ġto Ġthe Ġfirst Ġday Ġof Ġthis ĊĠĠĠ Ġdays OfMonth . addAll ( ĊĠĠĠĠĠĠĠ Ġordered Week Days ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġit Ġ!= Ġfirst Week Day In Month Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDay OfMonth ( it , Ġmonth , Ġis Today Ġ= Ġfalse ) Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfor Ġ( date Ġin Ġ 1 .. days In Month ) Ġ{ ĊĠĠĠĠĠ Ġcalendar . day OfMonth Ġ= Ġdate ĊĠĠĠĠĠ Ġval Ġdate Snapshot Ġ= ĠDate Snapshot ( calendar . month , Ġdate , Ġcalendar . year ) ĊĠĠĠĠĠ Ġdays OfMonth . add ( ĊĠĠĠĠĠĠĠĠĠ ĠDay OfMonth ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġday OfWeek Ġ= Ġcalendar . day OfWeek , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonth Ġ= Ġmonth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġdate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Today Ġ= Ġdate Snapshot Ġ== Ġtoday , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Selected Ġ= Ġselected Date Ġ== Ġdate Snapshot ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( days OfMonth . size Ġ< ĠEXPECT ED _ SIZE ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠFill Ġin Ġremaining Ġdays Ġof Ġweek ĊĠĠĠĠĠ Ġval Ġloop Target Ġ= Ġordered Week Days . last () ĊĠĠĠĠĠĠĠĠĠ Ġ. next DayOfWeek () ĊĠĠĠĠĠ Ġdays OfMonth . addAll ( ĊĠĠĠĠĠĠĠĠĠ Ġ( days OfMonth . last () Ġas ĠDay OfMonth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. day OfWeek ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. next DayOfWeek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and The Rest () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġit Ġ!= Ġloop Target Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDay OfMonth ( it , Ġmonth , Ġis Today Ġ= Ġfalse ) Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠMake Ġsure Ġwe Ġfill Ġup Ġ 6 Ġweeks Ġworth Ġof Ġdates ĊĠĠĠ Ġwhile Ġ( days OfMonth . size Ġ< ĠEXPECT ED _ SIZE ) Ġ{ ĊĠĠĠĠĠ Ġdays OfMonth . addAll ( ordered Week Days . map Ġ{ ĊĠĠĠĠĠĠĠ ĠDay OfMonth ( it , Ġmonth , Ġis Today Ġ= Ġfalse ) ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcheck ( days OfMonth . size Ġ== ĠEXPECT ED _ SIZE ) Ġ{ ĊĠĠĠĠĠ Ġ"${ days OfMonth . size } Ġmust Ġequal Ġ$ EXPECTED _ SIZE " ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdays OfMonth ĊĠ Ġ} ĊĊĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠEXPECT ED _ SIZE : ĠInt Ġ= Ġ 4 9 ĊĠ Ġ} Ċ } Ċ