package Ġcom . m ilestones ys . mobile sdk . aud ios ample . ui . view Ċ Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġcom . google . android . ex op layer 2 .* Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . google . android . material . transition . platform . Material Container Transform Ċ import Ġcom . google . android . material . transition . platform . Material Fade Through Ċ import Ġcom . m ilestones ys . mobile sdk . aud ios ample . R Ċ import Ġcom . m ilestones ys . mobile sdk . aud ios ample . databinding . Fragment Camera Details Binding Ċ import Ġcom . m ilestones ys . mobile sdk . aud ios ample . ui . view model . Cam eras ViewModel Ċ import Ġcom . m ilestones ys . mobile sdk . aud ios ample . utils . Data Status ĊĊ Ċ class ĠCamera Details Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġ// ĠThis Ġproperty Ġis Ġonly Ġvalid Ġbetween ĠonCreate View Ġand Ġon Destroy View . ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment Camera Details Binding ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġaudio On Drawable : ĠDrawable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Off Drawable : ĠDrawable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbutton Play Text : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbutton Stop Text : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġcameras ViewModel : ĠCam eras ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠEx o Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Playing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġplaying Item : ĠMedia Item ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġplayer Listener : ĠPlayer . Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġexit Transition Ġ= ĠMaterial Fade Through () ĊĠĠĠĠĠĠĠ Ġshared Element Enter Transition Ġ= ĠMaterial Container Transform () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment Camera Details Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġsetup UI () ĊĠĠĠĠĠĠĠ Ġsetup Observer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSimple Exo Player . Builder ( require Context ()). build () ĊĠĠĠĠĠĠĠ Ġplayer ?. play When Ready Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġplayer Listener Ġ= Ġobject Ġ: ĠPlayer . Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Is Playing Changed ( is Playing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Is Playing Changed ( is Playing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable UI ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠPlay back Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Player Error ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . error _ play _ audio ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable UI ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplayer ?. addListener ( player Listener !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. release () ĊĠĠĠĠĠĠĠ Ġplayer Listener ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. remove Listener ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplayer Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġplayer Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Current Item () Ġ{ ĊĠĠĠĠĠĠĠ Ġplaying Item ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. set Media Item ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. prepare () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĊĠĠĠĠĠĠĠ Ġinitialize Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Requested () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Audio Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Requested () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Play Requested () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġ! is Playing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Play Requested () Ġ{ ĊĠĠĠĠĠĠĠ Ġdisable UI () ĊĊĠĠĠĠĠĠĠ Ġcameras ViewModel . play Audio () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Stop Requested () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. stop () ĊĠĠĠĠĠĠĠ Ġcameras ViewModel . stop Audio () ĊĊĠĠĠĠĠĠĠ Ġenable UI ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . progress Indicator . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġbinding . imageView Speaker . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġbinding . button Play Audio . isEnabled Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable UI ( is Playing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . progress Indicator . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġbinding . imageView Speaker . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġbinding . button Play Audio . isEnabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . button Play Audio . text Ġ= Ġbutton Stop Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . imageView Speaker . setImage Drawable ( audio On Drawable ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . button Play Audio . text Ġ= Ġbutton Play Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . imageView Speaker . setImage Drawable ( audio Off Drawable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . button Play Audio . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Audio Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaudio On Drawable Ġ= ĠResources Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). resources , ĠR . drawable . ic _ all _ sources , Ġrequire Context (). theme ) ĊĊĠĠĠĠĠĠĠ Ġaudio Off Drawable Ġ= ĠResources Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). resources , ĠR . drawable . ic _ mute , Ġrequire Context (). theme ) ĊĊĠĠĠĠĠĠĠ Ġbutton Play Text Ġ= ĠgetString ( R . string . button _ play ) ĊĠĠĠĠĠĠĠ Ġbutton Stop Text Ġ= ĠgetString ( R . string . button _ stop ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġcameras ViewModel . selected Camera . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . textView Camera Name . text Ġ= Ġit . camera Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . textView Mic Name . text Ġ= Ġit . mic Name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . mic Live Audio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . button Play Audio . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . error _ play _ not _ supported ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġcameras ViewModel . audio Url . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Status . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplaying Item Ġ= ĠMedia Item . from Uri ( it . data . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Current Item () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Status . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ-> ĠSn ackbar . make ( v , Ġit . message !! , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Requested () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ }