package Ġcom . example . android . architecture . blueprint s . be et v . modules . player . components Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Handler Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Texture View Ċ import Ġandroid . view . View Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroid . widget . TextView Ċ import Ġcom . example . android . architecture . blueprint s . be et v . R Ċ import Ġcom . example . android . architecture . blueprint s . be et v . manager . MediaPlayer Manager Ċ import Ġcom . example . android . architecture . blueprint s . be et v . modules . player . models . Video Info Ċ import Ġcom . example . android . architecture . blueprint s . be et v . util . Constants Ċ import Ġcom . example . android . architecture . blueprint s . be et v . util . Utils Ċ import Ġcom . google . android . ex op layer 2 .* Ċ import Ġcom . google . android . ex op layer 2 . Player . Dis continu ity Reason Ċ import Ġcom . google . android . ex op layer 2 . dr m . D rm Session Manager Ċ import Ġcom . google . android . ex op layer 2 . dr m . Exo Media Crypto Ċ import Ġcom . google . android . ex op layer 2 . ext . rt mp . R tmp DataSource Factory Ċ 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 . Track Group Array Ċ import Ġcom . google . android . ex op layer 2 . track selection .* Ċ import Ġcom . google . android . ex op layer 2 . upstream .* Ċ import Ġcom . google . android . ex op layer 2 . util . Event Logger Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ import Ġcom . google . android . ex op layer 2 . video . Video Listener Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ ãĢĢãĢĢ ĠĠĠ Ġ() ĠĠ ãĢĢãĢĢ Ġ Ġ() Ċ Ġ* Ġ ãĢĢãĢĢ ĠĠ Ġ( Ġ) Ġ ãĢĢãĢĢ ãĢĢ ( Ġ) Ċ Ġ* Ġ ãĢĢãĢĢ ĠĠ Ġ( Ġ) Ġ ãĢĢãĢĢ ãĢĢ ( Ġ) Ċ Ġ* Ġ ãĢĢ ãĢĢ âĶ ı âĶ Ľ âĶ » âĶģâĶģ âĶģ âĶ Ľ âĶ » âĶ ĵ Ċ Ġ* Ġ ãĢĢ ãĢĢ âĶ ĥ ãĢĢãĢĢ ãĢĢ âĶģ ãĢĢãĢĢ ãĢĢ âĶ ĥ Ċ Ġ* Ġ ãĢĢ ãĢĢ âĶ ĥ ãĢĢ âĶ ³ âĶ Ľ ãĢĢ âĶ Ĺ âĶ ³ ãĢĢ âĶ ĥ Ċ Ġ* Ġ ãĢĢ ãĢĢ âĶ ĥ ãĢĢãĢĢ ãĢĢ âĶ » ãĢĢãĢĢ ãĢĢ âĶ ĥ Ċ Ġ* Ġ ãĢĢ ãĢĢ âĶ Ĺ âĶģ âĶ ĵ ãĢĢãĢĢ ãĢĢ âĶ ı âĶģ âĶ Ľ Ċ Ġ* Ġ ãĢĢãĢĢ ãĢĢ ãĢĢ âĶ ĥ ãĢĢãĢĢ ãĢĢ âĶ ĥ Ċ Ġ* Ġ ãĢĢãĢĢ ãĢĢ ãĢĢ âĶ ĥ ãĢĢãĢĢ ãĢĢ âĶ Ĺ âĶģâĶģ âĶģ âĶ ĵ Ċ Ġ* Ġ ãĢĢãĢĢ ãĢĢ ãĢĢ âĶ ĥ ãĢĢãĢĢãĢĢãĢĢ ãĢĢãĢĢ ãĢĢ âĶ £ âĶ ĵ Ċ Ġ* Ġ ãĢĢãĢĢ ãĢĢ ãĢĢ âĶ ĥ ãĢĢãĢĢãĢĢãĢĢ ãĢĢãĢĢ ãĢĢ âĶ ı âĶ Ľ Ċ Ġ* Ġ ãĢĢãĢĢ ãĢĢ ãĢĢ âĶ Ĺ âĶ ĵ âĶ ĵ âĶ ı âĶģ âĶ ³ âĶ ĵ âĶ ı âĶ Ľ Ċ Ġ* Ġ ãĢĢãĢĢãĢĢãĢĢ ãĢĢ âĶ ĥ âĶ « âĶ « ãĢĢ âĶ ĥ âĶ « âĶ « Ċ Ġ* Ġ ãĢĢãĢĢãĢĢãĢĢ ãĢĢ âĶ Ĺ âĶ » âĶ Ľ ãĢĢ âĶ Ĺ âĶ » âĶ Ľ Ċ Ġ* ĠCreated Ġby ĠH Q Ġon Ġ 2 0 1 7 / 1 2 / 0 3 . Ċ Ġ*/ Ċ class ĠEx o Video View Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) Ġ: ĠRelative Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠ Ġ/ **** æĹ¥å¿Ĺ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Exo Video View " ĊĠĠĠ Ġ/ ******************************** ** æİ§ä»¶ çĽ¸åħ³ Ġ*/ ĊĠĠĠ Ġ/** * æĴŃæĶ¾ æĺ¾ç¤º Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġiv Play Icon : ĠImageView ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * åĬłè½½ Ġ*/ ĊĠĠĠ Ġprivate Ġvar ĠprogressBar : ĠProgress Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġmovie Loading Indicator : ĠImageView ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlive Video Loading Indicator : ĠImageView ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * æ¸²æŁĵ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġtexture view : ĠTexture View ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * æłĩé¢ĺ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġex o Title : ĠTextView ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * å½ĵåīį è¿Ľ åº¦ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġex o Position : ĠTextView ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * è¿Ľ åº¦ æĿ¡ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġex o Progress : ĠTime Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * æĢ» æĹ¶ éķ¿ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġex o Duration : ĠTextView ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġis Loaded Ġ= Ġfalse ĊĊĠĠĠ Ġ/** * æĺ¾ç¤º æĹ¶éĹ´ è¿Ľ åº¦ çļĦ æł¹ å¸ĥå±Ģ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġex o Time : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlive Player : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġ/ ******************************** ** æİ§ä»¶ çĽ¸åħ³ Ġ*/ ĊĠĠĠ Ġ/ **** æĴŃæĶ¾ åĻ¨ æł¸å¿ĥ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Exo Player : ĠSimple Exo Player ? Ġ= Ġnull ĊĠĠĠ Ġ// ĠĠĠ Ġprivate ĠAs pect Ratio Frame Layout Ġm AspectRatio Layout ; ĊĠĠĠ Ġ/** * çĬ¶æĢģ çĽĳåĲ¬ åĻ¨ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcomponent Listener : ĠComponent Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcomplete Listener : ĠComplete Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġformat Builder Ġ= ĠStringBuilder () ĊĠĠĠ Ġprivate Ġval Ġformatter Ġ= ĠFormatter ( format Builder , ĠLocale . getDefault ()) ĊĊĠĠĠ Ġ/ **** äºĭä»¶ æĹ¥å¿Ĺ è¾ĵåĩº Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġevent Logger : ĠEvent Logger ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * æ¸²æŁĵ åĻ¨ ï¼Į é»ĺè®¤ æľī åĽĽ ä¸ª æ¸²æŁĵ åĻ¨ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġtrack Selector : ĠMapping Track Selector ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġhash Map Ġ= ĠHashMap < String , ĠVideo Info >() ĊĊĠĠĠ Ġ/** * æĺ¾ç¤º çļĦæĹ¶éĹ´ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġshow Timeout Ms Ġ= Ġ 1 5 0 0 0 ĊĠĠĠ Ġprivate Ġval Ġre wind Ms Ġ= Ġ 5 0 0 0 ĊĠĠĠ Ġprivate Ġval Ġfast Forward Ms Ġ= Ġ 1 5 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġduration : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis Focus Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġis Pause Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Show ProgressBar Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġprogress Vod : ĠProgress Bar ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġhide Action Ġ= ĠRunnable Ġ{ Ġhide () Ġ} ĊĠĠĠ Ġvar Ġupdate Progress Ġ= ĠRunnable Ġ{ Ġupdate Progress () Ġ} ĊĠĠĠ Ġvar Ġhide Progress Ġ= ĠRunnable Ġ{ Ġiv Play Icon !!. visibility Ġ= ĠG ONE Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġcomponent Listener Ġ= ĠComponent Listener () ĊĠĠĠĠĠĠĠ Ġval Ġvideo Track Selection Factory : ĠTrack Selection . Factory Ġ= ĠAdapt ive Track Selection . Factory ( BAND WIDTH _ METER ) ĊĠĠĠĠĠĠĠ Ġtrack Selector Ġ= ĠDefault Track Selector ( video Track Selection Factory ) ĊĠĠĠĠĠĠĠ Ġevent Logger Ġ= ĠEvent Logger ( track Selector ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġm Exo Player Ġ= ĠEx o Player Factory . new Simple Instance ( new ĠDefault Render ers Factory ( App O tt . mContext , Ġnull , ĠDefault Render ers Factory . EXTENSION _ RENDER ER _ MODE _ ON ), Ġtrack Selector ); ĊĠĠĠĠĠĠĠ Ġm Exo Player Ġ= ĠEx o Player Factory . new Simple Instance ( context , Ġtrack Selector !! ) ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. set Video Texture View ( texture view ) ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. addListener ( component Listener !! ) ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. add Video Listener ( object Ġ: ĠVideo Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Video Size Changed ( width : ĠInt , Ġheight : ĠInt , Ġun applied Rotation Degrees : ĠInt , Ġpixel Width Height Ratio : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . print ( width . toString () Ġ+ Ġ" x " Ġ+ Ġheight Ġ+ Ġ", Ġratio :" Ġ+ Ġpixel Width Height Ratio ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġorg Width Ġ= Ġtexture view !!. width . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġorg Height Ġ= Ġtexture view !!. height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġview Width Ġ= Ġorg Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġview Height Ġ= Ġorg Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscale X Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscale Y Ġ= Ġ 1 . 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( MediaPlayer Manager . getInstance (). get Resolution ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Media Resolution . R 1 6 P 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTodo Ġscale Ġfull Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġ( view Width Ġ/ Ġwidth ) Ġ/ Ġ( view Height Ġ/ Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġ( view Height Ġ/ Ġheight ) Ġ/ Ġ( view Width Ġ/ Ġwidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale X Ġ> Ġscale Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Media Resolution . R 4 P 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTodo Ġscale Ġfull Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Width Ġ= Ġorg Height Ġ* Ġ 4 Ġ/ Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġ( org Height Ġ* Ġ 4 Ġ/ Ġ 3 ) Ġ/ Ġorg Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġ( view Width Ġ/ Ġwidth ) Ġ/ Ġ( view Height Ġ/ Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . Media Resolution . AUT OM ATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTodo Ġscale Ġall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( width Ġ> Ġview Width Ġ&& Ġheight Ġ> Ġview Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġwidth Ġ/ Ġview Width ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġheight Ġ/ Ġview Height ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( width Ġ< Ġview Width Ġ&& Ġheight Ġ< Ġview Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġview Width Ġ/ Ġwidth ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġview Height Ġ/ Ġheight ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( view Width Ġ> Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġ( view Width Ġ/ Ġwidth ) Ġ/ Ġ( view Height Ġ/ Ġheight ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( view Height Ġ> Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġ( view Height Ġ/ Ġheight ) Ġ/ Ġ( view Width Ġ/ Ġwidth ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpivot Point X Ġ= Ġ( org Width Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpivot Point Y Ġ= Ġ( org Height Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . set Scale ( scale X , Ġscale Y , Ġpivot Point X . toFloat (), Ġpivot Point Y . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtexture view !!. set Transform ( matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ ĠLayoutInflater . from ( context ). inflate ( R . layout . exo _ video view , Ġthis ) ĊĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . BLACK ) ĊĠĠĠĠĠĠĠ Ġiv Play Icon Ġ= ĠfindViewById < View >( R . id . iv _ play _ icon ) Ġas ĠImageView ĊĠĠĠĠĠĠĠ ĠprogressBar Ġ= ĠfindViewById < View >( R . id . progress Bar ) Ġas ĠProgress Bar ĊĠĠĠĠĠĠĠ Ġmovie Loading Indicator Ġ= ĠfindViewById < View >( R . id . iv _ movie _ indicator ) Ġas ĠImageView ĊĠĠĠĠĠĠĠ Ġlive Video Loading Indicator Ġ= ĠfindViewById < View >( R . id . iv _ live _ video _ indicator ) Ġas ĠImageView ĊĠĠĠĠĠĠĠ Ġtexture view Ġ= ĠfindViewById < View >( R . id . texture view ) Ġas ĠTexture View ĊĠĠĠĠĠĠĠ Ġex o Title Ġ= ĠfindViewById < View >( R . id . exo _ title ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġex o Position Ġ= ĠfindViewById < View >( R . id . exo _ position ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġex o Progress Ġ= ĠfindViewById < View >( R . id . exo _ progress ) Ġas ĠTime Bar ĊĠĠĠĠĠĠĠ Ġex o Duration Ġ= ĠfindViewById < View >( R . id . exo _ duration ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġprogress Vod Ġ= ĠfindViewById < View >( R . id . progress _ vod ) Ġas ĠProgress Bar ĊĠĠĠĠĠĠĠ Ġex o Time Ġ= ĠfindViewById ( R . id . exo _ time ) ĊĠĠĠĠĠĠĠ Ġlive Player Ġ= ĠfindViewById < View >( R . id . live _ control _ layout ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġm AspectRatio Layout Ġ= Ġ( AspectRatio Frame Layout ) ĠfindViewById ( R . id . es pect _ ratio ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Focus Button ( is Focus : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Focus Ġ= Ġis Focus ĊĠĠĠĠĠĠĠ Ġiv Play Icon ?. is Focus able Ġ= Ġis Focus ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay ( video Info : ĠVideo Info , Ġis Play : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhash Map [ video Info . play URL !! ] Ġ= Ġvideo Info ĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġvideo Info . duration ĊĠĠĠĠĠĠĠ Ġif Ġ( is Play ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay ( build Media Source ( Uri . parse ( video Info . play URL ), Ġnull )) ĊĠĠĠĠĠĠĠ Ġex o Title !!. text Ġ= Ġvideo Info . title ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Zoom Ratio () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( player Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġm AspectRatio Layout . set Resize Mode ( AspectRatio Frame Layout . RE SIZE _ MODE _ FIT ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtexture view . set AspectRatio ( 1 6 , Ġ 9 ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player . set Video Scaling Mode ( C . VIDEO _ SCAL ING _ MODE _ SCALE _ TO _ FIT _ WITH _ C RO PP ING ); Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Auto Ratio () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġplayer View . set Resize Mode ( AspectRatio Frame Layout . RE SIZE _ MODE _ FIT ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ Ĵ Ń æĶ¾ åįķ ä¸ª è§Ĩé¢ĳ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġplay ( media Source : ĠMedia Source ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player !!. play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player !!. prepare ( media Source !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow ( true ) ĊĠĠĠĠĠĠĠ Ġiv Play Icon !!. visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® æĴŃæĶ¾ åĻ¨ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġplayer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Player ( player : ĠSimple Exo Player ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ=== Ġplayer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player !!. remove Listener ( component Listener !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player !!. clear Video Texture View ( texture view ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Exo Player Ġ= Ġplayer ĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set Video Texture View ( texture view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . addListener ( component Listener !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Exo Player (): ĠSimple Exo Player ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Exo Player ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġ æĺ¾ç¤º æİ§åĪ¶ åĴĮ æĴŃæĶ¾ åĪĹè¡¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshow ( is Hide : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Callbacks ( hide Action ) ĊĠĠĠĠĠĠĠ Ġupdate Progress () ĊĠĠĠĠĠĠĠ Ġshow Anim () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Hide ) Ġhide After Timeout () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĺ¾ç¤º çļĦ åĬ¨çĶ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Anim () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Time !!. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġex o Title !!. visibility Ġ= ĠVIS IBLE ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éļĲèĹı æİ§åĪ¶ åĴĮ æĴŃæĶ¾ åĪĹè¡¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhide () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Callbacks ( update Progress ) ĊĠĠĠĠĠĠĠ Ġhide Anim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* ĠæĽ´æĸ° æĴŃæĶ¾ è¿Ľ åº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ== Ġnull ) Ġreturn Ġ// ĠTodo Ġthis Ġblock Ġwas Ġcalled Ġafter Ġexit Ġmovie ĊĠĠĠĠĠĠĠ Ġval Ġcontent Position Ġ= Ġm Exo Player !!. content Position ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġif Ġ( m Exo Player !!. duration Ġ< Ġ 0 ) Ġ 0 Ġelse Ġm Exo Player !!. duration ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Position Ġ= Ġm Exo Player !!. buffered Position ĊĠĠĠĠĠĠĠ Ġval Ġcontent Time Ġ= ĠgetString For Time ( format Builder , Ġformatter , Ġcontent Position ) ĊĠĠĠĠĠĠĠ Ġval Ġduration Time Ġ= ĠgetString For Time ( format Builder , Ġformatter , Ġduration ) ĊĠĠĠĠĠĠĠ Ġex o Progress !!. setPosition ( content Position ) ĊĠĠĠĠĠĠĠ Ġex o Progress !!. set Buffered Position ( buffer Position ) ĊĠĠĠĠĠĠĠ Ġex o Progress !!. set Duration ( duration ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( duration Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Vod !!. progress Ġ= Ġ(( content Position . toDouble () Ġ/ Ġduration ) Ġ* Ġ 1 0 0 ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġex o Position !!. text Ġ= Ġif Ġ( content Time ?. length Ġ== Ġ 5 ) Ġ" 0 0 :$ content Time " Ġelse Ġcontent Time ĊĠĠĠĠĠĠĠ Ġex o Duration !!. text Ġ= Ġif Ġ( duration Time ?. length Ġ== Ġ 5 ) Ġ" 0 0 :$ duration Time " Ġelse Ġduration Time ĊĠĠĠĠĠĠĠ Ġval Ġplayback State Ġ= Ġif Ġ( m Exo Player Ġ== Ġnull ) ĠPlayer . STATE _ IDLE Ġelse Ġm Exo Player !!. playback State ĊĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ!= ĠPlayer . STATE _ IDLE Ġ&& Ġplayback State Ġ!= ĠPlayer . STATE _ ENDED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( update Progress , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éļĲèĹı åĬ¨çĶ» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhide Anim () Ġ{ ĊĠĠĠĠĠĠĠ Ġex o Time !!. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġex o Title !!. visibility Ġ= ĠG ONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĺ¾ç¤º å¤ļ éķ¿ æĹ¶éĹ´ éļĲèĹı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhide After Timeout () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player ?. play When Ready Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Callbacks ( hide Action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Timeout Ms Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( hide Action , Ġshow Timeout Ms . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġ æŀĦå»º åªĴ ä½ĵ èµĦæºĲ ĊĠĠĠĠ Ġ* Ġ@ param Ġuri ĊĠĠĠĠ Ġ* Ġ@ param Ġoverride Extension ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Media Source ( uri : ĠUri , Ġoverride Extension : ĠString ?): ĠMedia Source Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠUtil . infer ContentType ( if Ġ( TextUtils . isEmpty ( override Extension )) Ġ".$ override Extension " Ġelse Ġuri . last Path Segment ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC . TYPE _ OTHER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrm Session Manager Ġ= ĠD rm Session Manager . get Dummy D rm Session Manager < Exo Media Crypto >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataSource Factory : ĠDataSource . Factory Ġ= ĠDefault DataSource Factory ( context , ĠUtil . getUser Agent ( context , Ġ" B ee Tv ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Source : ĠMedia Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Source Ġ= Ġif Ġ( uri . toString (). startsWith (" rt mp :// ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress ive Media Source . Factory ( R tmp DataSource Factory ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set D rm Session Manager ( dr m Session Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress ive Media Source . Factory ( dataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set D rm Session Manager ( dr m Session Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Continue Loading Check Interval Bytes ( 5 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Unsupported Ġtype : Ġ$ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º æķ°æį® å·¥ åİĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuse Bandwidth Meter Ġæĺ¯åĲ¦ æ·»åĬł æµģ éĩı ç»Łè®¡ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild DataSource Factory ( use Bandwidth Meter : ĠBoolean ): ĠDataSource . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild DataSource Factory ( if Ġ( use Bandwidth Meter ) ĠB AND WIDTH _ METER Ġelse Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º æķ°æį® å·¥ åİĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbandwidth Meter Ġæµ ģ éĩı ç»Łè®¡ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild DataSource Factory ( bandwidth Meter : ĠDefault Bandwidth Meter ?): ĠDataSource . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDefault DataSource Factory ( context . application Context , Ġbandwidth Meter , Ġbuild Http DataSource Factory ( bandwidth Meter )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º http æķ°æį® å·¥ åİĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbandwidth Meter Ġæµ ģ éĩı ç»Łè®¡ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Http DataSource Factory ( bandwidth Meter : ĠDefault Bandwidth Meter ?): ĠHttp DataSource . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDefault Http DataSource Factory ( Util . getUser Agent ( context . application Context , ĠTAG ), Ġbandwidth Meter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠComponent Listener Ġ: ĠPlayer . EventListener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Timeline Changed ( timeline : ĠTimeline , Ġreason : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ è½ ¨ éģĵ æĶ¹åıĺ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtrack Groups ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtrack Selections ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tracks Changed ( track Groups : ĠTrack Group Array , Ġtrack Selections : ĠTrack Selection Array ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ åĬłè½½ çĬ¶æĢģ æĶ¹åıĺ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param ĠisLoading ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Loading Changed ( isLoading : ĠBoolean ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġæ Ĵ Ń æĶ¾ çĬ¶æĢģ çļĦ æĶ¹åıĺ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġplay When Ready ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġplayback State ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Player StateChanged : Ġ$ play When Ready ---- $ playback State ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠPlayer . STATE _ READY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar !!. visibility Ġ= ĠG ONE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide After Timeout () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( live Player ?. visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Video Loading Indicator !!. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Video Loading Indicator !!. clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Loaded Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// FIX ME Ġthis Ġis Ġa Ġworkaround Ġto Ġwait Ġuntil Ġbackend Ġfixed Ġthe Ġroot Ġcause Ġof Ġthis Ġissue : Ġhttps :// trello . com / c / m 8 xB bd q 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// FIX ME Ġwe Ġhave Ġto Ġremove Ġthis Ġcode Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġsee king Ġthis Ġplayer Ġ( the Ġplaying Ġtime Ġis Ġ> Ġ 5 Ġsecond ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Exo Player () Ġ!= Ġnull Ġ&& Ġget Exo Player ()?. current Position !! Ġ> Ġ 5 0 0 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// 1 . Ġmute Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Volume Ġ= Ġget Exo Player ()?. volume Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Exo Player ()?. volume Ġ= Ġ 0 f Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// 2 . Ġset timeout Ġ 6 s Ġthen Ġun mute Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Exo Player ()?. volume Ġ= Ġold Volume Ġas ĠFloat Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 6 0 0 0 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar !!. visibility Ġ= ĠG ONE Ġ// Client Ġwants Ġthis ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( live Player ?. visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Video Loading Indicator !!. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Video Loading Indicator !!. start Animation ( Animation Utils . load Animation ( context , ĠR . anim . mar quee )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Pause ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. start Animation ( Animation Utils . load Animation ( context , ĠR . anim . mar quee )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠPlayer . STATE _ ENDED Ġ&& Ġcomplete Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomplete Listener !!. onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġæ Ĵ Ń æĶ¾ æ¨¡å¼ı çļĦ æĶ¹åıĺ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrepeat Mode ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Repeat Mode Changed ( repeat Mode : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Shuffle Mode Enabled Changed ( shuffle Mode Enabled : ĠBoolean ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġæ Ĵ Ń æĶ¾ éĶĻè¯¯ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġerror ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠEx o Playback Exception ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Position Dis continu ity (@ Dis continu ity Reason Ġreason : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġæ Ĵ Ń æĶ¾ åıĤæķ° çļĦ æĶ¹åıĺ ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġplayback Parameters ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback Parameters Changed ( playback Parameters : ĠPlay back Parameters ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Seek Processed () Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Volume ( left Volume : ĠFloat , Ġright Volume : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. volume Ġ= Ġleft Volume Ġ// Ġset Volume ( left Volume , right Volume ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfast Forward () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fast Forward Ms Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġduration Ms Ġ= Ġm Exo Player !!. duration ĊĠĠĠĠĠĠĠ Ġvar Ġseek Position Ms Ġ= Ġm Exo Player !!. current Position Ġ+ Ġfast Forward Ms ĊĠĠĠĠĠĠĠ Ġif Ġ( duration Ms Ġ!= ĠC . TIME _ UN SET ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek Position Ms Ġ= ĠMath . min ( seek Position Ms , Ġduration Ms ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. seek To ( seek Position Ms ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġre wind () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( rewind Ms Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. seek To ( Math . max ( m Exo Player !!. current Position Ġ- Ġre wind Ms , Ġ 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ Ġpublic Ġboolean Ġis Playing () Ġ{ ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġreturn Ġm Exo Player . get Playback State () Ġ== ĠPlayer . STATE _ READY Ġ&& Ġm Exo Player . get Play When Ready (); ĊĠĠĠ Ġ// ĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player !!. play When Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player !!. play When Ready Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Pause () Ġ: ĠBoolean { ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm Exo Player ?. play When Ready Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. stop ( true ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Exo Player !!. play When Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player !!. play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. release () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Callbacks ( update Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Callbacks ( hide Action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Callbacks ( hide Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Exo Player Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Selector Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Logger Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Player Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Exo Player !!. play When Ready ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Callbacks ( hide Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv Play Icon !!. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pause Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( hide Progress , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Loading Indicator !!. start Animation ( Animation Utils . load Animation ( context , ĠR . anim . mar quee )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pause Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Exo Player !!. play When Ready Ġ= Ġ! m Exo Player !!. play When Ready ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon KeyDown ( keyCode : ĠInt , Ġevent : ĠKeyEvent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Focus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ DP AD _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ ENTER Ġ|| ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ DP AD _ CENTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Player Button () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ DP AD _ RIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfast Forward () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ DP AD _ LEFT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre wind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on KeyDown ( keyCode , Ġevent ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Complete Listener ( complete Listener : ĠComplete Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . complete Listener Ġ= Ġcomplete Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠComplete Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonComplete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġæµ ģ éĩı ç»Łè®¡ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠB AND WIDTH _ METER Ġ= ĠDefault Bandwidth Meter () ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" In lined Api ") ĊĠĠĠĠĠĠĠ Ġfun Ġis Handled Media Key ( keyCode : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ MEDIA _ FAST _ FORWARD Ġ|| ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ MEDIA _ RE W IND Ġ|| ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ MEDIA _ PLAY _ PAUSE Ġ|| ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ MEDIA _ PLAY Ġ|| ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ MEDIA _ PAUSE Ġ|| ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ MEDIA _ NEXT Ġ|| ĠkeyCode Ġ== ĠKeyEvent . KEYCODE _ MEDIA _ PREVIOUS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () Ġ// åĪĿå§ĭåĮĸ ĊĠĠĠĠĠĠĠ Ġinit Player () Ġ// åĪĿå§ĭåĮĸ æĴŃæĶ¾ åĻ¨ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetString For Time ( builder : Ġjava . lang . StringBuilder , Ġformatter : ĠFormatter , Ġtime Ms : ĠLong ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtime Ms Ġ= Ġtime Ms ĊĠĠĠĠĠĠĠ Ġif Ġ( time Ms Ġ== ĠC . TIME _ UN SET ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ms Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtotal Seconds Ġ= Ġ( time Ms Ġ+ Ġ 5 0 0 ) Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġtotal Seconds Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġtotal Seconds Ġ/ Ġ 6 0 Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġhours Ġ= Ġtotal Seconds Ġ/ Ġ 3 6 0 0 ĊĠĠĠĠĠĠĠ Ġbuilder . set Length ( 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( hours Ġ> Ġ 0 ) Ġformatter . format ("% 0 2 d :% 0 2 d :% 0 2 d ", Ġhours , Ġminutes , Ġseconds ). toString () Ġelse Ġformatter . format ("% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ). toString () ĊĠĠĠ Ġ} Ċ }