/* Ċ Ġ* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠF elix ĠB ie go Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . fb ie go . dt 7 8 Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . preference . Preference Manager Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . db . w illiam chart . data . Scale Ċ import Ġcom . fb ie go . dt 7 8 . app . Crash Logger Ċ import Ġcom . fb ie go . dt 7 8 . app . Settings Activity Ċ import Ġcom . fb ie go . dt 7 8 . data .* Ċ import Ġkotlinx . android . synt hetic . main . activity _ sleep .* Ċ import Ġkotlinx . android . synt hetic . main . activity _ sleep . don ut Chart Ċ import Ġkotlinx . android . synt hetic . main . activity _ sleep . target Steps Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠSleep Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsleep List Ġ= ĠArrayList < Sleep Data >() ĊĠĠĠ Ġprivate Ġvar Ġsleep Ġ= ĠArrayList < Sleep Data >() ĊĠĠĠ Ġprivate Ġvar Ġdays List Ġ= ĠArrayList < String >() ĊĠĠĠ Ġprivate Ġvar Ġcurrent Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmax Day Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġstart Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġend Ġ= Ġ 0 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġsleep Recycler : ĠRecyclerView ĊĊĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpref Ġ= ĠPreference Manager . getDefault SharedPreferences ( this ) ĊĠĠĠĠĠĠĠ Ġset Theme ( my Theme ( pref . getInt ( Settings Activity . PRE F _ ACC ENT , Ġ 0 ))) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ sleep ) ĊĊĠĠĠĠĠĠĠ ĠThread . setDefault Un caught ExceptionHandler ( Crash Logger ( this )) ĊĊĠĠĠĠĠĠĠ Ġval Ġaction bar Ġ= Ġsupport ActionBar ĊĠĠĠĠĠĠĠ Ġaction bar !!. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġsleep Recycler Ġ= ĠfindViewById < View >( R . id . re cyclerView Sleep ) Ġas ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġsleep Recycler . layout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( this ) ĊĊĠĠĠĠĠĠĠ Ġsleep Recycler . is Nested Scrolling Enabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġbutton Next Sleep . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ<= Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Next Sleep . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ< Ġmax Day - 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Prev Sleep . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplot Data ( max Day Ġ- Ġ( 1 Ġ+ Ġcurrent )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbutton Prev Sleep . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ>= Ġmax Day - 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Prev Sleep . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Next Sleep . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplot Data ( max Day Ġ- Ġ( 1 Ġ+ Ġcurrent )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// val Ġdb Handler Ġ= ĠMy DB Handler ( this , Ġnull , Ġnull , Ġ 1 ) ĊĊĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġload Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplot Data ( pos : ĠInt ){ ĊĠĠĠĠĠĠĠ Ġsleep List . clear () ĊĠĠĠĠĠĠĠ Ġsleep List Ġ= Ġget Sleep Day ( days List [ pos ]) ĊĊĠĠĠĠĠĠĠ Ġval Ġlight S Ġ= Ġsleep List . sum By Ġ{ Ġif Ġ( it . type Ġ== Ġ 1 ) Ġit . duration Ġelse Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdeep S Ġ= Ġsleep List . sum By Ġ{ Ġif Ġ( it . type Ġ== Ġ 2 ) Ġit . duration Ġelse Ġ 0 Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// val Ġl gt Ġ= Ġif Ġ( light S Ġ!= Ġ 0 ) Ġlight S Ġ- Ġdeep S Ġelse Ġ 0 Ċ // ĠĠĠĠĠĠĠ Ġlight . text Ġ= Ġthis . getString ( R . string . light _ sleep )+" \ n "+ time ( light S ) Ġ// "${ time ( light S )}\ n Light " Ċ // ĠĠĠĠĠĠĠ Ġdeep . text Ġ= Ġthis . getString ( R . string . deep _ sleep )+" \ n "+ time ( deep S ) Ġ// "${ time ( deep S )}\ n Deep " Ċ // ĠĠĠĠĠĠĠ Ġtotal . text Ġ= Ġthis . getString ( R . string . total _ sleep )+" \ n "+ time ( light S + deep S ) ĊĠĠĠĠĠĠĠ Ġtext Date Sleep . text Ġ= Ġdays List [ pos ] ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠArrayList < Pair < String , ĠFloat >>() ĊĠĠĠĠĠĠĠ Ġdata . add ( Pair ( this . getString ( R . string . light _ sleep )+" \ n "+ time ( light S ), Ġlight S . toFloat ())) ĊĠĠĠĠĠĠĠ Ġdata . add ( Pair ( this . getString ( R . string . deep _ sleep )+" \ n "+ time ( deep S ), Ġdeep S . toFloat ())) Ċ Ċ // ĠĠĠĠĠĠĠ Ġsleep Chart . labels Color Ġ= Ġthis . getColor From Attr ( R . attr . color Icons ) Ċ // ĠĠĠĠĠĠĠ Ġsleep Chart . scale Ġ= ĠScale ( 0 f , Ġ( light S + deep S ). toFloat ()) Ċ // ĠĠĠĠĠĠĠ Ġsleep Chart . animate ( data ) ĊĊĠĠĠĠĠĠĠ Ġupdate Don ut ( this , Ġlight S , Ġdeep S ) ĊĠĠĠĠĠĠĠ Ġval Ġsleep Adapter Ġ= ĠSleep Adapter ( sleep List ) ĊĠĠĠĠĠĠĠ Ġsleep Recycler . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( this @ Sleep Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġsleep Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Don ut ( context : ĠContext , Ġlight : ĠInt , Ġdeep : ĠInt ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġplot 1 Ġ= Ġ(( light . toFloat () /( light + deep ))* 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġplot 2 Ġ= Ġ(( deep . toFloat () /( light + deep ))* 1 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdon ut Data Ġ= Ġarray ListOf ( plot 1 , Ġplot 2 ) ĊĊĠĠĠĠĠĠĠ Ġdon ut Chart Light . don ut Colors Ġ= Ġint ArrayOf ( context . getColor From Attr ( R . attr . color Icons )) ĊĠĠĠĠĠĠĠ Ġdon ut Chart Light . animate ( array ListOf ( plot 1 )) ĊĠĠĠĠĠĠĠ Ġtarget Steps Light . text Ġ= Ġcontext . getString ( R . string . light _ sleep )+" \ n "+ time ( light ) ĊĊĠĠĠĠĠĠĠ Ġdon ut Chart Deep . don ut Colors Ġ= Ġint ArrayOf ( context . getColor From Attr ( R . attr . color Icons )) ĊĠĠĠĠĠĠĠ Ġdon ut Chart Deep . animate ( array ListOf ( plot 2 )) ĊĠĠĠĠĠĠĠ Ġtarget Steps Deep . text Ġ= Ġcontext . getString ( R . string . deep _ sleep )+" \ n "+ time ( deep ) ĊĊĠĠĠĠĠĠĠ Ġ// don ut Chart . ĊĠĠĠĠĠĠĠ Ġtarget Steps . text Ġ= Ġcontext . getString ( R . string . total _ sleep )+" \ n "+ time ( light + deep ) ĊĠĠĠĠĠĠĠ Ġdon ut Chart . don ut Colors Ġ= Ġint ArrayOf ( context . getColor From Attr ( R . attr . color Button Enabled ), Ġcontext . getColor From Attr ( R . attr . color Icons )) ĊĠĠĠĠĠĠĠ Ġdon ut Chart . animate ( don ut Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Data (){ ĊĠĠĠĠĠĠĠ Ġdaily Sleep () ĊĠĠĠĠĠĠĠ Ġmax Day Ġ= Ġdays List . size ĊĠĠĠĠĠĠĠ Ġif Ġ( days List . isNotEmpty ()){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplot Data ( max Day Ġ- Ġ( 1 Ġ+ Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Date Sleep . text Ġ= Ġthis . getString ( R . string . no _ data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Don ut ( this , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbutton Next Sleep . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbutton Prev Sleep . isEnabled Ġ= Ġmax Day Ġ> Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Support Navigate Up (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠ Ġoverride Pending Transition ( R . anim . slide _ in _ left , ĠR . anim . slide _ out _ right ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġoverride Pending Transition ( R . anim . slide _ in _ left , ĠR . anim . slide _ out _ right ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdaily Sleep (){ ĊĠĠĠĠĠĠĠ Ġval Ġdb Handler Ġ= ĠMy DB Handler ( this , Ġnull , Ġnull , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġs lp Ġ= Ġdb Handler . get Sleep Data () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġdb Handler . get Set ( 1 ) ĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġcurrent [ 1 ]* 1 0 0 Ġ+ Ġcurrent [ 2 ] ĊĠĠĠĠĠĠĠ Ġend Ġ= Ġcurrent [ 3 ]* 1 0 0 Ġ+ Ġ Ġcurrent [ 4 ] ĊĊĊĠĠĠĠĠĠĠ Ġsleep . clear () ĊĠĠĠĠĠĠĠ Ġsleep Ġ= Ġs lp ĊĊĠĠĠĠĠĠĠ Ġval Ġqr Ġ= ĠArrayList < String >() ĊĊĠĠĠĠĠĠĠ Ġs lp . forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ> Ġend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġ>= Ġstart Ġ|| Ġit . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġ<= Ġend ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġ>= Ġstart ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . DAY _ OF _ MONTH , Ġit . day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MONTH , Ġit . month - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . YEAR , Ġit . year + 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . add ( Calendar . DATE , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġel Ġ= ĠString . format ("% 0 2 d -% 0 2 d - 2 0 % 0 2 d ", Ġcal . get ( Calendar . DAY _ OF _ MONTH ), Ġcal . get ( Calendar . MONTH )+ 1 , Ġcal . get ( Calendar . YEAR )- 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! qr . contains ( el )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqr . add ( el ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġel Ġ= ĠString . format ("% 0 2 d -% 0 2 d - 2 0 % 0 2 d ", Ġit . day , Ġit . month , Ġit . year ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! qr . contains ( el )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqr . add ( el ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġin Ġstart .. end ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġel Ġ= ĠString . format ("% 0 2 d -% 0 2 d - 2 0 % 0 2 d ", Ġit . day , Ġit . month , Ġit . year ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! qr . contains ( el )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqr . add ( el ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdays List . clear () ĊĠĠĠĠĠĠĠ Ġdays List Ġ= Ġqr ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sleep Day ( day : ĠString ): ĠArrayList < Sleep Data >{ ĊĠĠĠĠĠĠĠ Ġval Ġtoday Ġ= ĠArrayList < Sleep Data >() ĊĠĠĠĠĠĠĠ Ġif Ġ( sleep . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ> Ġend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġ>= Ġstart Ġ|| Ġit . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġ<= Ġend ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġ>= Ġstart ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . DAY _ OF _ MONTH , Ġit . day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MONTH , Ġit . month - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . set ( Calendar . YEAR , Ġit . year + 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . add ( Calendar . DATE , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠString . format ("% 0 2 d -% 0 2 d - 2 0 % 0 2 d ", Ġcal . get ( Calendar . DAY _ OF _ MONTH ), Ġcal . get ( Calendar . MONTH )+ 1 , Ġcal . get ( Calendar . YEAR )- 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day Ġ== Ġdate ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoday . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠString . format ("% 0 2 d -% 0 2 d - 2 0 % 0 2 d ", Ġit . day , Ġit . month , Ġit . year ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day Ġ== Ġdate ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoday . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . hour Ġ* Ġ 1 0 0 Ġ+ Ġit . minute Ġin Ġstart .. end ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠString . format ("% 0 2 d -% 0 2 d - 2 0 % 0 2 d ", Ġit . day , Ġit . month , Ġit . year ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( day Ġ== Ġdate ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoday . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġparse Data ( today ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġparse Data ( input : ĠArrayList < Sleep Data >): ĠArrayList < Sleep Data >{ ĊĠĠĠĠĠĠĠ Ġval Ġout Data Ġ= ĠArrayList < Sleep Data >() ĊĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġend Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġlast Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġinput . size ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġtime Millis ( input [ x ], Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ x ]. type Ġ== Ġ 1 ){ ĉ ĉ // Ġsave Ġstart Ġ& Ġend Ġif Ġlight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġtime Millis ( input [ x ], Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġtime Millis ( input [ x ], Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġinput . size - 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ x ]. type Ġ== Ġ 1 ){ ĉ // light ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ!= Ġ 0 Ġ&& Ġtype Ġ!= Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( last , Ġtime Millis ( input [ x ], Ġtrue )- 6 0 0 0 0 , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( time Millis ( input [ x ], Ġtrue ), Ġtime Millis ( input [ x + 1 ], Ġtrue )- 6 0 0 0 0 , Ġinput [ x ]. type )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĉ // Ġdeep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last + 6 0 0 0 0 Ġ< Ġtime Millis ( input [ x ], Ġtrue ) Ġ&& Ġtime Millis ( input [ x ], Ġtrue ) Ġ>= Ġstart Ġ&& Ġtime Millis ( input [ x ], Ġfalse ) Ġ<= Ġend ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( last , Ġtime Millis ( input [ x ], Ġtrue )- 6 0 0 0 0 , Ġ 1 )) ĉ // Ġinsert Ġlight Ġbetween Ġdeep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ!= Ġ 0 Ġ&& Ġtype Ġ!= Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( last , Ġtime Millis ( input [ x ], Ġtrue )- 6 0 0 0 0 , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( input [ x ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ x + 1 ]. type Ġ== Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ> Ġtime Millis ( input [ x ], Ġfalse )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// out Data . add ( millis 2 Sleep ( time Millis ( input [ x ], Ġfalse ), Ġend , Ġ 1 )) ĉ // Ġfill Ġlight Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlast Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last + 6 0 0 0 0 Ġ< Ġtime Millis ( input [ x ], Ġtrue ) Ġ Ġ&& Ġlast + 6 0 0 0 0 Ġ>= Ġstart Ġ&& Ġtime Millis ( input [ x ], Ġtrue )- 6 0 0 0 0 Ġ<= Ġend ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( last , Ġtime Millis ( input [ x ], Ġtrue )- 6 0 0 0 0 , Ġ 1 )) ĉ // Ġinsert Ġlight Ġbetween Ġdeep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ Ġelse Ġif Ġ( x Ġ!= Ġ 0 Ġ&& Ġtype Ġ!= Ġ 1 Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( last , Ġtime Millis ( input [ x ], Ġtrue )- 6 0 0 0 0 , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( input [ x ]) ĉ // Ġlast Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ> Ġtime Millis ( input [ x ], Ġfalse )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( time Millis ( input [ x ], Ġfalse ), Ġend , Ġ 1 )) Ġ// Ġfill Ġlight Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġtime Millis ( input [ x ], Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġinput [ x ]. type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcont Data ( out Data ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcont Data ( input : ĠArrayList < Sleep Data >): ĠArrayList < Sleep Data >{ ĊĠĠĠĠĠĠĠ Ġval Ġout Data Ġ= ĠArrayList < Sleep Data >() ĊĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġend Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġtype Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġinput . size ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input . size Ġ== Ġ 1 ){ ĉ // Ġone Ġitem Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( input [ x ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ== Ġ 0 ){ ĉ // Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġtime Millis ( input [ x ], Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġtime Millis ( input [ x ], Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġinput [ x ]. type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ< Ġinput . size - 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ x ]. type Ġ== Ġtype ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ== Ġtime Millis ( input [ x ], Ġtrue )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġtime Millis ( input [ x ], Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( start , Ġend - 6 0 0 0 0 , Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġtime Millis ( input [ x ], Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġtime Millis ( input [ x ], Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġinput [ x ]. type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĉ ĉ // Ġlast ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ x ]. type Ġ== Ġtype Ġ&& Ġend Ġ== Ġtime Millis ( input [ x ], Ġtrue )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġtime Millis ( input [ x ], Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( start , Ġend - 6 0 0 0 0 , Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( millis 2 Sleep ( start , Ġend - 6 0 0 0 0 , Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Data . add ( input [ x ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtime Millis ( sleep Data : ĠSleep Data , Ġstart : ĠBoolean ): ĠLong { ĊĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġcal . set ( Calendar . YEAR , Ġsleep Data . year + 2 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MONTH , Ġsleep Data . month - 1 ) ĊĠĠĠĠĠĠĠ Ġcal . set ( Calendar . DAY _ OF _ MONTH , Ġsleep Data . day ) ĊĠĠĠĠĠĠĠ Ġcal . set ( Calendar . HOUR _ OF _ DAY , Ġsleep Data . hour ) ĊĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MINUTE , Ġsleep Data . minute ) ĊĠĠĠĠĠĠĠ Ġcal . set ( Calendar . SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcal . set ( Calendar . MILLI SECOND Ġ, Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( start ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . time In Millis ĊĠĠĠĠĠĠĠ Ġ} Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . add ( Calendar . MINUTE , Ġsleep Data . duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . time In Millis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmillis 2 Sleep ( start : ĠLong , Ġend : ĠLong , Ġtype : ĠInt ): ĠSleep Data { ĊĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġcal . time In Millis Ġ= Ġstart ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSleep Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . YEAR )- 2 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . MONTH )+ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . DAY _ OF _ MONTH ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . HOUR _ OF _ DAY ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . MINUTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype , Ġ(( end + 6 0 0 0 0 - start )/ 6 0 0 0 0 ). toInt () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊ Ċ }