package Ġcom . sup . dev . android . views . views ĊĊ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . ImageView Ċ import Ġcom . sup . dev . android . R Ċ import Ġcom . sup . dev . android . app . Sup Android Ċ import Ġcom . sup . dev . android . tools . Tools Permission Ċ import Ġcom . sup . dev . android . tools . Tools Toast Ċ import Ġcom . sup . dev . android . tools . Tools View Ċ import Ġcom . sup . dev . android . utils . Utils Voice Recorder Ċ import Ġcom . sup . dev . android . views . views . View Icon Ċ import Ġcom . sup . dev . java . tools . Tools Math Ċ import Ġcom . sup . dev . java . tools . Tools Threads Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ class ĠView Voice Record Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull ) Ġ: ĠFrame Layout ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġvar Ġmax Recording Time Ms Ġ= Ġ- 1 L ĊĠĠĠ Ġvar Ġon Recording Start : Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġvar Ġon Recording Stop : Ġ( ByteArray ?) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġvar Ġon Recording Progress : Ġ( Long ) Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġval Ġview : ĠView Ġ= ĠTools View . inflate ( R . layout . view _ voice _ recorder ) ĊĠĠĠ Ġval Ġv Icon Container : ĠViewGroup Ġ= Ġview . findViewById ( R . id . v Icon Container ) ĊĠĠĠ Ġval Ġv Icon : ĠImageView Ġ= Ġview . findViewById ( R . id . v Icon ) ĊĠĠĠ Ġval Ġv Icon Big : ĠView Icon Ġ= Ġview . findViewById ( R . id . v Icon Big ) ĊĠĠĠ Ġval Ġv Icon Stop : ĠView Icon Ġ= Ġview . findViewById ( R . id . v Icon Stop ) ĊĠĠĠ Ġval Ġv Icon Lock : ĠView Icon Ġ= Ġview . findViewById ( R . id . v Icon Lock ) ĊĊĠĠĠ Ġval Ġvoice Recorder Ġ= ĠUtils Voice Recorder () ĊĊĠĠĠ Ġvar Ġrecording StartTime Ġ= Ġ 0 L ĊĠĠĠ Ġvar Ġis Recording Mode Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Locked Ġ= Ġfalse ĊĠĠĠ Ġvar Ġcurrent Selected Icon : ĠView Icon Ġ= Ġv Icon Big ĊĠĠĠ Ġvar Ġdrop Next Action Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd View ( view ) ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĊĠĠĠĠĠĠĠ Ġv Icon Big . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġv Icon Stop . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġv Icon Lock . is Clickable Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġstop Recording () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Recording Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Recording () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Tools Permission . has Micro phone Permission ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecording StartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Recording Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Icon Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Icon . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Icon Lock . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Icon Big . setImage Resource ( R . drawable . ic _ mic _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Selected Icon Ġ= Ġv Icon Big ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Locked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvoice Recorder . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Recording Start . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTools Permission . request Micro phone Permission ({ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTools Toast . show ( Sup Android . TEXT _ ERROR _ PERMISSION _ MIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Recording () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Recording Mode Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġv Icon Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġv Icon . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġvoice Recorder . stop () ĊĠĠĠĠĠĠĠ Ġon Recording Stop . invoke ( null ) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Finish Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġvoice Recorder . getAs Array () ĊĠĠĠĠĠĠĠ Ġstop Recording () ĊĠĠĠĠĠĠĠ Ġis Locked Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġon Recording Stop . invoke ( array ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlock () Ġ{ ĊĠĠĠĠĠĠĠ Ġdrop Next Action Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Locked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġv Icon Lock . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġv Icon Big . setImage Resource ( R . drawable . ic _ send _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġupdate Circ les ( v Icon Big . x Ġ+ Ġv Icon Big . width Ġ/ Ġ 2 , Ġv Icon Big . y Ġ+ Ġv Icon Big . height Ġ/ Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Stop Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Recording () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull ) Ġreturn Ġsuper . on Touch Event ( event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Recording Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Tools Math . collision Rect And Point ( event . x , Ġevent . y , Ġv Icon . x , Ġv Icon . y , Ġv Icon . x Ġ+ Ġv Icon . width , Ġv Icon . y Ġ+ Ġv Icon . height )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Recording () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTools Threads . main ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Circ les ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Recording Mode ) Ġupdate Circ les ( event . x , Ġevent . y ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( drop Next Action ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Next Action Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Recording Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Selected Icon Ġ== Ġv Icon Big ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ- Ġrecording StartTime Ġ< Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Finish Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current Selected Icon Ġ== Ġv Icon Stop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current Selected Icon Ġ== Ġv Icon Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Next Action Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) Ġ|| Ġis Recording Mode ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Circ les ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġv Icon Big . x Ġ+ Ġv Icon Big . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġv Icon Big . y Ġ+ Ġv Icon Big . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġv Icon Stop . x Ġ+ Ġv Icon Stop . width ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġv Icon Lock . y Ġ+ Ġv Icon Lock . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġr Ġ- Ġl ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġb Ġ- Ġt ĊĊĠĠĠĠĠĠĠ Ġvar Ġbig Padding Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġstop Padding Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġlock Padding Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġbig Padding Ġ= Ġmax ( big Padding , Ġv Icon Big . width Ġ/ Ġ 4 f Ġ- Ġ( v Icon Big . width Ġ/ Ġ 4 f Ġ* Ġ( x Ġ- Ġl ) Ġ/ Ġw )) ĊĠĠĠĠĠĠĠ Ġstop Padding Ġ= Ġmax ( stop Padding , Ġv Icon Stop . width Ġ/ Ġ 4 f Ġ* Ġ( x Ġ- Ġl ) Ġ/ Ġw ) ĊĠĠĠĠĠĠĠ Ġlock Padding Ġ= Ġmax ( lock Padding , Ġv Icon Lock . width Ġ/ Ġ 4 f Ġ- Ġ( v Icon Lock . width Ġ/ Ġ 4 f Ġ* Ġ( x Ġ- Ġl ) Ġ/ Ġw )) ĊĊĠĠĠĠĠĠĠ Ġlock Padding Ġ= Ġmax ( lock Padding , Ġv Icon Lock . height Ġ/ Ġ 4 f Ġ* Ġ( y Ġ- Ġt ) Ġ/ Ġh ) ĊĠĠĠĠĠĠĠ Ġbig Padding Ġ= Ġmax ( big Padding , Ġv Icon Big . height Ġ/ Ġ 4 f Ġ- Ġ( v Icon Big . height Ġ/ Ġ 4 f Ġ* Ġ( y Ġ- Ġt ) Ġ/ Ġh )) ĊĠĠĠĠĠĠĠ Ġstop Padding Ġ= Ġmax ( stop Padding , Ġv Icon Stop . height Ġ/ Ġ 4 f Ġ- Ġ( v Icon Stop . height Ġ/ Ġ 4 f Ġ* Ġ( y Ġ- Ġt ) Ġ/ Ġh )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( big Padding Ġ< Ġstop Padding Ġ&& Ġbig Padding Ġ< Ġlock Padding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Selected Icon Ġ= Ġv Icon Big ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( lock Padding Ġ< Ġbig Padding Ġ&& Ġlock Padding Ġ< Ġstop Padding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Selected Icon Ġ= Ġv Icon Lock ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Selected Icon Ġ= Ġv Icon Stop ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Locked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbig Padding Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Padding Ġ= Ġv Icon Stop . width Ġ/ Ġ 4 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġv Icon Big . set Padding Circle ( max ( 0 f , Ġmin ( v Icon Big . height Ġ/ Ġ 4 f , Ġbig Padding ))) ĊĠĠĠĠĠĠĠ Ġv Icon Stop . set Padding Circle ( max ( 0 f , Ġmin ( v Icon Stop . height Ġ/ Ġ 4 f , Ġstop Padding ))) ĊĠĠĠĠĠĠĠ Ġv Icon Lock . set Padding Circle ( max ( 0 f , Ġmin ( v Icon Lock . height Ġ/ Ġ 4 f , Ġlock Padding ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠSystem . currentTimeMillis () Ġ- Ġrecording StartTime ĊĠĠĠĠĠĠĠ Ġon Recording Progress . invoke ( time ) ĊĠĠĠĠĠĠĠ Ġif Ġ( time Ġ>= Ġmax Recording Time Ms ) Ġon Finish Clicked () ĊĠĠĠ Ġ} Ċ Ċ }