package Ġcom . de mon . change voice . record Ċ Ċ import Ġandroid . graphics . Color Filter Ċ import Ġandroid . graphics . Lighting Color Filter Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroid . widget . Seek Bar . On Seek Bar ChangeListener Ċ import Ġandroidx . fragment . app . Dialog Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġcom . de mon . change voice . R Ċ import Ġcom . de mon . change voice . databinding . Fragment Dialog Play Binding Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* Ġæ Ĵ Ń æĶ¾ å½ķ éŁ³ çļĦ ĠDialog Fragment Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠDe Mon Ġon Ġ 2 0 1 8 / 7 / 1 9 . Ċ Ġ*/ Ċ class ĠPlay Dialog Fragment Ġ: ĠDialog Fragment () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Dialog Play Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ binding !! ĊĠĠĠ Ġprivate Ġvar Ġm MediaPlayer : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Playing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar ĠfilePath : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Style ( STYLE _ NORMAL , ĠR . style . Custom Bottom Sheet Style ) ĊĠĠĠĠĠĠĠ ĠfilePath Ġ= Ġarguments ?. getString ( FILE _ PATH , Ġ"") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Dialog Play Binding . bind ( in flater . inflate ( R . layout . fragment _ dialog _ play , Ġcontainer , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ binding ?. root ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding . iv Close . setOnClickListener Ġ{ Ġdismiss () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfilter : ĠColor Filter Ġ= ĠLight ing Color Filter ( resources . getColor ( R . color . teal _ 7 0 0 ), Ġresources . getColor ( R . color . teal _ 7 0 0 )) ĊĠĠĠĠĠĠĠ Ġbinding . seek bar . progress Drawable . color Filter Ġ= Ġfilter ĊĠĠĠĠĠĠĠ Ġbinding . seek bar . thumb . color Filter Ġ= Ġfilter ĊĠĠĠĠĠĠĠ Ġbinding . seek bar . setOn Seek Bar ChangeListener ( object Ġ: ĠOn Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar , Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ!= Ġnull Ġ&& Ġfrom User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. seek To ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . remove Callbacks ( m Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( m MediaPlayer ?. current Position ?. to Long () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġ( TimeUnit . MILLISECONDS . to Seconds ( m MediaPlayer ?. current Position ?. to Long () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠTimeUnit . MIN UTES . to Seconds ( minutes )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Progress TextView . text Ġ= ĠString . format ("% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Seek Bar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m MediaPlayer Ġ== Ġnull Ġ&& Ġfrom User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare MediaPlayer From Point ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Seek Bar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . remove Callbacks ( m Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . remove Callbacks ( m Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. seek To ( seek Bar . progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( m MediaPlayer ?. current Position ?. to Long () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( m MediaPlayer ?. current Position ?. to Long () Ġ?: Ġ 0 ) Ġ- ĠTimeUnit . MIN UTES . to Seconds ( minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Progress TextView . text Ġ= ĠString . format ("% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Seek Bar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbinding . fab Play . setOnClickListener ( View . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Play ( is Playing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġ! is Playing ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġbinding . fileName TextView . text Ġ= Ġfile . name ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġstop Playing () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġstop Playing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Play ( is Playing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Playing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume Playing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Playing () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Playing () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . fab Play . setImage Resource ( R . drawable . base _ record _ pause ) ĊĠĠĠĠĠĠĠ Ġm MediaPlayer Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. set DataSource ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . seek bar . max Ġ= Ġm MediaPlayer ?. duration Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. setOn Prepared Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( m MediaPlayer ?. duration ?. to Long () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= ĠTimeUnit . MILLISECONDS . to Seconds ( m MediaPlayer ?. duration ?. to Long () Ġ?: Ġ 0 ) Ġ- ĠTimeUnit . MIN UTES . to Seconds ( minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . file Length TextView . text Ġ= ĠString . format ("% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" prepare () Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm MediaPlayer ?. setOn Completion Listener Ġ{ Ġstop Playing () Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Seek Bar () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare MediaPlayer From Point ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm MediaPlayer Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. set DataSource ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . seek bar . max Ġ= Ġm MediaPlayer ?. duration Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. seek To ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. setOn Completion Listener Ġ{ Ġstop Playing () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" prepare () Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// keep Ġscreen Ġon Ġwhile Ġplaying Ġaudio ĊĠĠĠĠĠĠĠ Ġactivity ?. window ?. add Flags ( WindowManager . LayoutParams . FLAG _ KEEP _ SCREEN _ ON ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpause Playing () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fab Play . setImage Resource ( R . drawable . base _ record _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . remove Callbacks ( m Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. pause () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresume Playing () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fab Play . setImage Resource ( R . drawable . base _ record _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . remove Callbacks ( m Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Seek Bar () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Playing () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fab Play . setImage Resource ( R . drawable . base _ record _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . remove Callbacks ( m Runnable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer ?. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . seek bar . progress Ġ= Ġbinding . seek bar . max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġ! is Playing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Progress TextView . text Ġ= Ġbinding . file Length TextView . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . seek bar . progress Ġ= Ġbinding . seek bar . max ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Runnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m MediaPlayer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmCurrent Position Ġ= Ġm MediaPlayer ?. current Position Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . seek bar . progress Ġ= ĠmCurrent Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= ĠTimeUnit . MILLISECONDS . to Minutes ( m Current Position . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġ( TimeUnit . MILLISECONDS . to Seconds ( m Current Position . to Long ()) Ġ- ĠTimeUnit . MIN UTES . to Seconds ( minutes )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . current Progress TextView . text Ġ= ĠString . format ("% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Seek Bar () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Seek Bar () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . root . post Delayed ( m Runnable , Ġ 1 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġm MediaPlayer ?. release () ĊĠĠĠĠĠĠĠ Ġm MediaPlayer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Allow ing State Loss ( manager : ĠFragment Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isVisible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . beginTransaction (). add ( this , Ġtag ). commit Allow ing State Loss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Play Dialog Fragment " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFILE _ PATH Ġ= Ġ" FilePath " ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( filePath : ĠString ): ĠPlay Dialog Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= ĠPlay Dialog Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb . putString ( FILE _ PATH , ĠfilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . arguments Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }