package Ġcom . blue hub . fast mixer . common . views Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Horizontal ScrollView Ċ import Ġandroid . widget . PopupMenu Ċ import Ġandroidx . appcompat . content . res . AppCompat Resources Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . blue hub . fast mixer . R Ċ import Ġcom . blue hub . fast mixer . common . models .* Ċ import Ġcom . blue hub . fast mixer . databinding . File Wave View Widget Binding Ċ import Ġcom . blue hub . fast mixer . screens . mix ing . Audio File Event Listeners Ċ import Ġcom . blue hub . fast mixer . screens . mix ing . File Wave View Store Ċ import Ġio . reactivex . rx java 3 . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . rx java 3 . subjects . Behavior Subject Ċ import Ġkotlinx . android . synt hetic . main . file _ wave _ view _ widget . view .* Ċ import Ġkotlinx . android . synt hetic . main . view _ loading . view .* Ċ import Ġjava . util .* Ċ Ċ class ĠFile Wave View Widget ( context : ĠContext , Ġattribute Set : ĠAttributeSet ?) ĊĠĠĠ Ġ: ĠConstraint Layout ( context , Ġattribute Set ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Audio File Ui State : ĠBehavior Subject < Audio File Ui State > Ġ= ĠBehavior Subject . create () ĊĠĠĠ Ġprivate Ġval Ġm Audio File Event Listeners : ĠBehavior Subject < Audio File Event Listeners > Ġ= ĠBehavior Subject . create () ĊĠĠĠ Ġprivate Ġval Ġm File Wave View Store : ĠBehavior Subject < File Wave View Store > Ġ= ĠBehavior Subject . create () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmenu : ĠPopup Menu ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFile Wave View Widget Binding ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm File Wave View Scroll : ĠHorizontal ScrollView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Horizontal ScrollBar : ĠCustom Horizontal ScrollBar ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm File Wave View : ĠFile Wave View ĊĊĠĠĠ Ġprivate Ġval Ġon MenuItem Click Ġ= Ġ{ Ġmenu Item : ĠMenuItem Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen ( menuItem . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . gain Adjustment Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . audio View Action LiveData . value Ġ= ĠAudio View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAudio View ActionType . GAIN _ ADJ UST MENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġm Audio File Ui State . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . segment Adjustment Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . audio View Action LiveData . value Ġ= ĠAudio View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAudio View ActionType . SEGMENT _ ADJ UST MENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġm Audio File Ui State . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . shift Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . audio View Action LiveData . value Ġ= ĠAudio View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAudio View ActionType . SHIFT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġm Audio File Ui State . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . cut Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . audio View Action LiveData . value Ġ= ĠAudio View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAudio View ActionType . CUT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġm Audio File Ui State . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . copy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . audio View Action LiveData . value Ġ= ĠAudio View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAudio View ActionType . COPY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġm Audio File Ui State . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . mute Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . audio View Action LiveData . value Ġ= ĠAudio View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAudio View ActionType . M UTE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġm Audio File Ui State . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . paste Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . audio View Action LiveData . value Ġ= ĠAudio View Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAudio View ActionType . P AST E , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State Ġ= Ġm Audio File Ui State . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġslide Left Timer : ĠTimer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġslide Right Timer : ĠTimer ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Observer s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Audio File Ui State ( audio File Ui State : ĠAudio File Ui State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Audio File Ui State . hasValue () Ġ|| Ġm Audio File Ui State . value . path Ġ!= Ġaudio File Ui State . path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio File Ui State . onNext ( audio File Ui State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Audio File Event Listeners ( audio File Event Listeners : ĠAudio File Event Listeners ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Audio File Event Listeners . hasValue ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio File Event Listeners . onNext ( audio File Event Listeners ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset File Wave View Store ( file Wave View Store : ĠFile Wave View Store ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m File Wave View Store . hasValue ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . onNext ( file Wave View Store ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio File Ui State . subscribe Ġ{ Ġcheck And Render View () Ġ} ĊĠĠĠĠĠĠĠ Ġm Audio File Event Listeners . subscribe Ġ{ Ġcheck And Render View () Ġ} ĊĠĠĠĠĠĠĠ Ġm File Wave View Store . subscribe Ġ{ Ġcheck And Render View () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Store Observer s () Ġ{ ĊĠĠĠĠĠĠĠ Ġm File Wave View Store . value . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġis Playing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio File Ui State . value . is Playing . map Ġ{ Ġui State Is Playing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ== Ġui State Is Playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġis Playing Enabled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Group Playing Observable . map Ġ{ Ġis Group Playing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Enabled Ġ&& Ġ! is Group Playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Schedulers . main Thread () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . wave Play Pause . isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Any Playing Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu . getItem ( 0 ). isEnabled Ġ= Ġ! it ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu . getItem ( 2 ). isEnabled Ġ= Ġ! it ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Paste Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu . getItem ( 6 ). isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Ui State Observer s () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġm Audio File Ui State . value . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . wave Play Pause . setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( context , ĠR . drawable . pause _ button ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . wave Play Pause . setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( context , ĠR . drawable . play _ button ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Level ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Scroll . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Scroll . scrollTo ( 0 , Ġm File Wave View Scroll . top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Segment Selector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toggle Segment Selector . background Tint List Ġ= ĠAppCompat Resources . getColor State List ( context , ĠR . color . gray _ 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toggle Segment Selector . background Tint List Ġ= ĠColor State List ( array Of < IntArray >(), ĠInt Array ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Slider Position Ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . play Head Value . text Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Segment Selector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu . getItem ( 1 ). isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu . getItem ( 4 ). isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Segment Selector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġsegment Selector Shown Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Start Sample . map Ġ{ Ġstart Sample Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( segment Selector Shown , Ġstart Sample . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġdata Pair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment End Sample . map Ġ{ Ġend Sample Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( data Pair . first , Ġdata Pair . second , Ġend Sample . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġ( segment Selector Shown , Ġstart Sample , Ġend Sample ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( segment Selector Shown Ġ&& Ġstart Sample Ġ!= Ġnull Ġ&& Ġend Sample Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . set Source Bounds ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . reset Source Bounds ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Segment Selector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġsegment Selector Shown Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing . map Ġ{ Ġis Playing Flag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsegment Selector Shown Ġ&& Ġ! is Playing Flag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Store . value . is Group Playing Observable . map Ġ{ Ġis Group Playing Flag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ&& Ġ! is Group Playing Flag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: menu . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu . getItem ( 3 ). isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu . getItem ( 5 ). isEnabled Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpb Loading . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpb Loading . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġprivate Ġfun Ġcheck And Render View () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Audio File Ui State . hasValue () Ġ&& Ġm Audio File Event Listeners . hasValue () Ġ&& Ġm File Wave View Store . hasValue ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwave View Ev Listeners Ġ= ĠFile Wave View Event Listeners ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: toggle Drop Up Menu , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: wave View Zoom In , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: wave View Zoom Out , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: wave View Delete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: wave View Toggle Play , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: toggle Segment Selector ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove All Views () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġcontext . getSystem Service ( Context . LAYOUT _ IN FL ATER _ SERVICE ) Ġas ĠLayoutInflater ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFile Wave View Widget Binding . inflate ( in flater , Ġthis , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave View Event Listeners Ġ= Ġwave View Ev Listeners ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Wave View ScrollBar . setHorizontal ScrollView ( file Wave View Scroll ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Wave View ScrollBar . set Control led View ( file Wave View ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave View Slide Left . setOn Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Left Slider Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave View Slide Right . setOn Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Right Slider Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . file Wave View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio File Ui State ( m Audio File Ui State . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Samples Reader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Audio File Event Listeners . value . read Samples Callback With Index ( m Audio File Ui State . value . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset File Wave View Store ( m File Wave View Store . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Scroll Ġ= Ġbinding . file Wave View Scroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Horizontal ScrollBar Ġ= Ġbinding . file Wave View ScrollBar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm File Wave View Ġ= Ġm File Wave View Scroll . file Wave View ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Store Observer s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Ui State Observer s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Ġ= ĠPopup Menu ( context , Ġbinding . dropdown Menu Trigger ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . menu Inflater . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . menu . wave view _ drop _ up _ menu , Ġmenu . menu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . setOn MenuItem ClickListener ( on MenuItem Click ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwave View Toggle Play () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio File Event Listeners . value . toggle Play Callback ( m Audio File Ui State . value . path ) ĊĠĠĠĠĠĠĠ Ġm File Wave View Store . value . toggle Play Flag ( m Audio File Ui State . value . path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwave View Delete () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio File Event Listeners . value . delete File Callback ( m Audio File Ui State . value . path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwave View Zoom In () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . file Wave View . zoom In () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwave View Zoom Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . file Wave View . zoom Out () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Segment Selector () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio File Ui State . value . show Segment Selector . onNext ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! m Audio File Ui State . value . show Segment Selector . value ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Drop Up Menu () Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Left Slider Touch Event ( event : ĠMotion Event ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġsetup Left Slider Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġstop Left Slider Timer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Right Slider Touch Event ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġsetup Right Slider Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġstop Right Slider Timer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Left Slider Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġslide Left Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠ Ġslide Left Timer ?. schedule ( object : ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Horizontal ScrollBar . perform Scroll By Width Fraction ( Scroll Direction . LEFT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Left Slider Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 0 , Ġ 3 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Left Slider Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġslide Left Timer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslide Left Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Right Slider Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġslide Right Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠ Ġslide Right Timer ?. schedule ( object : ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Horizontal ScrollBar . perform Scroll By Width Fraction ( Scroll Direction . RIGHT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Right Slider Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 0 , Ġ 3 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Right Slider Timer () Ġ{ ĊĠĠĠĠĠĠĠ Ġslide Right Timer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslide Right Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFile Wave View Event Listeners ( ĊĠĠĠ Ġval Ġtoggle Drop Up Menu : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġwave View Zoom In : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġwave View Zoom Out : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġwave View Delete : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġwave View Toggle Play : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġtoggle Segment Selector : Ġ() Ġ-> ĠUnit Ċ ) Ċ