package Ġcom . alf resco . content . viewer . media Ċ Ċ import Ġandroid . media . session . Playback State Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Pair Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . view . isVisible Ċ import Ġcom . air bnb . mv rx . M aver icks Ċ import Ġcom . air bnb . mv rx . M aver icks View Ċ import Ġcom . air bnb . mv rx . fragment ViewModel Ċ import Ġcom . air bnb . mv rx . with State Ċ import Ġcom . alf resco . content . viewer . common . Child Viewer Args Ċ import Ġcom . alf resco . content . viewer . common . Child Viewer Fragment Ċ import Ġcom . google . android . ex op layer 2 . C Ċ import Ġcom . google . android . ex op layer 2 . Default Control Dispatcher Ċ import Ġcom . google . android . ex op layer 2 . Default Render ers Factory Ċ import Ġcom . google . android . ex op layer 2 . Exo Playback Exception Ċ import Ġcom . google . android . ex op layer 2 . Media Item Ċ import Ġcom . google . android . ex op layer 2 . Player Ċ import Ġcom . google . android . ex op layer 2 . Render ers Factory Ċ import Ġcom . google . android . ex op layer 2 . Simple Exo Player Ċ import Ġcom . google . android . ex op layer 2 . audio . Audio Attributes Ċ import Ġcom . google . android . ex op layer 2 . medi ac ode c . Media Codec Renderer . Decoder Initialization Exception Ċ import Ġcom . google . android . ex op layer 2 . medi ac ode c . Media Codec Util . Decoder Query Exception Ċ import Ġcom . google . android . ex op layer 2 . source . Default Media Source Factory Ċ import Ġcom . google . android . ex op layer 2 . source . Track Group Array Ċ import Ġcom . google . android . ex op layer 2 . track selection . Default Track Selector Ċ import Ġcom . google . android . ex op layer 2 . track selection . Default Track Selector . Parameters Builder Ċ import Ġcom . google . android . ex op layer 2 . track selection . Mapping Track Selector . Mapped Track Info Ċ import Ġcom . google . android . ex op layer 2 . track selection . Track Selection Array Ċ import Ġcom . google . android . ex op layer 2 . ui . Player View Ċ import Ġcom . google . android . ex op layer 2 . upstream . DataSource Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . util . ErrorMessage Provider Ċ import Ġcom . google . android . ex op layer 2 . util . Event Logger Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ import Ġkotlin . math . max Ċ Ċ class ĠMedia Viewer Fragment Ġ: ĠChild Viewer Fragment (), ĠM aver icks View Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġargs : ĠChild Viewer Args ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMedia Viewer ViewModel Ġby Ġfragment ViewModel () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġplayer View : ĠPlayer View ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠdataSource Factory : ĠDataSource . Factory ĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠSimple Exo Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmedia Items : ĠList < Media Item >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtrack Selector : ĠDefault Track Selector ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtrack Selector Parameters : ĠDefault Track Selector . Parameters ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlast Seen Track Group Array : ĠTrack Group Array ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstart Auto Play Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstart Window Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠstartPosition : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġargs Ġ= Ġrequire NotNull ( arguments ?. get Parcelable ( M aver icks . KEY _ ARG )) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġif Ġ( args . type . startsWith (" audio / ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . fragment _ viewer _ audio ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . fragment _ viewer _ video ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( layout , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠdataSource Factory Ġ= ĠDefault DataSource Factory ( require Context (). application Context ) ĊĠĠĠĠĠĠĠ Ġplayer View Ġ= Ġview . findViewById ( R . id . player _ view ) ĊĠĠĠĠĠĠĠ Ġ// ĠApply Ġwindow Ġin sets Ġto Ġcontrols ĊĠĠĠĠĠĠĠ Ġval Ġcontrols Ġ= Ġplayer View . findViewById < View >( R . id . exo _ controller ) ĊĠĠĠĠĠĠĠ Ġcontrols . setOn Apply Window Insets Listener Ġ{ Ġview , Ġin sets Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . set Padding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets . system Window Inset Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets . system Window Inset Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets . system Window Inset Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin sets . system Window Inset Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġconsume Ġthe Ġin sets Ġas Ġit Ġmay Ġdis rupt Ġthe Ġhidden Ġaction Ġbar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin sets ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplayer View . set ErrorMessage Provider ( Player ErrorMessage Provider ()) ĊĠĠĠĠĠĠĠ Ġplayer View . request Focus () ĊĠĠĠĠĠĠĠ Ġplayer View . set Control Dispatcher ( Default Control Dispatcher ( FAST _ FORWARD _ MS , ĠRE W IND _ MS )) ĊĠĠĠĠĠĠĠ Ġplayer View . video Surface View ?. visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector Parameters Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState . get Parcelable ( KEY _ TRACK _ SELECT OR _ PARAMETERS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Auto Play Ġ= ĠsavedInstanceState . getBoolean ( KEY _ AUTO _ PLAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Window Ġ= ĠsavedInstanceState . getInt ( KEY _ WINDOW ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartPosition Ġ= ĠsavedInstanceState . getLong ( KEY _ POSITION ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠParameters Builder ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector Parameters Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Start Position () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġif Ġ( Util . SDK _ INT Ġ> Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . on Resume () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ( Util . SDK _ INT Ġ<= Ġ 2 3 Ġ|| Ġplayer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . on Resume () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( Util . SDK _ INT Ġ<= Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . on Pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġif Ġ( Util . SDK _ INT Ġ> Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . on Pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġupdate Track Selector Parameters () ĊĠĠĠĠĠĠĠ Ġupdate Start Position () ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( KEY _ TRACK _ SELECT OR _ PARAMETERS , Ġtrack Selector Parameters ) ĊĠĠĠĠĠĠĠ Ġout State . put Boolean ( KEY _ AUTO _ PLAY , Ġstart Auto Play ) ĊĠĠĠĠĠĠĠ Ġout State . put Int ( KEY _ WINDOW , Ġstart Window ) ĊĠĠĠĠĠĠĠ Ġout State . put Long ( KEY _ POSITION , ĠstartPosition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠWhether Ġinitialization Ġwas Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinitialize Player (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġplayer Ġ= Ġthis . player ĊĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġrequire Context (). application Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrender ers Factory : ĠRender ers Factory Ġ= ĠDefault Render ers Factory ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Source Factory Ġ= ĠDefault Media Source Factory ( dataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrack Selector Ġ= ĠDefault Track Selector ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector . parameters Ġ= Ġtrack Selector Parameters !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Track Group Array Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSimple Exo Player . Builder ( require Context (), Ġrender ers Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Media Source Factory ( media Source Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Track Selector ( track Selector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . addListener ( Player EventListener ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . add Analytics Listener ( Event Logger ( track Selector )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set Audio Attributes ( Audio Attributes . DEFAULT , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . play When Ready Ġ= Ġstart Auto Play ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . player Ġ= Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . set Playback Pre par er Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . player Ġ= Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . track Selector Ġ= Ġtrack Selector ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhave Start Position Ġ= Ġstart Window Ġ!= ĠC . INDEX _ UN SET ĊĠĠĠĠĠĠĠ Ġif Ġ( have Start Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . seek To ( start Window , ĠstartPosition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplayer . set Media Item ( create Media Item ()) ĊĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Media Item (): ĠMedia Item Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith State ( viewModel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Item . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Uri ( it . uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Track Selector Parameters () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Start Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Items Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Track Selector Parameters () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( track Selector Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector Parameters Ġ= Ġtrack Selector ?. parameters ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Start Position () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Auto Play Ġ= Ġplayer ?. play When Ready Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Window Ġ= Ġplayer ?. current Window Index Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartPosition Ġ= Ġmax ( 0 , Ġplayer ?. content Position Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset To Default () Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . play When Ready Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . seek To ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Start Position () Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Auto Play Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstart Window Ġ= ĠC . INDEX _ UN SET ĊĠĠĠĠĠĠĠ ĠstartPosition Ġ= ĠC . TIME _ UN SET ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Toast ( message Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Toast ( getString ( message Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Toast ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( require Context (). application Context , Ġmessage , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠPlayer EventListener Ġ: ĠPlayer . EventListener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Player EventListener . on Playback StateChanged Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠPlay back State . STATE _ PLAY ING Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ== ĠPlay back State . STATE _ STOP PED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . video Surface View ?. isVisible Ġ= Ġhas Video Tracks () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Listener ?. on Content Loaded () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠPlayer . STATE _ ENDED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* player ?. seek To ( 0 ) */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset To Default () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tracks Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Groups : ĠTrack Group Array , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selections : ĠTrack Selection Array ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( track Groups Ġ!== Ġlast Seen Track Group Array ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapped Track Info Ġ= Ġtrack Selector ?. current Mapped Track Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mapped Track Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mapped Track Info . getType Support ( C . TRACK _ TYPE _ VIDEO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ== ĠM apped Track Info . RENDER ER _ SUPPORT _ UNSUPPORTED _ TRACK S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( R . string . error _ unsupported _ video ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mapped Track Info . getType Support ( C . TRACK _ TYPE _ AUDIO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ== ĠM apped Track Info . RENDER ER _ SUPPORT _ UNSUPPORTED _ TRACK S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( R . string . error _ unsupported _ audio ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Track Group Array Ġ= Ġtrack Groups ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠPlayer ErrorMessage Provider Ġ: ĠError Message Provider < Exo Playback Exception > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ErrorMessage ( e : ĠEx o Playback Exception ): ĠPair < Int , ĠString > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror String Ġ= ĠgetString ( R . string . error _ generic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . type Ġ== ĠEx o Playback Exception . TYPE _ RENDER ER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcause Ġ= Ġe . renderer Exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause Ġis ĠDecoder Initialization Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSpecial Ġcase Ġfor Ġdecoder Ġinitialization Ġfailures . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror String Ġ= Ġif Ġ( cause . codec Info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcause . cause Ġis ĠDecoder Query Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . error _ query ing _ de coders ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcause . secure Decoder Required Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . error _ no _ secure _ decoder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcause . mime Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . error _ no _ decoder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcause . mime Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . error _ inst anti ating _ decoder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcause . codec Info ?. name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair . create ( 0 , Ġerror String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Video Tracks (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrack Info Ġ= Ġtrack Selector ?. current Mapped Track Info ĊĠĠĠĠĠĠĠ Ġif Ġ( track Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( track Info . getType Support ( C . TRACK _ TYPE _ VIDEO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ!= ĠM apped Track Info . RENDER ER _ SUPPORT _ NO _ TRACK S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Info When Loaded (): ĠBoolean Ġ= Ġ! has Video Tracks () ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ TRACK _ SELECT OR _ PARAMETERS Ġ= Ġ" track _ selector _ parameters " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ WINDOW Ġ= Ġ" window " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ POSITION Ġ= Ġ" position " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ AUTO _ PLAY Ġ= Ġ" auto _ play " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFAST _ FORWARD _ MS Ġ= Ġ 1 0 _ 0 0 0 L ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRE W IND _ MS Ġ= Ġ 1 0 _ 0 0 0 L ĊĠĠĠ Ġ} Ċ } Ċ