/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 ĠNew ĠVector ĠLtd Ċ Ġ* Ċ Ġ* Ġ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 Ġim . vector . app . features . voice Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġim . vector . app . R Ċ import Ġkotlin . math . max Ċ import Ġkotlin . random . Random Ċ Ċ class ĠAudio Wave form View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠAlignment ( var Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠC ENTER ( 0 ), ĊĠĠĠĠĠĠĠ ĠBOTTOM ( 1 ), ĊĠĠĠĠĠĠĠ ĠTOP ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠFlow ( var Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠL TR ( 0 ), ĊĠĠĠĠĠĠĠ ĠRTL ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠFFT ( val Ġvalue : ĠFloat , Ġvar Ġcolor : ĠInt ) ĊĊĠĠĠ Ġprivate Ġfun ĠInt . dp () Ġ= Ġthis Ġ* ĠResources . getSystem (). display Metrics . density ĊĊĠĠĠ Ġ// ĠConfiguration Ġfields ĊĠĠĠ Ġprivate Ġvar Ġalignment Ġ= ĠAlignment . CENTER ĊĠĠĠ Ġprivate Ġvar Ġflow Ġ= ĠFlow . LTR ĊĠĠĠ Ġprivate Ġvar Ġvertical Padding Ġ= Ġ 4 . dp () ĊĠĠĠ Ġprivate Ġvar Ġhorizontal Padding Ġ= Ġ 4 . dp () ĊĠĠĠ Ġprivate Ġvar Ġbar Width Ġ= Ġ 2 . dp () ĊĠĠĠ Ġprivate Ġvar Ġbar Space Ġ= Ġ 1 . dp () ĊĠĠĠ Ġprivate Ġvar Ġbar Min Height Ġ= Ġ 1 . dp () ĊĠĠĠ Ġprivate Ġvar Ġis Bar Rounded Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġraw F ft List Ġ= Ġmutable ListOf < FFT >() ĊĠĠĠ Ġprivate Ġvar Ġvisible Bar Height s Ġ= Ġmutable ListOf < FFT >() ĊĊĠĠĠ Ġprivate Ġval Ġbar Paint Ġ= ĠPaint () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġattrs ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. theme ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Audio Wave form View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalignment Ġ= ĠAlignment . values (). find Ġ{ Ġit . value Ġ== Ġget Int ( R . style able . Audio Wave form View _ alignment , Ġalignment . value ) Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Ġ= ĠFlow . values (). find Ġ{ Ġit . value Ġ== Ġget Int ( R . style able . Audio Wave form View _ flow , Ġalignment . value ) Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Padding Ġ= Ġget Dimension ( R . style able . Audio Wave form View _ vertical Padding , Ġvertical Padding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Padding Ġ= Ġget Dimension ( R . style able . Audio Wave form View _ horizontal Padding , Ġhorizontal Padding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar Width Ġ= Ġget Dimension ( R . style able . Audio Wave form View _ bar Width , Ġbar Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar Space Ġ= Ġget Dimension ( R . style able . Audio Wave form View _ bar Space , Ġbar Space ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar Min Height Ġ= Ġget Dimension ( R . style able . Audio Wave form View _ bar Min Height , Ġbar Min Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Bar Rounded Ġ= Ġget Boolean ( R . style able . Audio Wave form View _ is Bar Rounded , Ġis Bar Rounded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġre cycle () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar Paint . stroke Width Ġ= Ġbar Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar Paint . stroke Cap Ġ= Ġif Ġ( is Bar Rounded ) ĠPaint . Cap . ROUND Ġelse ĠPaint . Cap . B UT T ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinitialize ( fft List : ĠList < FFT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle New F ft List ( fft List ) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( fft : ĠFFT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle New F ft List ( listOf ( fft )) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsummarize () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( raw F ft List . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Visible Bar Count Ġ= ĠgetMax Visible Bar Count () ĊĠĠĠĠĠĠĠ Ġval Ġsummar ized F ft List Ġ= Ġraw F ft List . sum mar ize ( max Visible Bar Count ) ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġhandle New F ft List ( sum mar ized F ft List ) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Colors ( limit Percentage : ĠFloat , Ġcolor Before : ĠInt , Ġcolor After : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġvisible Bar Height s . size ĊĠĠĠĠĠĠĠ Ġval Ġlimit Index Ġ= Ġ( size Ġ* Ġlimit Percentage ). toInt () ĊĠĠĠĠĠĠĠ Ġvisible Bar Height s . forEach Indexed Ġ{ Ġindex , Ġfft Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfft . color Ġ= Ġif Ġ( index Ġ< Ġlimit Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Before ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor After ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġraw F ft List . clear () ĊĠĠĠĠĠĠĠ Ġvisible Bar Height s . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < FFT >. sum mar ize ( target : ĠInt ): ĠList < FFT > Ġ{ ĊĠĠĠĠĠĠĠ Ġflow Ġ= ĠFlow . LTR ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < FFT >() ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing ItemCount Ġ= Ġtarget Ġ- Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( missing ItemCount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠRandom . nextInt ( result . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( index , Ġresult [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Ġ= Ġ( size . toDouble () Ġ- Ġ 1 ) Ġ/ Ġ( target Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( get ( index . toInt ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle New F ft List ( fft List : ĠList < FFT >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Visible Bar Count Ġ= ĠgetMax Visible Bar Count () ĊĊĠĠĠĠĠĠĠ Ġfft List . forEach Ġ{ Ġfft Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw F ft List . add ( fft ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbar Height Ġ= Ġmax ( fft . value Ġ/ ĠMAX _ FFT Ġ* Ġ( height Ġ- Ġvertical Padding Ġ* Ġ 2 ), Ġbar Min Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Bar Height s . add ( FFT ( bar Height , Ġfft . color )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visible Bar Height s . size Ġ> Ġmax Visible Bar Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Bar Height s Ġ= Ġvisible Bar Height s . take Last ( max Visible Bar Count ). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetMax Visible Bar Count () Ġ= Ġ(( width Ġ- Ġhorizontal Padding Ġ* Ġ 2 ) Ġ/ Ġ( bar Width Ġ+ Ġbar Space )). toInt () ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Bars ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent X Ġ= Ġhorizontal Padding ĊĠĠĠĠĠĠĠ Ġval Ġflow able Bar Height s Ġ= Ġif Ġ( flow Ġ== ĠFlow . LTR ) Ġvisible Bar Height s Ġelse Ġvisible Bar Height s . reversed () ĊĊĠĠĠĠĠĠĠ Ġflow able Bar Height s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbar Paint . color Ġ= Ġit . color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( alignment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlignment . BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġheight Ġ- Ġvertical Padding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Y Ġ= Ġstart Y Ġ- Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( current X , Ġstart Y , Ġcurrent X , Ġstop Y , Ġbar Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlignment . CENTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġ( height Ġ- Ġit . value ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Y Ġ= Ġstart Y Ġ+ Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( current X , Ġstart Y , Ġcurrent X , Ġstop Y , Ġbar Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlignment . TOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġvertical Padding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstop Y Ġ= Ġstart Y Ġ+ Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( current X , Ġstart Y , Ġcurrent X , Ġstop Y , Ġbar Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent X Ġ+= Ġbar Width Ġ+ Ġbar Space ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Bars ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ FFT Ġ= Ġ 3 2 7 6 0 ĊĠĠĠ Ġ} Ċ } Ċ