package Ġdiv yan sh . tech . anime class room . player Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . net . to Uri Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . google . android . ex op layer 2 .* Ċ import Ġcom . google . android . ex op layer 2 . Player .* Ċ import Ġcom . google . android . ex op layer 2 . audio . Audio Attributes Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . hls . H ls DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . source . hls . H ls Media Source Ċ import Ġcom . google . android . ex op layer 2 . track selection . Default Track Selector Ċ import Ġcom . google . android . ex op layer 2 . ui . AspectRatio Frame Layout Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default Http DataSource Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default Http DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . upstream . Http DataSource Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġdiv yan sh . tech . anime class room . R Ċ import Ġdiv yan sh . tech . anime class room . common . utils . Result Wrapper Ċ import Ġdiv yan sh . tech . anime class room . databinding . Fragment Player Binding Ċ import Ġdiv yan sh . tech . anime class room . common . data . Player Screen Model Ċ import Ġdiv yan sh . tech . anime class room . player . callbacks . Player Control Listener Ċ import Ġkotlinx . android . synt hetic . main . exo _ player _ custom _ controls .* Ċ import Ġkotlinx . android . synt hetic . main . exo _ player _ custom _ controls . view .* Ċ import Ġkotlinx . android . synt hetic . main . fragment _ player .* Ċ Ċ @ Android EntryPoint Ċ class ĠPlayer Fragment : ĠFragment (), ĠPlayer Control Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Player Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġex o Player : ĠSimple Exo Player ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġactivity ViewModels < Player ViewModel >() ĊĊĠĠĠ Ġprivate Ġvar Ġis FullScreen Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Player Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Observer s () ĊĠĠĠĠĠĠĠ Ġsetup Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġback . setOnClickListener Ġ{ Ġon Button Clicked ( Player ViewModel . Player Click . BACK ) Ġ} ĊĠĠĠĠĠĠĠ Ġex o _ track _ selection _ view . setOnClickListener Ġ{ Ġon Button Clicked ( Player ViewModel . Player Click . QUAL ITY _ CONTROL ) Ġ} ĊĠĠĠĠĠĠĠ Ġex o _ speed _ selection _ view . setOnClickListener Ġ{ Ġon Button Clicked ( Player ViewModel . Player Click . SPEED _ CONTROL ) Ġ} ĊĠĠĠĠĠĠĠ Ġex o _ full _ Screen . setOnClickListener Ġ{ Ġon Button Clicked ( Player ViewModel . Player Click . FULL SCREEN _ TO GGLE ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . retry . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exo Player . playback Error Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player . retry () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Player ( data : ĠPlayer Screen Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtrack Selector Ġ= ĠDefault Track Selector () ĊĠĠĠĠĠĠĠ Ġval Ġload Control Ġ= ĠDefault Load Control () ĊĠĠĠĠĠĠĠ Ġval Ġrender ers Factory Ġ= ĠDefault Render ers Factory ( require Context ()) ĊĊĠĠĠĠĠĠĠ Ġex o Player Ġ= ĠEx o Player Factory . new Simple Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender ers Factory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Control ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġex o Player . addListener ( object Ġ: ĠEvent Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠEx o Playback Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Player Error ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( error ?. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ OUT _ OF _ MEMORY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= ĠR . drawable . ic _ general _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Text Ġ= ĠR . string . status _ code _ default ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ REMOTE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= ĠR . drawable . ic _ general _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Text Ġ= ĠR . string . server _ error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ RENDER ER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= ĠR . drawable . ic _ general _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Text Ġ= ĠR . string . status _ code _ default ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ SOURCE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= ĠR . drawable . ic _ no _ internet , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Text Ġ= ĠR . string . no _ internet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEx o Playback Exception . TYPE _ UN EXPECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= ĠR . drawable . ic _ general _ error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Text Ġ= ĠR . string . status _ code _ default ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Player StateChanged ( play When Ready , Ġplayback State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( playback State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ IDLE Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ BUFFER ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( visible Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . exo Player View . exo _ play . setImage Resource ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . exo Player View . exo _ pause . setImage Resource ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ READY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Enabled Status Of Previous And Next Episode s Buttons ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player View . video Surface View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( visible Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . exo Player View . exo _ play . setImage Resource ( R . drawable . ic _ media _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . exo Player View . exo _ pause . setImage Resource ( R . drawable . ic _ media _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ ENDED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex op layer Error Layout Change ( visible Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġbinding . exo Player View . player Ġ= Ġex o Player ĊĠĠĠĠĠĠĠ Ġplay ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġex op layer Error Layout Change ( ĊĠĠĠĠĠĠĠ Ġvisible : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġimage : ĠInt Ġ= ĠR . drawable . ic _ no _ internet , ĊĠĠĠĠĠĠĠ Ġerror Text : ĠInt Ġ= ĠR . string . no _ internet ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . error Layout . isVisible Ġ= Ġvisible ĊĠĠĠĠĠĠĠ Ġbinding . error Image . setImage Resource ( image ) ĊĠĠĠĠĠĠĠ Ġbinding . error Text . text Ġ= ĠgetString ( error Text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay ( data : ĠPlayer Screen Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . streaming Url . contains (" m 3 u 8 ")) Ġex o Player . prepare ( build Media Source ( data . streaming Url . to Uri ())) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . streaming Url . contains (" https ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player . prepare ( build Media Source ( data . streaming Url . to Uri ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player . prepare ( build Media Source ( data . streaming Url . replace (" http ", Ġ" https "). to Uri ())) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġex o Player . play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġaudio Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Media Source ( uri : ĠUri ): ĠMedia Source Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġval Ġlast Path Ġ= Ġuri . last Path Segment ĊĠĠĠĠĠĠĠ ĠLog . i (" PLAYER Ġ-> Ġ", Ġlast Path . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġdefault DataSource Factory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Http DataSource Factory (" Mozilla / 5 . 0 Ġ( Windows ĠNT Ġ 1 0 . 0 ; ĠWin 6 4 ; Ġx 6 4 ) ĠAppleWebKit / 5 3 7 . 3 6 Ġ( KHTML , Ġlike ĠGecko ) ĠChrome / 8 0 . 0 . 3 9 8 7 . 1 2 2 ĠSafari / 5 3 7 . 3 6 ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( last Path !!. contains (" m 3 u 8 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠH ls Media Source . Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH ls DataSource Factory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataSource : ĠHttp DataSource Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Http DataSource (" Mozilla / 5 . 0 Ġ( Linux ; ĠAndroid Ġ 6 . 0 ; ĠN exus Ġ 5 ĠBuild / MR A 5 8 N ) ĠAppleWebKit / 5 3 7 . 3 6 Ġ( KHTML , Ġlike ĠGecko ) ĠChrome / 9 3 . 0 . 4 5 7 7 . 8 2 ĠMobile ĠSafari / 5 3 7 . 3 6 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . setRequest Property (" origin ", Ġ" https :// g og oplay 1 . com ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . setRequest Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Refer er ", Ġ" https :// g og oplay 1 . com / streaming . php ? id = MT c 0 OT Q 1 & title = Bor uto % 3 A + N ar uto + Next + Gener ations + Episode + 2 2 5 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Allow Chunk less Pre paration ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( uri ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdash Chunk Source Factory Ġ= ĠDefault Dash Chunk Source . Factory ( default DataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress ive Media Source . Factory ( default DataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( uri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Observer s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . streaming LiveData . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Player - Frag ", Ġit . data . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data ?. let Ġ{ Ġit 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Player ( it 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Episode Button Visibility Ġ= Ġif Ġ( it 1 . next Episode Url Ġ== Ġnull Ġ|| Ġit 1 . next Episode Url . equals (" null ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . exo Player View . next Episode . visibility Ġ= Ġnext Episode Button Visibility ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Episode Button Visibility Ġ= Ġif Ġ( it 1 . previous Episode Url Ġ== Ġnull Ġ|| Ġit 1 . previous Episode Url . equals (" null ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . exo Player View . previous Episode . visibility Ġ= Ġprevious Episode Button Visibility ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode Name . text Ġ= Ġit 1 . anime Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Episode . setOnClickListener Ġ{ Ġit 1 . next Episode Url ?. let Ġ{ Ġit 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Episode Clicked ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Episode . setOnClickListener Ġ{ Ġit 1 . previous Episode Url ?. let Ġ{ Ġit 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Episode Clicked ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResult Wrapper . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Enabled Status Of Previous And Next Episode s Buttons ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" Player - Frag ", Ġit . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . click Control LiveData . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer ViewModel . Player Click . BACK Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer ViewModel . Player Click . QUAL ITY _ CONTROL Ġ-> ĠToast . makeText ( require Context (), Ġ" QUAL ITY ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer ViewModel . Player Click . SPEED _ CONTROL Ġ-> Ġspeed Control () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer ViewModel . Player Click . FULL SCREEN _ TO GGLE Ġ-> Ġtoggle FullScreen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . stop () ĊĠĠĠĠĠĠĠ Ġex o Player . release () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġ* ĠMethod ĠSelection s ĊĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtoggle FullScreen () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is FullScreen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player Frame Layout . resize Mode Ġ= ĠAs pect Ratio Frame Layout . RE SIZE _ MODE _ FILL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player View . resize Mode Ġ= ĠAs pect Ratio Frame Layout . RE SIZE _ MODE _ FILL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis FullScreen Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o _ full _ Screen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . exo _ controls _ fullscreen _ exit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player Frame Layout . resize Mode Ġ= ĠAs pect Ratio Frame Layout . RE SIZE _ MODE _ FIXED _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o Player View . resize Mode Ġ= ĠAs pect Ratio Frame Layout . RE SIZE _ MODE _ FIT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis FullScreen Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex o _ full _ Screen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . exo _ controls _ fullscreen _ enter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaudio Focus (){ ĊĠĠĠĠĠĠĠ Ġval Ġaudio Attributes : ĠAudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Usage ( C . USAGE _ MEDIA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( C . CONTENT _ TYPE _ MOV IE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġex o Player . set Audio Attributes ( audio Attributes , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Enabled Status Of Previous And Next Episode s Buttons ( isEnabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnext Episode . isEnabled Ġ= Ġis Enabled ĊĠĠĠĠĠĠĠ Ġprevious Episode . isEnabled Ġ= Ġis Enabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġspeed Control (){ ĊĠĠĠĠĠĠĠ Ġvar Ġplayback Position Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġalert Dialog : ĠAlertDialog . Builder Ġ= ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠ Ġalert Dialog . setTitle (" Set Ġyour Ġplayback Ġspeed ") ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠarrayOf (" 0 . 5 "," 0 . 7 5 "," 1 x ", Ġ" 1 . 2 5 x ", Ġ" 1 . 5 x ", Ġ" 2 x ") ĊĠĠĠĠĠĠĠ Ġalert Dialog . set Items ( items , ĠDialog Interface . OnClickListener Ġ{ Ġ_, Ġpos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( pos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġex o Player . playback Parameters Ġ= ĠPlay back Parameters ( 0 . 5 f ). also Ġ{ Ġex o _ speed _ selection _ view . text Ġ= Ġ" 0 . 5 x " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġex o Player . playback Parameters Ġ= ĠPlay back Parameters ( 0 . 7 5 f ). also Ġ{ Ġex o _ speed _ selection _ view . text Ġ= Ġ" 0 . 7 5 x " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġex o Player . playback Parameters Ġ= ĠPlay back Parameters ( 1 f ). also Ġ{ Ġex o _ speed _ selection _ view . text Ġ= Ġ" 1 x " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġex o Player . playback Parameters Ġ= ĠPlay back Parameters ( 1 . 2 5 f ). also Ġ{ Ġex o _ speed _ selection _ view . text Ġ= Ġ" 1 . 2 5 x " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġex o Player . playback Parameters Ġ= ĠPlay back Parameters ( 1 . 5 f ). also Ġ{ Ġex o _ speed _ selection _ view . text Ġ= Ġ" 1 . 5 x " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġex o Player . playback Parameters Ġ= ĠPlay back Parameters ( 2 f ). also Ġ{ Ġex o _ speed _ selection _ view . text Ġ= Ġ" 2 x " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayback Position Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġalert : ĠAlertDialog Ġ= Ġalert Dialog . create () ĊĠĠĠĠĠĠĠ Ġalert . set Canceled On Touch Outside ( true ) ĊĠĠĠĠĠĠĠ Ġalert . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Button Clicked ( item : ĠPlayer ViewModel . Player Click ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . update Button Click ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Episode Clicked ( episode Url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Player . play When Ready Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠPlayer Activity ). update Episode ( episode Url , Ġ 0 ) ĊĠĠĠ Ġ} Ċ }