package Ġcom . visual izer . amplitude Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġjava . util .* Ċ import Ġkotlin . math . max ĊĊ Ċ class ĠAudio Record View Ġ: ĠView Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠAlign To ( var Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠC ENTER ( 1 ), ĊĠĠĠĠĠĠĠ ĠBOTTOM ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmax Report able Amp Ġ= Ġ 2 2 7 6 0 f Ġ// effective Ġsize , Ġ Ġmax Ġfft Ġ= Ġ 3 2 7 6 0 ĊĠĠĠ Ġprivate Ġval Ġun initialized Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġchunk Align To Ġ= ĠAlign To . CENTER ĊĊĠĠĠ Ġprivate Ġval Ġchunk Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġminor Tick Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġmajor Tick Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġtimestamp Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġvar Ġlast UpdateTime Ġ= Ġ 0 L ĊĊĠĠĠ Ġprivate Ġval Ġminor Tick Width Ġ= Ġ 1 . dp () ĊĠĠĠ Ġprivate Ġval Ġmajor Tick Width Ġ= Ġ 1 . dp () ĊĠĠĠ Ġprivate Ġval Ġminor Tick Height Ġ= Ġ 8 . dp () ĊĠĠĠ Ġprivate Ġval Ġmajor Tick Height Ġ= Ġ 8 . dp () ĊĠĠĠ Ġprivate Ġval Ġtimestamp Margin Ġ= Ġ 4 . dp () ĊĊĠĠĠ Ġprivate Ġvar Ġusage Width Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġchunk Height s Ġ= ĠArrayList < Float >() ĊĠĠĠ Ġprivate Ġvar Ġchunk Widths Ġ= ĠArrayList < Float >() ĊĠĠĠ Ġprivate Ġvar Ġtop Bottom Padding Ġ= Ġ 6 . dp () ĊĊĠĠĠ Ġvar Ġchunk Soft Transition Ġ= Ġfalse ĊĠĠĠ Ġvar Ġchunk Color Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Paint . color Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġchunk Width Ġ= Ġ 2 . dp () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Paint . stroke Width Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġchunk Space Ġ= Ġ 1 . dp () ĊĠĠĠ Ġvar Ġchunk Max Height Ġ= Ġun initialized ĊĠĠĠ Ġvar Ġchunk Min Height Ġ= Ġ 3 . dp () Ġ Ġ// Ġrecommended Ġsize Ġ> Ġ 1 0 Ġdp ĊĠĠĠ Ġvar Ġchunk Rounded C orners Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Paint . stroke Cap Ġ= ĠPaint . Cap . ROUND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Paint . stroke Cap Ġ= ĠPaint . Cap . B UT T ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġminor Tick Color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġminor Tick Paint . color Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġmajor Tick Color Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Tick Paint . color Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġtimestamp Color Ġ= ĠColor . GRAY ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Paint . color Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġtimestamp Size Ġ= Ġ 1 2 . dp () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Paint . text Size Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġtimestamp Type face Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Paint . type face Ġ= ĠResources Compat . getFont ( context , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġupdate Interval Ġ= Ġ 1 0 0 ĠĠĠĠĠĠ Ġ// ms ĊĠĠĠ Ġvar Ġduration Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ms ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrecreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġusage Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġchunk Widths . clear () ĊĠĠĠĠĠĠĠ Ġchunk Height s . clear () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( fft : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle New FFT ( fft ) ĊĠĠĠĠĠĠĠ Ġduration Ġ+= Ġupdate Interval ĊĠĠĠĠĠĠĠ Ġinvalidate () Ġ// Ġcall Ġto Ġthe Ġon Draw Ġfunction ĊĠĠĠĠĠĠĠ Ġlast UpdateTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Chunks ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw R ud der ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġchunk Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġminor Tick Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmajor Tick Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtimestamp Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġchunk Paint . stroke Width Ġ= Ġchunk Width ĊĠĠĠĠĠĠĠ Ġchunk Paint . color Ġ= Ġchunk Color ĊĠĠĠĠĠĠĠ Ġminor Tick Paint . color Ġ= Ġminor Tick Color ĊĠĠĠĠĠĠĠ Ġmajor Tick Paint . color Ġ= Ġmajor Tick Color ĊĠĠĠĠĠĠĠ Ġtimestamp Paint . color Ġ= Ġtimestamp Color ĊĠĠĠĠĠĠĠ Ġtimestamp Paint . text Size Ġ= Ġtimestamp Size ĊĊĠĠĠĠĠĠĠ Ġminor Tick Paint . stroke Width Ġ= Ġminor Tick Width ĊĠĠĠĠĠĠĠ Ġmajor Tick Paint . stroke Width Ġ= Ġmajor Tick Width ĊĠĠĠĠĠĠĠ Ġtimestamp Paint . textAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( attrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĠR . style able . Audio Record View , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Space Ġ= Ġget Dimension ( R . style able . Audio Record View _ chunk Space , Ġchunk Space ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Max Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension ( R . style able . Audio Record View _ chunk Max Height , Ġchunk Max Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Min Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension ( R . style able . Audio Record View _ chunk Min Height , Ġchunk Min Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Rounded C orners Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Boolean ( R . style able . Audio Record View _ chunk Rounded C orners , Ġchunk Rounded C orners ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Width Ġ= Ġget Dimension ( R . style able . Audio Record View _ chunk Width , Ġchunk Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Color Ġ= Ġget Color ( R . style able . Audio Record View _ chunk Color , Ġchunk Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Align To Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( getInt ( R . style able . Audio Record View _ chunk Align To , Ġchunk Align To . ordinal )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlign To . BOTTOM . value Ġ-> ĠAlign To . BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠAlign To . CENTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminor Tick Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Color ( R . style able . Audio Record View _ minor Tick Color , Ġminor Tick Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Tick Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Color ( R . style able . Audio Record View _ major Tick Color , Ġmajor Tick Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Color ( R . style able . Audio Record View _ timestamp Color , Ġtimestamp Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Size Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dimension ( R . style able . Audio Record View _ timestamp Size , Ġtimestamp Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Type face Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ResourceId ( R . style able . Audio Record View _ timestamp Type face , Ġtimestamp Type face ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Soft Transition Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Boolean ( R . style able . Audio Record View _ chunk Soft Transition , Ġchunk Soft Transition ) ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminor Tick Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Tick Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminor Tick Paint . stroke Width Ġ= Ġminor Tick Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmajor Tick Paint . stroke Width Ġ= Ġmajor Tick Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Paint . textAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle New FFT ( fft : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fft Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchunk Horizontal Scale Ġ= Ġchunk Width Ġ+ Ġchunk Space ĊĠĠĠĠĠĠĠ Ġval Ġmax Chunk Count Ġ= Ġwidth Ġ/ Ġchunk Horizontal Scale ĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Height s . isNotEmpty () Ġ&& Ġchunk Height s . size Ġ>= Ġmax Chunk Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Height s . remove At ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusage Width Ġ+= Ġchunk Horizontal Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Widths . add ( chunk Widths . size , Ġusage Width ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Max Height Ġ== Ġun initialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Max Height Ġ= Ġheight Ġ- Ġ( top Bottom Padding Ġ* Ġ 2 ) Ġ- Ġ 2 Ġ* Ġ( timestamp Size Ġ+ Ġ 3 Ġ* Ġtimestamp Margin Ġ+ Ġmajor Tick Height ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( chunk Max Height Ġ> Ġheight Ġ- Ġ( top Bottom Padding Ġ* Ġ 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Max Height Ġ= Ġheight Ġ- Ġ( top Bottom Padding Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvertical Draw Scale Ġ= Ġchunk Max Height Ġ- Ġchunk Min Height ĊĠĠĠĠĠĠĠ Ġif Ġ( vertical Draw Scale Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġmax Report able Amp Ġ/ Ġvertical Draw Scale ĊĠĠĠĠĠĠĠ Ġif Ġ( point Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġfft Point Ġ= Ġfft Ġ/ Ġpoint ĊĊĠĠĠĠĠĠĠ Ġif Ġ( chunk Soft Transition Ġ&& Ġchunk Height s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Time Interval Ġ= ĠSystem . currentTimeMillis () Ġ- Ġlast UpdateTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Factor Ġ= Ġcalculate Scale Factor ( update Time Interval ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev F ft Without Additional Size Ġ= Ġchunk Height s . last () Ġ- Ġchunk Min Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfft Point Ġ= Ġfft Point . soft Transition ( prev F ft Without Additional Size , Ġ 2 . 2 f , Ġscale Factor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfft Point Ġ+= Ġchunk Min Height ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fft Point Ġ> Ġchunk Max Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfft Point Ġ= Ġchunk Max Height ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( fft Point Ġ< Ġchunk Min Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfft Point Ġ= Ġchunk Min Height ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġchunk Height s . add ( chunk Height s . size , Ġfft Point ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Scale Factor ( update Time Interval : ĠLong ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( update Time Interval ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 .. 5 0 Ġ-> Ġ 1 . 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 5 0 .. 1 0 0 Ġ-> Ġ 2 . 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 0 0 .. 1 5 0 Ġ-> Ġ 2 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 0 0 .. 1 5 0 Ġ-> Ġ 3 . 4 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 1 5 0 .. 2 0 0 Ġ-> Ġ 4 . 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 0 0 .. 5 0 0 Ġ-> Ġ 4 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 5 . 4 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Chunks ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( chunk Align To ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlign To . BOTTOM Ġ-> Ġdraw Align Bottom ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdraw Align Center ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Align Center ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvertical Center Ġ= Ġheight Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchunk Height s . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk X Ġ= Ġchunk Widths [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġvertical Center Ġ- Ġchunk Height s [ i ] Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Y Ġ= Ġvertical Center Ġ+ Ġchunk Height s [ i ] Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( chunk X , Ġstart Y , Ġchunk X , Ġstop Y , Ġchunk Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Align Bottom ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchunk Height s . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk X Ġ= Ġchunk Widths [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġheight . toFloat () Ġ- Ġtop Bottom Padding ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Y Ġ= Ġstart Y Ġ- Ġchunk Height s [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( chunk X , Ġstart Y , Ġchunk X , Ġstop Y , Ġchunk Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw R ud der ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchunk Horizontal Scale Ġ= Ġchunk Width Ġ+ Ġchunk Space ĊĠĠĠĠĠĠĠ Ġval Ġmax Chunk Count Ġ= Ġ( width Ġ/ Ġchunk Horizontal Scale ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġmax Duration Ġ= Ġmax Chunk Count Ġ* Ġupdate Interval ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġmax ( 0 , Ġduration Ġ- Ġmax Duration ) ĊĠĠĠĠĠĠĠ Ġval Ġtick Start Ġ= Ġheight Ġ- Ġtimestamp Size Ġ- Ġ 2 Ġ* Ġtimestamp Margin Ġ- Ġmajor Tick Height ĊĠĠĠĠĠĠĠ Ġval Ġminor Tick End Ġ= Ġtick Start Ġ+ Ġminor Tick Height ĊĠĠĠĠĠĠĠ Ġval Ġmajor Tick End Ġ= Ġtick Start Ġ+ Ġmajor Tick Height ĊĠĠĠĠĠĠĠ Ġvar Ġtime Stamp Y Ġ= Ġheight Ġ- Ġtimestamp Margin ĊĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= Ġoffset ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmax Chunk Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Ġ% Ġ 2 0 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġi Ġ* Ġchunk Horizontal Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time Ġ% Ġ 1 0 0 0 Ġ== Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( x , Ġtick Start , Ġx , Ġmajor Tick End , Ġmajor Tick Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġformat Timestamp ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Width Ġ= Ġtimestamp Paint . measure Text ( timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ- Ġtext Width Ġ/ Ġ 2 Ġ> Ġ 0 Ġ&& Ġx Ġ+ Ġtext Width Ġ/ Ġ 2 Ġ< Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( timestamp , Ġx , Ġtime Stamp Y , Ġtimestamp Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( x , Ġtick Start , Ġx , Ġminor Tick End , Ġminor Tick Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ+= Ġupdate Interval ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Timestamp ( timestamp Ġ: ĠInt ) Ġ: ĠString { ĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġtimestamp Ġ/ Ġ 1 0 0 0 Ġ/ Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġtimestamp Ġ/ Ġ 1 0 0 0 Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġjava . lang . String . format ( Locale . US , Ġ"% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) ĊĊĠĠĠ Ġ} Ċ }