package Ġorg . step ic . d roid . ui . fragments Ċ Ċ import Ġandroid . app . Key guard Manager Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . Activity Info Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . widget . AppCompat Seek Bar Ċ import Ġandroid . tele phony . Phone State Listener Ċ import Ġandroid . tele phony . Tele phony Manager Ċ import Ġandroid . view .* Ċ import Ġandroid . widget .* Ċ import Ġcom . squareup . otto . Subscribe Ċ import Ġorg . step ic . d roid . R Ċ import Ġorg . step ic . d roid . an alytic . An alytic Ċ import Ġorg . step ic . d roid . base . Fragment Base Ċ import Ġorg . step ic . d roid . base . Main Application Ċ import Ġorg . step ic . d roid . core . My Phone State Listener Ċ import Ġorg . step ic . d roid . core . modules . Video Module Ċ import Ġorg . step ic . d roid . core . present ers . Video WI th Timestamp Presenter Ċ import Ġorg . step ic . d roid . core . present ers . contracts . Video With Timestamp View Ċ import Ġorg . step ic . d roid . events . Incoming Call Event Ċ import Ġorg . step ic . d roid . events . audio . Audio Focus Loss Event Ċ import Ġorg . step ic . d roid . preferences . Video Playback Rate Ċ import Ġorg . step ic . d roid . ui . custom . Touch Dispatch able Frame Layout Ċ import Ġorg . step ic . d roid . util . Android Devices Ċ import Ġorg . step ic . d roid . util . Time Util Ċ import Ġorg . vide ol an . lib v lc . I VL CV out Ċ import Ġorg . vide ol an . lib v lc . Lib VL C Ċ import Ġorg . vide ol an . lib v lc . Media Ċ import Ġorg . vide ol an . lib v lc . MediaPlayer Ċ import Ġorg . vide ol an . lib v lc . util . Android Util Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠVideo Fragment Ġ: ĠFragment Base (), ĠI VL CV out . Callback , ĠVideo With Timestamp View Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTIME OUT _ BEFORE _ HIDE Ġ= Ġ 4 5 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINDEX _ PLAY _ IMAGE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINDEX _ PAUSE _ IMAGE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠJ UMP _ TIME _ M ILL IS Ġ= Ġ 1 0 0 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠJ UMP _ MAX _ DELTA Ġ= Ġ 3 0 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠV IDE O _ PATH _ KEY Ġ= Ġ" video _ path _ key " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠV IDE O _ ID _ KEY Ġ= Ġ" video _ id _ key " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEL TA _ TIME Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( video Uri : ĠString , Ġvideo Id : ĠLong ): ĠVideo Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . putString ( VIDEO _ PATH _ KEY , Ġvideo Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . put Long ( VIDEO _ ID _ KEY , Ġvideo Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠVideo Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . arguments Ġ= Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmy State Phone Listener Ġ= ĠMy Phone State Listener () ĊĠĠĠ Ġval Ġtm gr Ġ= ĠMain Application . get AppContext (). getSystem Service ( Context . TELE PHONY _ SERVICE ) Ġas ? ĠTele phony Manager ĊĠĠĠ Ġvar Ġsurface Frame : ĠFrame Layout ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġfragment Container : ĠViewGroup ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġvideo View : ĠSurface View ? Ġ= Ġnull ; ĊĠĠĠ Ġvar ĠfilePath : ĠString ? Ġ= Ġnull ; ĊĠĠĠ Ġprivate Ġvar Ġvideo Id : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġlib v lc : ĠLib VL C ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmedia Player : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġvideo Width : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġvideo Height : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġm Player Listener : ĠMy Player Listener Ġ= ĠMy Player Listener ( this ) ĊĠĠĠ Ġvar Ġmax TimeIn Millis : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġvar ĠcurrentTime In Millis : ĠLong Ġ= Ġ 0 L ĊĠĠĠ Ġvar ĠprogressBar : ĠProgress Bar ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġis Seek Bar Dragging : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ// Controller : ĊĠĠĠ Ġvar Ġcontroller : ĠTouch Dispatch able Frame Layout ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġplayer Seek Bar : ĠAppCompat Seek Bar ? Ġ= Ġnull ĊĠĠĠ Ġvar ĠcurrentTime : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmax Time : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġplay Pause Switch er : ĠImage Switch er ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġplay ImageView : ĠImageView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġpause ImageView : ĠImageView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġjump Forward ImageView : ĠImageView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġjump Backward ImageView : ĠImageView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġvideo Rate Chooser : ĠImageView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġslash Time : ĠTextView ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġis Controller Visible Ġ= Ġtrue ĊĊĠĠĠ Ġvar Ġis End Reached Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġis On Start After Surface Destroyed Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġm Video Visible Height : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Video Visible Width : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Sar Num : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Sar Den : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis On Resume Direct ly After On Create Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġhide Runnable : ĠRunnable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġpre Roll Listener Ġ= ĠPre Roll Listener ( this ) ĊĠĠĠ Ġprivate Ġvar Ġneed Play Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar ĠisLoading : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġreceiver : ĠBroadcast Receiver Ġ= ĠMy Broadcast Receiver ( this ) ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġvideo Timestamp Presenter : ĠVideo WI th Timestamp Presenter ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġretain Instance Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠMain Application . component (). plus ( Video Module ()). inject ( this ) ĊĠĠĠĠĠĠĠ ĠfilePath Ġ= Ġarguments . getString ( VIDEO _ PATH _ KEY ) ĊĠĠĠĠĠĠĠ Ġvideo Id Ġ= Ġarguments . getLong ( VIDEO _ ID _ KEY ) ĊĠĠĠĠĠĠĠ Ġif Ġ( video Id Ġ!= Ġnull Ġ&& Ġvideo Id !! Ġ<= Ġ 0 L ) Ġ{ Ġ// Ġif Ġequal Ġzero Ġ-> Ġit Ġis Ġdefault , Ġit Ġis Ġnot Ġour Ġvideo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Id Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Phone State Listener () ĊĠĠĠĠĠĠĠ Ġis On Resume Direct ly After On Create Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġclass ĠMy Broadcast Receiver ( owner : ĠVideo Fragment ) Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . ACTION _ AUDIO _ BE COM ING _ NO IS Y Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Owner ?. pause Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Owner : ĠVideo Fragment ? ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Owner Ġ= Ġowner ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater ?, Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Container Ġ= Ġinflater ?. inflate ( R . layout . fragment _ video , Ġcontainer , Ġfalse ) Ġas ĠViewGroup ĊĊĠĠĠĠĠĠĠ ĠprogressBar Ġ= Ġfragment Container ?. findViewById ( R . id . load _ progressbar ) Ġas ĠProgress Bar ĊĠĠĠĠĠĠĠ ĠprogressBar ?. visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġsurface Frame Ġ= Ġfragment Container ?. findViewById ( R . id . player _ surface _ frame ) Ġas ĠFrame Layout ĊĠĠĠĠĠĠĠ Ġvideo View Ġ= Ġfragment Container ?. findViewById ( R . id . texture _ video _ view ) Ġas ĠSurface View ĊĠĠĠĠĠĠĠ Ġfragment Container ?. setOn Touch Listener Ġ{ Ġview , Ġmotion Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( true Ġ|| Ġ! isLoading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Controller (! is Controller Visible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsetup Controller ( fragment Container ) ĊĠĠĠĠĠĠĠ Ġis On Start After Surface Destroyed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠ Ġfilter . addAction ( Audio Manager . ACTION _ AUDIO _ BE COM ING _ NO IS Y ) ĊĠĠĠĠĠĠĠ Ġactivity . register Receiver ( receiver , Ġfilter ) ĊĠĠĠĠĠĠĠ Ġstart Loading () ĊĠĠĠĠĠĠĠ Ġreturn Ġfragment Container ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġhide NavigationBar ( false ) ĊĠĠĠĠĠĠĠ Ġactivity ?. requested Orientation Ġ= ĠActivity Info . SCREEN _ OR IENTATION _ FULL _ SENSOR ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView ?, ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġvideo Timestamp Presenter . attach View ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind View With Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv out Ġ= Ġmedia Player ?. v lc V out ĊĠĠĠĠĠĠĠ Ġv out ?. set Video View ( video View ) ĊĠĠĠĠĠĠĠ Ġv out ?. add Callback ( this ) ĊĠĠĠĠĠĠĠ Ġv out ?. attach Views () ĊĊĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( m Player Listener ) ĊĊĠĠĠĠĠĠĠ Ġplay Pause Switch er ?. is Clickable Ġ= Ġtrue ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠArrayList < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . add ("-- audio - time - stretch ") Ġ// Ġtime Ġstretch ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . add ("-- no - drop - late - frames ") Ġ// help Ġwhen Ġuser Ġaccel er ates Ġvideo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . add ("-- no - skip - frames ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlib v lc Ġ= ĠLib VL C ( options ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġmedia Ġplayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player Ġ= ĠMedia Player ( lib v lc ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuri : ĠUri ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠUri . from File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠUri . parse ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Ġ= ĠMedia ( lib v lc , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. media Ġ= Ġmedia ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia . release () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. rate Ġ= Ġuser Preferences . video Playback Rate . rate Float ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis End Reached Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan alytic . report Error ( An alytic . Error . ERROR _ CRE ATING _ PLAYER , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player ?. stop () ĊĠĠĠĠĠĠĠ Ġval Ġv out Ġ= Ġmedia Player ?. v lc V out ĊĠĠĠĠĠĠĠ Ġv out ?. remove Callback ( this ) ĊĠĠĠĠĠĠĠ Ġv out ?. detach Views () ĊĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( null ) ĊĠĠĠĠĠĠĠ Ġlib v lc ?. release () ĊĠĠĠĠĠĠĠ Ġlib v lc Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmedia Player ?. release () ĊĠĠĠĠĠĠĠ Ġmedia Player Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvideo Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvideo Height Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Hardware Acceleration Error ( v lc V out : ĠI VL CV out ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġan alytic . report Event ( An alytic . Video . VL C _ HARD WARE _ ERROR ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on Hardware Acceleration Error ") ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠ Ġrecreate And Pre load Player ( is Need Play After Re creating Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠTim ber . d ((" on Resume ")) ĊĠĠĠĠĠĠĠ Ġbus . register ( this ) ĊĠĠĠĠĠĠĠ Ġvideo Timestamp Presenter . show Video With Pre defined Timestamp ( video Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrecreate And Pre load Player ( is Need Play After Re creating : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġneed Play Ġ= Ġis Need Play After Re creating ĊĠĠĠĠĠĠĠ Ġval Ġkm Ġ= ĠMain Application . get AppContext (). getSystem Service ( Context . KEY GU ARD _ SERVICE ) Ġas ĠKey guard Manager ĊĠĠĠĠĠĠĠ Ġcreate Player () ĊĠĠĠĠĠĠĠ Ġbind View With Player () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! km . in Key guard Restricted Input Mode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! need Play Ġ&& Ġ! is End Reached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is On Resume Direct ly After On Create ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis On Resume Direct ly After On Create Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( m Player Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( pre Roll Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Seek Bar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Seek Bar Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġit . max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġposition By Hand Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max TimeIn Millis Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Time Ġ= Ġmax TimeIn Millis Ġ?: Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition By Hand Ġ= Ġ( currentTime In Millis . toFloat () Ġ/ Ġmax Time . toFloat ()). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position By Hand Ġ> Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition By Hand Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . progress Ġ= Ġ( max . toFloat () Ġ* Ġposition By Hand ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Controller ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on Pause ") ĊĠĠĠĠĠĠĠ Ġstop Playing Before Re creating () ĊĊĠĠĠĠĠĠĠ Ġclear Auto Hide Queue () ĊĠĠĠĠĠĠĠ Ġaudio Focus Helper . release Audio Focus () ĊĠĠĠĠĠĠĠ Ġbus . unregister ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Playing Before Re creating () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Play () Ġ// Ġbecause Ġcallback Ġnot Ġworking Ġhere ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġmedia Player ĊĠĠĠĠĠĠĠ Ġif Ġ( player Ġ== Ġnull Ġ|| Ġplayer . is Released ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime In Millis Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( player . time Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime In Millis Ġ= Ġ( media Player ?. time Ġ?: Ġ 0 L ) Ġ- ĠDEL TA _ TIME ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( currentTime In Millis Ġ< Ġ 0 L ) ĠcurrentTime In Millis Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvideo Timestamp Presenter . save Millis ( currentTime In Millis , Ġvideo Id ) ĊĠĠĠĠĠĠĠ Ġpause Player () ĊĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( null ) ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo Timestamp Presenter . detach View ( this ) ĊĠĠĠĠĠĠĠ Ġdestroy Video View () ĊĠĠĠĠĠĠĠ Ġdestroy Controller () ĊĠĠĠĠĠĠĠ Ġactivity ?. unregister Receiver ( receiver ) ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Phone State Callbacks () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sur faces Created ( v lc Out : ĠI VL CV out ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is End Reached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate And Pre load Player ( is Need Play After Re creating Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġchange Surface Layout () ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Sur faces Destroyed ( v lc Out : ĠI VL CV out ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġis On Start After Surface Destroyed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Layout ( v out : ĠI VL CV out , Ġwidth : ĠInt , Ġheight : ĠInt , Ġvisible Width : ĠInt , Ġvisible Height : ĠInt , Ġsar Num : ĠInt , Ġsar Den : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ* Ġheight Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ// Ġstore Ġvideo Ġsize ĊĠĠĠĠĠĠĠ Ġvideo Width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġvideo Height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġm Video Visible Width Ġ= Ġvisible Width ĊĠĠĠĠĠĠĠ Ġm Video Visible Height Ġ= Ġvisible Height ĊĠĠĠĠĠĠĠ Ġm Sar Num Ġ= Ġsar Num ĊĠĠĠĠĠĠĠ Ġm Sar Den Ġ= Ġsar Den ĊĠĠĠĠĠĠĠ Ġchange Surface Layout () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Surface Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( video View Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġscreen Ġsize ĊĠĠĠĠĠĠĠ Ġvar Ġw Ġ= Ġactivity . window . decor View . width . toDouble () ĊĠĠĠĠĠĠĠ Ġvar Ġh Ġ= Ġactivity . window . decor View . height . toDouble () ĊĊĠĠĠĠĠĠĠ Ġmedia Player ?. v lc V out ?. setWindow Size ( w . toInt (), Ġh . toInt ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Window (). get Decor View () Ġdoesn 't Ġalways Ġtake Ġorientation Ġinto ĊĠĠĠĠĠĠĠ Ġ// Ġaccount , Ġwe Ġhave Ġto Ġcorrect Ġthe Ġvalues ĊĠĠĠĠĠĠĠ Ġval Ġis Por trait Ġ= Ġresources . configuration . orientation Ġ== ĠConfiguration . OR IENTATION _ POR TRA IT ĊĠĠĠĠĠĠĠ Ġif Ġ( w Ġ> Ġh Ġ&& Ġis Por trait Ġ|| Ġw Ġ< Ġh Ġ&& Ġ! is Por trait ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġw ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw Ġ= Ġh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsanity Ġcheck ĊĠĠĠĠĠĠĠ Ġif Ġ( w Ġ* Ġh Ġ== Ġ 0 . toDouble () Ġ|| Ġvideo Width Ġ* Ġvideo Height Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan alytic . report Event ( An alytic . Video . INVALID _ SURFACE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġcompute Ġthe Ġaspect Ġratio ĊĠĠĠĠĠĠĠ Ġvar Ġar : ĠDouble ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġval Ġv w : ĠDouble ĊĠĠĠĠĠĠĠ Ġif Ġ( m Sar Den Ġ== Ġm Sar Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠNo Ġindication Ġabout Ġthe Ġdensity , Ġassuming Ġ 1 : 1 Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġv w Ġ= Ġm Video Visible Width . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġar Ġ= Ġm Video Visible Width . toDouble () Ġ/ Ġm Video Visible Height . toDouble () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠUse Ġthe Ġspecified Ġaspect Ġratio Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġv w Ġ= Ġm Video Visible Width Ġ* Ġm Sar Num . toDouble () Ġ/ Ġm Sar Den ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠ Ġar Ġ= Ġv w Ġ/ Ġm Video Visible Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcompute Ġthe Ġdisplay Ġaspect Ġratio ĊĠĠĠĠĠĠĠ Ġval Ġdar Ġ= Ġw Ġ/ Ġh ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġ// optimize Ġview Ġ( ORIGIN AL ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġh Ġ= Ġm Video Visible Height . toDouble () ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġw Ġ= Ġv w ĊĊĠĠĠĠĠĠĠ Ġar Ġ= Ġ 1 6 . 0 Ġ/ Ġ 9 . 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( dar Ġ< Ġar ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh Ġ= Ġw Ġ/ Ġar ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw Ġ= Ġh Ġ* Ġar ĊĊĠĠĠĠĠĠĠ Ġvar Ġlp : ĠViewGroup . LayoutParams Ġ= Ġvideo View !!. layout Params ĊĠĠĠĠĠĠĠ Ġlp . width Ġ= ĠMath . ceil ( w . toDouble () Ġ* Ġvideo Width Ġ/ Ġm Video Visible Width ). toInt () ĊĠĠĠĠĠĠĠ Ġlp . height Ġ= ĠMath . ceil ( h . toDouble () Ġ* Ġvideo Height Ġ/ Ġm Video Visible Height ). toInt () ĊĠĠĠĠĠĠĠ Ġvideo View !!. layout Params Ġ= Ġlp ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġframe Ġsize Ġ( crop Ġif Ġnecessary ) ĊĠĠĠĠĠĠĠ Ġlp Ġ= Ġsurface Frame !!. layout Params ĊĠĠĠĠĠĠĠ Ġlp . width Ġ= ĠMath . floor ( w . toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġlp . height Ġ= ĠMath . floor ( h . toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġsurface Frame !!. layout Params Ġ= Ġlp ĊĊĠĠĠĠĠĠĠ Ġvideo View ?. invalidate () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Controller ( in fl ating View : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġinfl ating View ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller Ġ= Ġit . findViewById ( R . id . player _ controller ) Ġas ĠTouch Dispatch able Frame Layout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller ?. setParent Touch Event Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Controller ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( controller Ġ== Ġnull ) Ġthrow ĠRuntimeException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller ?. setOn Touch Listener Ġ{ Ġview , Ġmotion Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Switch er Ġ= Ġcontroller ?. findViewById ( R . id . play _ pause _ switch er ) Ġas ĠImage Switch er ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause ImageView Ġ= Ġcontroller ?. findViewById ( R . id . pause _ image _ view ) Ġas ĠImageView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay ImageView Ġ= Ġcontroller ?. findViewById ( R . id . play _ image _ view ) Ġas ĠImageView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Switch er ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Play Pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Released ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjump Forward ImageView Ġ= Ġcontroller ?. findViewById ( R . id . jump _ forward _ button ) Ġas ĠImageView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjump Backward ImageView Ġ= Ġcontroller ?. findViewById ( R . id . jump _ back _ button ) Ġas ĠImageView ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjump Forward ImageView ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Jump Forward () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjump Backward ImageView ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Jump Backward () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Rate Chooser Ġ= Ġcontroller ?. findViewById ( R . id . rate _ cho oser ) Ġas ĠImageView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Rate Chooser ?. setImage Drawable ( user Preferences . video Playback Rate . icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Rate Chooser ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Choose Rate Menu ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Seek Bar ( controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġslash Time Ġ= Ġcontroller ?. findViewById ( R . id . slash _ video _ time ) Ġas ĠTextView ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= Ġcontroller ?. findViewById ( R . id . current _ video _ time ) Ġas ĠTextView ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Time Ġ= Ġcontroller ?. findViewById ( R . id . overall _ video _ time ) Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Play Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġplay Pause Switch er ?. display ed Child ĊĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINDEX _ PLAY _ IMAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( media Player ?. is Playing Ġ?: Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Player () Ġ// double Ġchecking Ġhere Ġ=( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( media Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Switch er ?. is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind View With Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Switch er ?. show Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINDEX _ PAUSE _ IMAGE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauto Hide Controller ( timeout : ĠLong Ġ= ĠTIME OUT _ BEFORE _ HIDE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġcontroller ĊĠĠĠĠĠĠĠ Ġhide Runnable ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. remove Callbacks ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( timeout Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Runnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Controller ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. post Delayed ( hide Runnable , Ġtimeout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Auto Hide Queue () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġcontroller ĊĠĠĠĠĠĠĠ Ġhide Runnable ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview ?. remove Callbacks ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Choose Rate Menu ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġan alytic . report Event ( An alytic . Video . SHOW _ CH OOSE _ RATE ) ĊĠĠĠĠĠĠĠ Ġval Ġpopup Menu Ġ= ĠPopup Menu ( Main Application . get AppContext (), Ġview ) ĊĠĠĠĠĠĠĠ Ġpopup Menu . inflate ( R . menu . video _ rate _ menu ) ĊĠĠĠĠĠĠĠ Ġpopup Menu . setOn MenuItem ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . x 0 _ 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Rate ( Video Playback Rate . x 0 _ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . x 0 _ 7 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Rate ( Video Playback Rate . x 0 _ 7 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . x 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Rate ( Video Playback Rate . x 1 _ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . x 1 _ 2 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Rate ( Video Playback Rate . x 1 _ 2 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . x 1 _ 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Rate ( Video Playback Rate . x 1 _ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . x 1 _ 7 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Rate ( Video Playback Rate . x 1 _ 7 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . x 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Rate ( Video Playback Rate . x 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpopup Menu . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Rate ( rate : ĠVideo Playback Rate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo Rate Chooser ?. setImage Drawable ( rate . icon ) ĊĠĠĠĠĠĠĠ Ġmedia Player ?. rate Ġ= Ġrate . rate Float ĊĠĠĠĠĠĠĠ Ġuser Preferences . video Playback Rate Ġ= Ġrate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġis Initi ated By Timestamp : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġon Need Show Video With Timestamp ( timestamp : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Initi ated By Timestamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime In Millis Ġ= ĠMath . max ( timestamp Ġ- ĠJ UMP _ MAX _ DELTA , Ġ 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Initi ated By Timestamp Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠ Ġrecreate And Pre load Player ( is Need Play After Re creating Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Jump Forward () Ġ{ ĊĠĠĠĠĠĠĠ Ġan alytic . report Event ( An alytic . Video . JUMP _ FORWARD ) ĊĠĠĠĠĠĠĠ Ġvar ĠcurrentTime Ġ= Ġmedia Player ?. time ĊĠĠĠĠĠĠĠ Ġif Ġ( currentTime Ġ== Ġ 0 L Ġ&& ĠcurrentTime In Millis Ġ> Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= ĠcurrentTime In Millis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmax Time Ġ= Ġmax TimeIn Millis ĊĠĠĠĠĠĠĠ Ġif Ġ( currentTime Ġ!= Ġnull Ġ&& Ġmax Time Ġ!= Ġnull Ġ&& Ġmax Time Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Time : ĠLong Ġ= ĠMath . min ( currentTime Ġ+ ĠJ UMP _ TIME _ M ILL IS , Ġmax Time Ġ- ĠJ UMP _ MAX _ DELTA ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition By Hand Ġ= Ġ( new Time . toFloat () Ġ/ Ġmax Time . toFloat ()). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Seek Bar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . progress Ġ= Ġ( it . max . toFloat () Ġ* Ġposition By Hand ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime In Millis Ġ= Ġnew Time ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Player ( release Audio Focus And Screen Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate And Pre load Player () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Jump Backward () Ġ{ ĊĠĠĠĠĠĠĠ Ġan alytic . report Event ( An alytic . Video . JUMP _ BACK WARD ) ĊĠĠĠĠĠĠĠ Ġif Ġ( media Player Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength : ĠLong Ġ= Ġmax TimeIn Millis Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime In Millis Ġ= ĠMath . max ( 0 L , Ġlength Ġ- ĠJ UMP _ TIME _ M ILL IS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Player ( release Audio Focus And Screen Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate And Pre load Player () ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠcurrentTime Ġ= Ġmedia Player ?. time Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentTime Ġ== Ġ 0 L Ġ&& ĠcurrentTime In Millis Ġ> Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= ĠcurrentTime In Millis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime In Millis Ġ= ĠMath . max ( 0 L , ĠcurrentTime . to Long () Ġ- ĠJ UMP _ TIME _ M ILL IS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Player ( release Audio Focus And Screen Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate And Pre load Player () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdestroy Video View () Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo View Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdestroy Controller () Ġ{ ĊĠĠĠĠĠĠĠ Ġplay Pause Switch er ?. setOnClickListener ( null ) ĊĠĠĠĠĠĠĠ Ġjump Backward ImageView ?. setOnClickListener ( null ) ĊĠĠĠĠĠĠĠ Ġjump Forward ImageView ?. setOnClickListener ( null ) ĊĠĠĠĠĠĠĠ Ġvideo Rate Chooser ?. setOnClickListener ( null ) ĊĠĠĠĠĠĠĠ Ġfragment Container ?. setOnClickListener ( null ) ĊĊĠĠĠĠĠĠĠ Ġfragment Container Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvideo Rate Chooser Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġjump Backward ImageView Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġjump Forward ImageView Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġplayer Seek Bar Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠcurrentTime Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmax Time Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġplay Pause Switch er Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpause ImageView Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġplay ImageView Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Seek Bar ( view : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer Seek Bar Ġ= Ġview ?. findViewById ( R . id . player _ controller _ progress ) Ġas ? ĠAppCompat Seek Bar ĊĠĠĠĠĠĠĠ Ġplayer Seek Bar ?. setOn Seek Bar ChangeListener ( object Ġ: ĠSeek Bar . On Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Position Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar , Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Player ?. is Released Ġ?: Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind View With Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Position Ġ= Ġprogress . toFloat () Ġ/ Ġseek Bar . max . toFloat () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Seek Bar Dragging Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Position Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseek To Time : ĠFloat Ġ= Ġmax TimeIn Millis ?. toFloat () Ġ?: Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime In Millis Ġ= Ġ( new Position Ġ* Ġseek To Time ). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Player ( release Audio Focus And Screen Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. set EventListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate And Pre load Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Position Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Seek Bar Dragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMy Player Listener ( owner : ĠVideo Fragment ) Ġ: ĠMedia Player . EventListener Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġowner : ĠVideo Fragment ? ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . owner Ġ= Ġowner ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġalready Timestamp ed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Event ( event : ĠMedia Player . Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġowner ?. media Player ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . Event . Paused Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" player Ġpaused ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. show Play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . Event . Playing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" player Ġplaying ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. stop Loading () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! already Timestamp ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠcurrentTime Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner ?. currentTime In Millis Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= Ġowner !!. currentTime In Millis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . length Ġ- ĠJ UMP _ MAX _ DELTA Ġ< ĠcurrentTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . time Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . time Ġ= ĠcurrentTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalready Timestamp ed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player ?. is Playing Ġ?: Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. show Pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. length ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. slash Time ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. max TimeIn Millis Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. max Time ?. text Ġ= ĠTime Util . get Formatted Video Time ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . Event . End Reached Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" player Ġend Reached ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. activity ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. is End Reached Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. show Controller ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. show Play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. length ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. currentTime ?. text Ġ= ĠTime Util . get Formatted Video Time ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. player Seek Bar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( owner ?. is Seek Bar Dragging Ġ?: Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġit . max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . progress Ġ= Ġmax ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. release Player () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. activity ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . Event . Position Changed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Pos Ġ= Ġplayer ?. position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. player Seek Bar ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( owner ?. is Seek Bar Dragging Ġ?: Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġit . max ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . progress Ġ= Ġ( max . toFloat () Ġ* Ġcurrent Pos ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . Event . Time Changed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. time ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. currentTime ?. text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTime Util . get Formatted Video Time ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . Event . Stopped Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" player Ġstopped ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Play () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( play Pause Switch er ?. display ed Child Ġ== ĠINDEX _ PAUSE _ IMAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Switch er ?. show Next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( play Pause Switch er ?. display ed Child Ġ== ĠINDEX _ PLAY _ IMAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Pause Switch er ?. show Next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpause Player ( release Audio Focus And Screen : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( media Player ?. is Playing Ġ?: Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Controller ( true , Ġis Infinite Show Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( release Audio Focus And Screen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Container ?. keep Screen On Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focus Helper . release Audio Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPre Roll Listener ( owner : ĠVideo Fragment ) Ġ: ĠMedia Player . EventListener Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġowner : ĠVideo Fragment ? ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . owner Ġ= Ġowner ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Event ( event : ĠMedia Player . Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġowner ?. media Player ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . Event . Playing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" pre Ġroll ĠPlay ing ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// m Owner ?. pause Player () // it Ġis Ġnot Ġneed , Ġbecause Ġwe Ġdo Ġnot Ġwant Ġchange Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. set EventListener ( owner ?. m Player Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. stop Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. length ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. slash Time ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. max TimeIn Millis Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. max Time ?. text Ġ= ĠTime Util . get Formatted Video Time ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. currentTime ?. text Ġ= ĠTime Util . get Formatted Video Time ( owner ?. currentTime In Millis Ġ?: Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . time Ġ= Ġowner ?. currentTime In Millis Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner ?. need Play Ġ?: Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. fragment Container ?. keep Screen On Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. audio Focus Helper ?. request Audio Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer ?. play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(!( media Player ?. is Playing Ġ?: Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Container ?. keep Screen On Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focus Helper . request Audio Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. play () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide NavigationBar ( dim : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Android Util . is H oney comb Or Later ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġvisibility Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnavbar Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Android Util . is J el ly Bean Or Later ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ ST ABLE Ġor ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ FULL SCREEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavbar Ġ= ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ HIDE _ NAV IG ATION ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( dim ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. window ?. add Flags ( WindowManager . LayoutParams . FLAG _ FULL SCREEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Android Util . is ICS Or Later ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavbar Ġ= Ġnavbar Ġor ĠView . SYSTEM _ UI _ FLAG _ LOW _ PROFILE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġvisibility Ġor ĠView . STATUS _ BAR _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Android Devices . has Com b Bar ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavbar Ġ= Ġnavbar Ġor ĠView . SYSTEM _ UI _ FLAG _ HIDE _ NAV IG ATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Android Util . is Kit K at Or Later ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġvisibility Ġor ĠView . SYSTEM _ UI _ FLAG _ IM MER SIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Android Util . is J el ly Bean Or Later ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġvisibility Ġor ĠView . SYSTEM _ UI _ FLAG _ FULL SCREEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. window ?. clear Flags ( WindowManager . LayoutParams . FLAG _ FULL SCREEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Android Util . is ICS Or Later ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġvisibility Ġor ĠView . SYSTEM _ UI _ FLAG _ VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġvisibility Ġor ĠView . STATUS _ BAR _ VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Android Devices . has NavBar ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= Ġvisibility Ġor Ġnavbar ĊĠĠĠĠĠĠĠ Ġactivity ?. window ?. decor View ?. system Ui Visibility Ġ= Ġvisibility ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Controller ( need Show : ĠBoolean , Ġis Infinite Show : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( need Show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide NavigationBar ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is End Reached Ġ|| Ġis Infinite Show Ġ|| Ġ!( media Player ?. is Playing Ġ?: Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Hide Controller (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Hide Controller () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Controller Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide NavigationBar ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Controller Visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Subscribe ĊĠĠĠ Ġfun Ġon Incoming Call ( event : ĠIncoming Call Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpause Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit Phone State Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtm gr ?. listen ( my State Phone Listener , ĠPhone State Listener . LIST EN _ CALL _ STATE ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan alytic . report Error ( An alytic . Error . INIT _ PHONE _ STATE , Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Phone State Callbacks () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtm gr ?. listen ( my State Phone Listener , ĠPhone State Listener . LIST EN _ NONE ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġan alytic . report Error ( An alytic . Error . REMOVE _ PHONE _ STATE , Ġex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Subscribe ĊĠĠĠ Ġfun Ġon Audio Focus Loss ( event : ĠAudio Focus Loss Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpause Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġan alytic . report Event ( An alytic . Video . START _ LOADING ) ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġshow Controller ( false ) ĊĠĠĠĠĠĠĠ ĠprogressBar ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġan alytic . report Event ( An alytic . Video . STOP _ LOADING ) ĊĠĠĠĠĠĠĠ ĠprogressBar ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġshow Controller ( true ) ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ }