package Ġcom . lag rad ost . cloud stream 3 . utils Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . media . Audio Focus Request Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Network Capabilities Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Media Store Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . google . android . gms . cast . framework . Cast Context Ċ import Ġcom . google . android . gms . cast . framework . Cast State Ċ import Ġcom . google . android . gms . common . Connection Result Ċ import Ġcom . google . android . gms . common . Google Api Availability Ċ import Ġcom . google . android . gms . common . wrappers . Wrappers Ċ import Ġcom . lag rad ost . cloud stream 3 . R Ċ import Ġcom . lag rad ost . cloud stream 3 . Search Response Ċ import Ġcom . lag rad ost . cloud stream 3 . ui . result . Result Fragment Ċ import Ġcom . lag rad ost . cloud stream 3 . utils . UI Helper . navigate Ċ Ċ object ĠApp Utils Ġ{ ĊĠĠĠ Ġfun Ġget Video Content Uri ( context : ĠContext , Ġvideo FilePath : ĠString ): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcontext . content Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . EXTERNAL _ CONTENT _ URI , ĠarrayOf ( Media Store . Video . Media ._ ID ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . DATA Ġ+ Ġ" =? Ġ", ĠarrayOf ( video FilePath ), Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cursor Ġ!= Ġnull Ġ&& Ġcursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( Media Store . Media Columns ._ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . with App ended Path ( Media Store . Video . Media . EXTERNAL _ CONTENT _ URI , Ġ"" Ġ+ Ġid ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Media Store . Video . Media . DATA , Ġvideo FilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . EXTERNAL _ CONTENT _ URI , Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** | ĠS 1 : E 2 ĠHello ĠWorld ĊĠĠĠĠ Ġ* Ġ| ĠEp isode Ġ 2 . ĠHello Ġworld ĊĠĠĠĠ Ġ* Ġ| ĠHello ĠWorld ĊĠĠĠĠ Ġ* Ġ| ĠSe ason Ġ 1 Ġ- ĠEp isode Ġ 2 ĊĠĠĠĠ Ġ* Ġ| ĠEp isode Ġ 2 ĊĠĠĠĠ Ġ* Ġ**/ ĊĠĠĠ Ġfun ĠContext . getName Full ( name : ĠString ?, Ġepisode : ĠInt ?, Ġseason : ĠInt ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġr Episode Ġ= Ġif Ġ( episode Ġ== Ġ 0 ) Ġnull Ġelse Ġepisode ĊĠĠĠĠĠĠĠ Ġval Ġr Season Ġ= Ġif Ġ( season Ġ== Ġ 0 ) Ġnull Ġelse Ġseason ĊĊĠĠĠĠĠĠĠ Ġval Ġseason Name Ġ= ĠgetString ( R . string . season ) ĊĠĠĠĠĠĠĠ Ġval Ġepisode Name Ġ= ĠgetString ( R . string . episode ) ĊĠĠĠĠĠĠĠ Ġval Ġseason Name Short Ġ= ĠgetString ( R . string . season _ short ) ĊĠĠĠĠĠĠĠ Ġval Ġepisode Name Short Ġ= ĠgetString ( R . string . episode _ short ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( r Episode Ġ!= Ġnull Ġ&& Ġr Season Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ season Name Short ${ r Season }: $ episode Name Short ${ r Episode } Ġ$ name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( r Episode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ episode Name Ġ$ r Episode . Ġ$ name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Episode Ġ!= Ġnull Ġ&& Ġr Season Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ season Name Ġ$ r Season Ġ- Ġ$ episode Name Ġ$ r Episode " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( r Season Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ episode Name Ġ$ r Episode " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAppCompatActivity . load Result ( url : ĠString , Ġapi Name : ĠString , Ġstart Action : ĠInt Ġ= Ġ 0 , Ġstart Value : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Store . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . navigate ( R . id . global _ to _ navigation _ results , ĠResult Fragment . newInstance ( url , Ġapi Name , Ġstart Action , Ġstart Value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠActivity ?. load SearchResult ( card : ĠSearch Response , Ġstart Action : ĠInt Ġ= Ġ 0 , Ġstart Value : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( this Ġas ĠAppCompatActivity ?) ?. load Result ( card . url , Ġcard . api Name , Ġstart Action , Ġstart Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠActivity . request Local Audio Focus ( focus Request : ĠAudio Focus Request ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O Ġ&& Ġfocus Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Manager Ġ= Ġget System Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . request Audio Focus ( focus Request ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Manager : ĠAudio Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget System Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . request Audio Focus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . STREAM _ M US IC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT _ MAY _ DU CK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Audio Focus Request : ĠAudio Focus Request ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Audio Focus ChangeListener : ĠAudio Manager . On Audio Focus ChangeListener ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġon Audio Focus Event Ġ= ĠEvent < Boolean >() ĊĊĠĠĠ Ġprivate Ġfun Ġget Audio Listener (): ĠAudio Manager . On Audio Focus ChangeListener ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Audio Focus ChangeListener Ġ!= Ġnull ) Ġreturn Ġcurrent Audio Focus ChangeListener ĊĠĠĠĠĠĠĠ Ġcurrent Audio Focus ChangeListener Ġ= ĠAudio Manager . On Audio Focus ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Audio Focus Event . invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT _ EXCL USIVE Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Audio Focus ChangeListener ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġprivate Ġclass ĠVolume Boost er ( enabled : ĠBoolean ): ĠAudio Listener Ġ{ ĊĠĠĠ Ġvar Ġenabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . boost er ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġboost er : ĠL oud ness Enh ancer ? Ġ= Ġnull ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . enabled Ġ= Ġenabled ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Audio SessionId ( audio SessionId : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Ġsession Ġid Ġis Ġ${ audio SessionId }, Ġsupported Ġgain Ġ${ L oud ness Enh ancer . PARAM _ TARGET _ GAIN _ MB }") ĊĠĠĠĠĠĠĠ Ġboost er ?. release () ĊĠĠĠĠĠĠĠ Ġboost er Ġ= ĠL oud ness Enh ancer ( audio SessionId ) ĊĠĠĠĠĠĠĠ Ġboost er ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Volume Boost er . enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Target Gain ( 3 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ volume Boost er Ġ= ĠVolume Boost er ( boost Enabled ) Ċ player . audio Component ?. add Audio Listener ( volume Boost er ) ĊĊĊĠĠĠ Ġfun ĠContext . is Cast Api Available (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Cast Api Available Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Api Availability . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Google Play Services Available ( application Context ) Ġ== ĠConnection Result . SUCCESS ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context ?. let Ġ{ ĠCast Context . get Shared Instance ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrack Ġnon - fatal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Cast Api Available ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠContext . isConnected To Chrome cast (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Cast Api Available ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcast Context Ġ= ĠCast Context . get Shared Instance ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cast Context . cast State Ġ== ĠCast State . CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠContext . is Using Mobile Data (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcon Manager Ġ= Ġget System Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Info Ġ= Ġcon Manager . all Networks ĊĠĠĠĠĠĠĠ Ġreturn Ġnetwork Info . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon Manager . get Network Capabilities ( it )?. has Transport ( Network Capabilities . TRANSPORT _ CELL ULAR ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠContext . is App Installed ( uri : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= ĠWrapper s . package Manager ( this ) ĊĠĠĠĠĠĠĠ Ġvar Ġapp Installed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġapp Installed Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpm . get Package Info ( uri , ĠPackage Manager . GET _ ACTIV ITIES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġapp Installed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Focus Request (): ĠAudio Focus Request ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Audio Focus Request Ġ!= Ġnull ) Ġreturn Ġcurrent Audio Focus Request ĊĠĠĠĠĠĠĠ Ġcurrent Audio Focus Request Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Focus Request . Builder ( Audio Manager . AUDIO FOCUS _ GAIN ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Attributes ( Audio Attributes . Builder (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Usage ( Audio Attributes . USAGE _ MEDIA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ContentType ( Audio Attributes . CONTENT _ TYPE _ MOV IE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Accept s Delayed Focus Gain ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Audio Listener ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Audio Focus ChangeListener ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Audio Focus Request ĊĠĠĠ Ġ} Ċ } Ċ