package Ġcom . example . wh atis up . src . ui . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġcom . example . wh atis up . R Ċ import Ġcom . example . wh atis up . src . data . model . Day Activity Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġcom . example . wh atis up . src . utils . Time Utils Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Graph View " Ċ Ċ class ĠGraph View ( context : ĠContext , Ġattrs : ĠAttributeSet ): ĠView ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠ Ġprivate Ġval Ġline Color Ġ= Ġcontext . getColor ( R . color . color Accent ) ĊĠĠĠ Ġprivate Ġval ĠbackgroundColor Ġ= Ġcontext . getColor ( R . color . color Primary ) ĊĠĠĠ Ġprivate Ġval Ġdot Color Ġ= ĠColor . WHITE ĊĠĠĠ Ġprivate Ġval ĠborderColor Ġ= ĠColor . WHITE ĊĠĠĠ Ġprivate Ġval ĠborderWidth Ġ= Ġ 6 . 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġleft Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġtop Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġwidth Size Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġheight Size Ġ= Ġ 8 0 0 ĊĠĠĠ Ġprivate Ġvar Ġemoji X Ġ= Ġwidth Size Ġ/ Ġ 6 Ġ+ Ġ 2 0 ĊĠĠĠ Ġprivate Ġvar ĠdataSet : ĠList < Day Activity > Ġ= ĠlistOf () ĊĠĠĠ Ġprivate Ġvar Ġdot Positions : ĠMutable List < Dot Position > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġval Ġx Interval Ġ= Ġ( width Size Ġ- Ġemoji X ) Ġ/ Ġ 7 ĊĠĠĠ Ġprivate Ġval Ġy Interval Ġ= Ġ( height Size Ġ- Ġemoji X ) Ġ/ Ġ 4 . 6 f ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Background ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Lines ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Dot s ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Sm ile ys ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw X Descriptions ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġ// draw Graph ( canvas ) ĊĠĠĠĠĠĠĠ Ġ// draw Dot s ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdesired Size Ġ= Ġ 8 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġwidth Mode Ġ= ĠMeasure Spec . get Mode ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Mode Ġ= ĠMeasure Spec . get Mode ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Measure Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Measure Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĊĠĠĠĠĠĠĠ Ġwidth Size Ġ= Ġwhen Ġ( width Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . EX ACT LY Ġ-> Ġwidth Measure ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . AT _ MO ST Ġ-> ĠMath . min ( desired Size , Ġwidth Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . UNSPECIFIED Ġ-> Ġdesired Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdesired Size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġheight Size Ġ= Ġwhen Ġ( height Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . EX ACT LY Ġ-> Ġheight Measure ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . Measure Spec . AT _ MO ST Ġ-> ĠMath . min ( desired Size , Ġheight Measure ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . UNSPECIFIED Ġ-> Ġdesired Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdesired Size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( width Size , Ġheight Size ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġdraw Background ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠbackgroundColor ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL ĊĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect ( left . toInt (), Ġtop . toInt (), Ġwidth Size , Ġheight Size ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( left , Ġtop , Ġwidth Size . toFloat (), Ġheight Size . toFloat (), Ġpaint ) ĊĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠborderColor ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= ĠborderWidth ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Dot s ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= ĠdataSet . iterator () ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġvalue ) Ġin Ġiterator . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġheight Size Ġ- Ġ( emoji X Ġ+ Ġvalue . emoji . toFloat () Ġ* Ġy Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ( emoji X Ġ+ Ġi . toFloat () Ġ* Ġx Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdot Positions . add ( Dot Position ( x , Ġy )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Dot ( canvas , Ġx , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Dot ( canvas : ĠCanvas , Ġx : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġdot Color ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġ 1 0 . 0 f Ġ// todo : Ġpull Ġinto Ġconstant ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( x , Ġy , Ġradius , Ġpaint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Lines ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= ĠdataSet . iterator () ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġline Color ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġvalue ) Ġin Ġiterator . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< ĠdataSet . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Value Ġ= ĠdataSet [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġheight Size Ġ- Ġ( emoji X Ġ+ Ġvalue . emoji . toFloat () Ġ* Ġy Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ( emoji X Ġ+ Ġi . toFloat () Ġ* Ġx Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy 1 Ġ= Ġheight Size Ġ- Ġ( emoji X Ġ+ Ġnext Value . emoji . toFloat () Ġ* Ġy Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 1 Ġ= Ġ( emoji X Ġ+ Ġi . toFloat () Ġ* Ġx Interval ) Ġ+ Ġx Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( x , Ġy , Ġx 1 , Ġy 1 , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Not Ġdrawing Ġline Ġhere Ġ-> Ġi Ġ= Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Sm ile ys ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorrection Ġ= Ġ 4 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ 1 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġheight Size Ġ- Ġcorrection Ġ- Ġ( emoji X Ġ+ Ġi . toFloat () Ġ* Ġy Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Sm iley ( canvas , Ġi , Ġx , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Sm iley ( canvas : ĠCanvas , Ġtype : ĠInt , Ġx : Float , Ġy : Float ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠResources Compat . get Drawable ( context . resources , ĠR . drawable . un happy , Ġnull ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠResources Compat . get Drawable ( context . resources , ĠR . drawable . sad , Ġnull ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠResources Compat . get Drawable ( context . resources , ĠR . drawable . conf used , Ġnull ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠResources Compat . get Drawable ( context . resources , ĠR . drawable . happy , Ġnull ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> ĠResources Compat . get Drawable ( context . resources , ĠR . drawable . sm iling , Ġnull ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcontext . resources . get Drawable ( R . drawable . sad ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( drawable To Bitmap ( d ), Ġx , Ġy , Ġpaint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw X Descriptions ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġvalue ) Ġin ĠdataSet . iterator (). with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcorrection Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġemoji X Ġ- Ġcorrection Ġ+ Ġ( i . toFloat () Ġ* Ġx Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġheight Size Ġ- Ġ( emoji X Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Description ( canvas , Ġx , Ġy , Ġvalue . date . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Description ( canvas : ĠCanvas , Ġx : Float , Ġy : Float , Ġdate : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġdot Color ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġpaint . textAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠ Ġpaint . text Size Ġ= Ġ 3 0 f Ġ// todo : ĠHard coded Ġmagic Ġnumber ĊĊĠĠĠĠĠĠĠ Ġval Ġformatted Ġ= ĠTime Utils . format Date ( date ) ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( formatted , Ġx , Ġy , Ġpaint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Graph ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL _ AND _ ST RO KE ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġline Color ĊĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠPath () ĊĠĠĠĠĠĠĠ Ġpath . setFill Type ( Path . Fill Type . E VEN _ O DD ) ĊĠĠĠĠĠĠĠ Ġval ĠstartPosition Ġ= Ġdot Positions [ 0 ] ĊĠĠĠĠĠĠĠ Ġpath . moveTo ( start Position . x , ĠstartPosition . y ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( value Ġin Ġdot Positions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( value . x , Ġvalue . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpath . lineTo ( start Position . x , ĠstartPosition . y ) ĊĠĠĠĠĠĠĠ Ġpath . close () ĊĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġpaint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset DataSet ( set : ĠList < Day Activity >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Received Ġnew Ġdataset : Ġ${ set . size }") ĊĠĠĠĠĠĠĠ Ġthis . data Set Ġ= Ġset ĊĠĠĠĠĠĠĠ Ġthis . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdrawable To Bitmap ( drawable : ĠDrawable ): ĠBitmap Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġis ĠBitmap Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdrawable . bitmap ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap . create Bitmap ( drawable . intrinsic Width , Ġdrawable . intrinsic Height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bitmap ) ĊĠĠĠĠĠĠĠ Ġdrawable . setBounds ( 0 , Ġ 0 , Ġcanvas . width , Ġcanvas . height ) ĊĠĠĠĠĠĠĠ Ġdrawable . draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDot Position ( val Ġx : ĠFloat , Ġval Ġy : ĠFloat ) Ċ }