package Ġcom . po cket _ plan . j 7 _ 0 0 3 . data . birthday list Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . po cket _ plan . j 7 _ 0 0 3 . App Ċ import Ġcom . po cket _ plan . j 7 _ 0 0 3 . R Ċ import Ġcom . po cket _ plan . j 7 _ 0 0 3 . data . Check able Ċ import Ġcom . po cket _ plan . j 7 _ 0 0 3 . system _ interaction . handler . storage . Storage Handler Ċ import Ġcom . po cket _ plan . j 7 _ 0 0 3 . system _ interaction . handler . storage . Storage Id Ċ import Ġorg . th reet en . bp . LocalDate Ċ import Ġjava . lang . NullPointerException Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġhandler Ġto Ġmanage Ġthe Ġinteraction Ġof Ġdifferent Ġobjects Ċ Ġ* Ġwith Ġa Ġsimilar Ġstructure . Ċ Ġ*/ Ċ class ĠB irth day List ( val Ġmonth Names : ĠArray < String >) Ġ: ĠArrayList < Birth day >(), ĠCheck able Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠStorage Handler . create Json File ( Storage Id . B IR TH DAYS ) ĊĠĠĠĠĠĠĠ Ġfetch FromFile () ĊĠĠĠĠĠĠĠ Ġsort Birth day () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġbirthday Ġto Ġthe Ġthis Ġand Ġsaves Ġthe Ġthis . ĊĠĠĠĠ Ġ* Ġ@ param Ġname ĠThe Ġname Ġof Ġthe Ġcreated Ġbirthday ĊĠĠĠĠ Ġ* Ġ@ param Ġmonth Ġ ĠThe Ġmonth Ġof Ġthe Ġbirthday ĊĠĠĠĠ Ġ* Ġ@ param Ġday ĠThe Ġday Ġof Ġthe Ġbirthday ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Birth day ( name : ĠString , Ġday : ĠInt , Ġmonth : ĠInt , Ġyear : ĠInt , ĊĠĠĠĠĠĠĠ Ġdays To Rem ind : ĠInt , Ġexpanded : ĠBoolean , Ġnotify : ĠBoolean ĊĠĠĠ Ġ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Birth day Ġ= ĠB irth day ( name , Ġday , Ġmonth , Ġyear , Ġdays To Rem ind , Ġexpanded , Ġnotify ) ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Full Birth day ( new Birth day ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper ĠFunction Ġto Ġadd Ġa Ġfull Ġbirthday Ġobject , Ġused Ġfor Ġundo ing Ġde letions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Full Birth day ( birthday : ĠB irth day ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinit Size Ġ= Ġthis . size ĊĊĠĠĠĠĠĠĠ Ġthis . add ( birthday ) ĊĠĠĠĠĠĠĠ Ġsort And Save Birth days () ĊĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġthis . indexOf ( birthday ) ĊĠĠĠĠĠĠĠ Ġval Ġitem Range Ġ= Ġthis . size Ġ- Ġinit Size ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( startIndex Ġ- Ġitem Range Ġ+ Ġ 1 , Ġitem Range ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable All Rem inders (){ ĊĠĠĠĠĠĠĠ Ġthis . forEach { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . notify Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenable All Rem inders (){ ĊĠĠĠĠĠĠĠ Ġthis . forEach { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . notify Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsort And Save Birth days () Ġ{ ĊĠĠĠĠĠĠĠ Ġsort Birth day () ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Birth day Object ( birthday : ĠB irth day ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġthis . indexOf ( birthday ) ĊĠĠĠĠĠĠĠ Ġval Ġinit Size Ġ= Ġthis . size ĊĠĠĠĠĠĠĠ Ġthis . remove ( birthday ) ĊĠĠĠĠĠĠĠ Ġsort Birth day () ĊĠĠĠĠĠĠĠ Ġval Ġitem Range Ġ= Ġinit Size Ġ- Ġthis . size ĊĠĠĠĠĠĠĠ Ġsave () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( startIndex Ġ- Ġitem Range Ġ+ Ġ 1 , Ġitem Range ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġbirthday Ġfrom Ġarray list Ġat Ġgiven Ġindex ĊĠĠĠĠ Ġ* Ġ@ return ĠReturns Ġrequested Ġbirthday Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Birth day ( position : ĠInt ): ĠB irth day Ġ= Ġthis [ position ] ĊĊĠĠĠ Ġprivate Ġfun Ġmanage Labels () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonths Ġ= Ġarray ListOf < Int >() ĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( n Ġ< Ġthis . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this [ n ]. days To Rem ind Ġ< Ġ 0 ) Ġthis . remove ( this [ n ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġn ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtoday Ġ= ĠLocalDate . now () ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Month Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġafter Month Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! months . contains ( m . month ) Ġ&& Ġm . month Ġ!= Ġtoday . month Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonths . add ( m . month ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m . month Ġ== Ġtoday . month Value Ġ&& Ġm . day Ġ< Ġtoday . day OfMonth ) Ġbefore Month Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( m . month Ġ== Ġtoday . month Value Ġ&& Ġm . day Ġ>= Ġtoday . day OfMonth ) Ġafter Month Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmonth Name Ġ= Ġmonth Names [ today . month Value Ġ- Ġ 1 ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( before Month ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB irth day ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonth Name , Ġ 1 , Ġtoday . month Value , Ġ 0 , Ġ- 1 Ġ* Ġtoday . month Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Ġ= Ġfalse , Ġnotify Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( after Month ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB irth day ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonth Name , Ġtoday . day OfMonth , Ġtoday . month Value , Ġ 0 , Ġ- 1 Ġ* Ġtoday . month Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Ġ= Ġfalse , Ġnotify Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmonths . forEach Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmonth Ġ= ĠLocalDate . of ( 2 0 2 0 , Ġm , Ġ 1 ). month ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġmonth Names [ month . value Ġ- Ġ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB irth day ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , Ġ 0 , Ġm , Ġ 0 , Ġ- 1 Ġ* Ġm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Ġ= Ġfalse , Ġnotify Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsort Birth day () Ġ{ ĊĠĠĠĠĠĠĠ Ġmanage Labels () ĊĠĠĠĠĠĠĠ Ġval Ġlocal Date Ġ= ĠLocalDate . now () ĊĠĠĠĠĠĠĠ Ġval Ġday Ġ= Ġlocal Date . day OfMonth ĊĠĠĠĠĠĠĠ Ġval Ġmonth Ġ= Ġlocal Date . month . value ĊĠĠĠĠĠĠĠ Ġval Ġcache List Ġ= ĠArrayList < Birth day >() ĊĠĠĠĠĠĠĠ Ġthis . sort With ( compare By ({ Ġit . month Ġ}, Ġ{ Ġit . day Ġ}, Ġ{ Ġit . days To Rem ind Ġ>= Ġ 0 Ġ}, Ġ{ Ġit . name Ġ})) ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġsp acer Birth day Ġ= ĠB irth day ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ local Date . year Ġ+ Ġ 1 }", Ġ 1 , Ġ 1 , Ġ 0 , Ġ- 2 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcache List . add ( spacer Birth day ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġthis . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Birth day ( i ). month Ġ< Ġmonth Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( get Birth day ( i ). month Ġ== Ġmonth Ġ&& Ġget Birth day ( i ). day Ġ< Ġday ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache List . add ( get Birth day ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . remove ( get Birth day ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . sort With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompare By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . month Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . day Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . days To Rem ind Ġ>= Ġ 0 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . name Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cache List . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache List . remove ( spacer Birth day ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcache List . forEach Ġ{ Ġn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( n ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetNext Re levant Birth day (): ĠB irth day ? Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . days To Rem ind Ġ>= Ġ 0 Ġ Ġ&& Ġn . days Until () Ġ<= Ġ 3 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCollect s Ġall Ġbirth days Ġthat Ġare Ġhappening Ġon Ġthe Ġcurrent Ġday Ġand Ġreturns ĊĠĠĠĠ Ġ* Ġthem Ġas Ġan Ġlist . ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof Ġtoday 's Ġbirth days . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Re levant Current Birth days (): ĠArrayList < Birth day > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Birth days Ġ= ĠArrayList < Birth day >() ĊĠĠĠĠĠĠĠ Ġval Ġlocal Date Ġ= ĠLocalDate . now () ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . month Ġ== Ġlocal Date . month Value Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn . day Ġ== Ġlocal Date . day OfMonth Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn . days To Rem ind Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Birth days . add ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Birth days ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS aves Ġall Ġbirth days Ġas Ġcollapsed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcollapse All () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . expanded Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch FromFile () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson String Ġ= ĠStorage Handler . files [ Storage Id . B IR TH DAYS ]?. read Text () ĊĊĠĠĠĠĠĠĠ Ġthis . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGson Builder (). create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fromJson ( json String , Ġobject Ġ: ĠType Token < ArrayList < Birth day >>() Ġ{} . type ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave () Ġ{ ĊĠĠĠĠĠĠĠ ĠStorage Handler . save As Json ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Handler . files [ Storage Id . B IR TH DAYS ], Ġthis ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ