package Ġcom . kp stv . y ts . ui . activities Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . text . Html Compat Ċ import Ġandroidx . core . view . do On Layout Ċ import Ġandroidx . core . view . draw To Bitmap Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . github . se _ b ast ia an . torrent stream . Stream Status Ċ import Ġcom . github . se _ b ast ia an . torrent stream . Torrent Ċ import Ġcom . github . se _ b ast ia an . torrent stream . Torrent Options Ċ import Ġcom . github . se _ b ast ia an . torrent stream . Torrent Stream Ċ import Ġcom . github . se _ b ast ia an . torrent stream . listeners . Torrent Listener Ċ import Ġcom . kp stv . common _ movies y . extensions .* Ċ import Ġcom . kp stv . common _ movies y . extensions . utils . Window Utils Ċ import Ġcom . kp stv . y ts . App Interface . Companion . AN ONY MO US _ TOR RENT _ DOWNLOAD Ċ import Ġcom . kp stv . y ts . App Interface . Companion . STREAM _ LOCATION Ċ import Ġcom . kp stv . y ts . App Interface . Companion . SUB TITLE _ LOCATION Ċ import Ġcom . kp stv . y ts . R Ċ import Ġcom . kp stv . y ts . data . models . Sub Holder Ċ import Ġcom . kp stv . y ts . databinding . Activity Torrent Player Binding Ċ import Ġcom . kp stv . y ts . extensions . utils . Subtitle Utils Ċ import Ġcom . kp stv . y ts . ui . helpers . Continue Watcher Helper Ċ import Ġcom . kp stv . y ts . ui . view models . Main ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġes . dm oral . toast y . Toast y Ċ import Ġt ck ing . github . com . gir affe player 2 . G ir affe Player Ċ import Ġt ck ing . github . com . gir affe player 2 . Player Listener Ċ import Ġt ck ing . github . com . gir affe player 2 . Video Info Ċ import Ġtv . dan mak u . ijk . media . player . I jk Timed Text Ċ import Ġjava . io . File Ċ Ċ /** Ġ@ Usage Ċ Ġ* Ċ Ġ* Ġ ĠPass Ġ" torrent Link " Ġand Ġ" sub " ĠfilePath Ġ( optional ) Ċ Ġ* Ġ ĠPass Ġ" normal Link " Ġ( filePath ) Ġand Ġ" sub " ĠfilePath Ġ( optional ) Ċ Ġ* Ċ Ġ*/ Ċ @ Suppress Lint (" SetText I 1 8 n ") Ċ @ Android EntryPoint Ċ class ĠT orrent Player Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ TOR RENT _ LINK Ġ= Ġ" com . kp stv . y ts . arg _ torrent _ link " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ NORMAL _ LINK Ġ= Ġ" com . kp stv . y ts . arg _ normal _ link " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ MOV IE _ ID Ġ= Ġ" com . kp stv . y ts . arg _ movie _ id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ MOV IE _ TITLE Ġ= Ġ" com . kp stv . y ts . arg _ movie _ title " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ TOR RENT _ HASH Ġ= Ġ" com . kp stv . y ts . arg _ torrent _ hash " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ LAST _ SAVE _ POS Ġ= Ġ" com . kp stv . y ts . arg _ last _ save _ pos " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ SUB TITLE _ NAME Ġ= Ġ" com . kp stv . y ts . arg _ subtitle _ name " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLAST _ POSITION Ġ= Ġ" com . kp stv . y ts . last _ position " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġview Models < Main ViewModel >() ĊĠĠĠ Ġprivate Ġval Ġbinding Ġby Ġview Binding ( Activity Torrent Player Binding :: inflate ) ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Torrent Player Activity " ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtorrent Stream : ĠT orrent Stream ĊĠĠĠ Ġprivate Ġvar Ġlast Progress Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsub Hold ers : ĠArrayList < Sub Holder > ĊĠĠĠ Ġprivate Ġvar Ġsubtitle Handler Ġ= ĠHandler () ĊĠĠĠ Ġprivate Ġvar Ġmodels : ĠArrayList < Sub Holder > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġvar Ġlast Subtitle Position : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhash : ĠString ĊĠĠĠ Ġprivate Ġvar Ġhas Subtitle : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Loaded from Last : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġlast Pause Position : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġsleep : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar ĠfilePath : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġis Local Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmovie Title : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġmovie Id : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontinue Watcher Helper : ĠContinue Watcher Helper ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġcontinue Watcher Helper Ġ= ĠContinue Watcher Helper ( this , Ġthis ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġbinding . subtitle . text Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ/** ĠHere Ġwe Ġretrieve Ġlast Ġsaved Ġposition Ġfrom Ġdatabase Ġ( if Ġexist ). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġintent . getInt Extra ( ARG _ LAST _ SAVE _ POS , Ġ 0 ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Pause Position Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Subtitle Position Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Loaded from Last Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠsavedInstanceState ?. getInt ( LAST _ POSITION )?. let Ġ{ Ġlast Pause Position Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCheck Ġif Ġthe Ġcallback Ġis Ġfor Ġtorrent Link Ġand Ġrecreate Ġthat Ġmethods . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġintent . getString Extra ( ARG _ TOR RENT _ LINK )?. let Ġ{ Ġtorrent Link Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtorrent Specific ( torrent Link ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĊĠĠĠĠĠĠĠ Ġ/** ĠCheck Ġif Ġthe Ġcallback Ġis Ġfor Ġnormal Link Ġi . e Ġplaying Ġfrom Ġlocal Ġstorage . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġintent . getString Extra ( ARG _ NORMAL _ LINK )?. let Ġ{ ĠfilePath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Local Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . filePath Ġ= ĠfilePath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Text . hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= Ġintent . getString Extra ( ARG _ TOR RENT _ HASH ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Title Ġ= Ġintent . getString Extra ( ARG _ MOV IE _ TITLE ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Id Ġ= Ġintent . getInt Extra ( ARG _ MOV IE _ ID , Ġmovie Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Player ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠToast y . error ( this , Ġ" Could Ġnot Ġfigure Ġout Ġthe Ġtype "). show () ĊĊĠĠĠĠĠĠĠ Ġ/** ĠGetting Ġsubtitle Ġlocal Ġpath Ġand Ġparsing Ġsub titles . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġintent ?. getString Extra ( ARG _ SUB TITLE _ NAME )?. let Ġ{ Ġfilename Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Subtitle Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Hold ers Ġ= ĠSub title Utils . parse Sub titles ( File ( SUB TITLE _ LOCATION , Ġfilename ). path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! :: sub Hold ers . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . subtitle . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠIf Ġthis Ġhas Ġsub titles Ġwe Ġwill Ġstart Ġa Ġhandler Ġwhich Ġwill Ġshow Ġthe Ġsub titles . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Handler () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Handler . post Delayed ( update Task , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġbinding . gir affe Player . findViewById < ImageView >( R . id . app _ video _ finish ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! binding . gir affe Player . player . on Back Pressed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => Ġon Pause () Ġcalled ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filePath Ġ== Ġnull ) Ġreturn Ġsuper . on Pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsleep Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠHere Ġwe Ġare Ġsaving Ġcurrent Ġplayer Ġposition Ġto Ġdatabase , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ Ġso Ġthat Ġwe Ġcan Ġretrieve Ġand Ġshow ĠPlay Ġfrom Ġcheckbox Ġin Ġbottom Ġsheet . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġbinding . gir affe Player . player . current Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Pause Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => ĠLast Saved Position : Ġ$ position ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Download ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash , Ġtrue , Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Subtitle ) Ġsubtitle Handler . remove Callbacks ( update Task ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ ĠWindow Utils . activate FullScreen ( this ) Ġ// ĠFor Ġdevices Ġthat Ġhas Ġnavigation Ġbutton Ġoverlay ĊĠĠĠĠĠĠĠ Ġlast Subtitle Position Ġ= Ġlast Pause Position ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Resume () Ġcalled Ġ$ last Pause Position ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( filePath Ġ== Ġnull ) Ġreturn Ġsuper . on Resume () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sleep ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsleep Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Player ( file , Ġfile . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ) Ġ{} ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThis Ġfunction Ġis Ġused Ġto Ġstream Ġtorrent Ġfiles Ġin Ġexternal Ġcache Ġdir . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtorrent Specific ( link : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstore Location Ġ= ĠFile ( external Cache Dir , ĠST REAM _ LOCATION ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtorrent Options Ġ= ĠT orrent Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. auto Download ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. save Location ( store Location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Files After Stop ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. anonymous Mode ( AN ONY MO US _ TOR RENT _ DOWNLOAD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThere Ġis Ġan Ġissue Ġthat Ġwhenever Ġplayer Ġis Ġloading Ġand Ġuser Ġclicks Ġon Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġplayer Ġduring Ġload . ĠIt Ġcrashes , Ġso Ġthis Ġis Ġan Ġattempt Ġto Ġfix Ġit Ġby Ġfirst ĊĠĠĠĠĠĠĠĠ Ġ* Ġdisabling Ġroot Ġview Ġto Ġaccept Ġany Ġtouch . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġwill Ġbe Ġenabled Ġwhen Ġstream Ġis ĠReady . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġbinding . gir affe Player . invisible () ĊĊĠĠĠĠĠĠĠ Ġtorrent Stream Ġ= ĠT orrent Stream . init ( torrent Options ) ĊĠĠĠĠĠĠĠ Ġtorrent Stream . addListener ( torrent Stream Listener ) ĊĠĠĠĠĠĠĠ Ġtorrent Stream . start Stream ( link ) ĊĠĠĠĠĠĠĠ ĠToast y . info ( this , ĠgetString ( R . string . torrent _ connect _ attempt )). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtorrent Stream Listener Ġ= Ġobject Ġ: ĠT orrent Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Prepared ( torrent : ĠT orrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Stream Prepared () Ġcalled Ġwith : Ġtorrent Ġ= Ġ[$ torrent ]") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . info ( this @ Torrent Player Activity , ĠgetString ( R . string . torrent _ connect _ success )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Started ( torrent : ĠT orrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Stream Started () Ġcalled Ġwith : Ġtorrent Ġ= Ġ[$ torrent ]") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Error ( torrent : ĠT orrent ?, Ġe : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Stream Error () Ġcalled Ġwith : Ġtorrent Ġ= Ġ[$ torrent ], Ġe Ġ= Ġ[$ e ]") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . error ( this @ Torrent Player Activity , Ġ" Torrent Ġstream Ġerror : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Ready ( torrent : ĠT orrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Stream Ready () Ġcalled Ġwith : Ġtorrent Ġ= Ġ[$ torrent ]") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠStream Ġready Ġso Ġstart Ġthe Ġplayer Ġfrom Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath Ġ= Ġtorrent . video File . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Player ( torrent . video File , Ġtorrent . video File . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠShow ing Ġthe Ġtorrent Ġplayer Ġonly Ġwhen Ġmovie Ġis Ġready Ġto Ġstream Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . gir affe Player . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Progress ( torrent : ĠT orrent , Ġstatus : ĠStream Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Progress Ġ!= Ġstatus . progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Stream Progress () Ġ=> Ġ${ status . progress }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Progress Ġ= Ġstatus . progress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Text . text Ġ= Ġ"${ "% . 2 f ". format ( last Progress )} %" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Progress . toInt () Ġ>= Ġ 9 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Text . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stream Stopped () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Stream Stopped () Ġcalled ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġcommon Ġfunction Ġto Ġload Ġplayer ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Player ( file : ĠFile , Ġtitle : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . progress Bar . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Info Ġ= ĠVideo Info ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Top Bar ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set AspectRatio ( Video Info . AR _ AS PECT _ FILL _ PARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Bg Color ( color From ( android . R . color . black )) ĊĊĠĠĠĠĠĠĠ Ġbinding . gir affe Player . player Listener Ġ= Ġlistener ĊĊĠĠĠĠĠĠĠ Ġbinding . gir affe Player . video Info ( video Info ). player . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġprefetch Ġfor Ġsubtitle ĠHandler Ġis Ġdone Ġhere . ĊĠĠĠĠ Ġ* Ġ ĠIt Ġis Ġalso Ġcalled Ġwhen Ġthere Ġis Ġa Ġchange Ġin Ġplayer Ġseek . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandler Handler () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" handler Handler () Ġcalled ") ĊĠĠĠĠĠĠĠ Ġbinding . subtitle . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( last Subtitle Position Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels Ġ= ĠArrayList ( sub Hold ers ) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġbinding . gir affe Player . player . current Position ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Hold ers . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . startTime Ġ>= Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Sub Holder Size : Ġ${ sub Hold ers . size }, ĠModel Ġsize : Ġ${ models . size }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġhandler Ġwhich Ġwill Ġshow Ġsubtitle . ĠA Ġcode Ġwhich Ġworks Ġperfect Ġbut Ġnow ĊĠĠĠĠ Ġ* Ġ ĠI Ġam Ġtoo Ġlazy Ġto Ġunderstand Ġit Ġagain . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġsub Showing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġupdate Task : ĠRunnable Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding . gir affe Player . is Current Active Player Ġ&& Ġ! sleep ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Position Ġ= Ġbinding . gir affe Player . player !!. current Position ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Position Ġ< Ġlast Subtitle Position Ġ|| Ġcurrent Position Ġ> Ġlast Subtitle Position Ġ+ Ġ 7 Ġ* Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠPlayer Ġeither Ġseek To Ġbackwards Ġ Ġ|| Ġcurrent Position Ġ> Ġlast Post ion Ġ+ Ġ 1 0 0 0 */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => ĠPlayer Ġseek To Ġchange ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Showing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// binding . gir affe Player . player . pause () ĠTODO : ĠWhy Ġwe Ġneeded Ġthis ĠI Ġdon 't Ġknow Ġbut Ġit 's Ġcausing Ġproblem . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Handler () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠĠ Ġif Ġ( no Player Start Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Player Start Handler Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġbinding . gir affe Player . player . start () */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( models . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! sub Showing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Position Ġ>= Ġmodels [ 0 ]. startTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . subtitle . text Ġ= ĠHtml Compat . from Html ( models [ 0 ]. text , ĠHtml Compat . FROM _ HTML _ MODE _ COMP ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Showing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( sub Showing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Position Ġ>= Ġmodels [ 0 ]. endTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . subtitle . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Showing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Subtitle Position Ġ= Ġcurrent Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Handler . post Delayed ( this , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Torrent Player Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Subtitle Ġcr ashed Ġdue Ġto : Ġ${ e . message }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast y . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Handler . remove Callbacks ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġbinding . gir affe Player . player . current Display . bitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue Watcher Helper . save ( bitmap , Ġbinding . root . root View Ġas ĠFrame Layout , Ġget Watcher ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġsuper . on Back Pressed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Local Ġ&& Ġ! continue Watcher Helper . is Saved ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġbinding . gir affe Player . player . current Display . bitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue Watcher Helper . save Sil ent ( bitmap , Ġget Watcher ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . gir affe Player . player . release () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => ĠError : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: torrent Stream . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtorrent Stream . remove Listener ( torrent Stream Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtorrent Stream . stop Stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => ĠError : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsubtitle Handler . remove Callbacks ( update Task ) ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠA Ġcallback Ġto Ġmanage Ġplayer . ĠThis Ġwill Ġalso Ġseek Ġthe Ġplayer Ġto ĊĠĠĠĠ Ġ* Ġ Ġlast Ġsaved Ġposition Ġif Ġnot Ġ 0 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġno Player Start Handler Ġ= Ġfalse ĊĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠPlayer Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Timed Text ( gir affe Player : ĠG ir affe Player ?, Ġtext : ĠI jk Timed Text ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Prepared ( gir affe Player : ĠG ir affe Player ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => Ġon Prepared Ġ$ last Pause Position ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgir affe Player ?. seek To ( last Pause Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Release ( gir affe Player : ĠG ir affe Player ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Completion ( gir affe Player : ĠG ir affe Player ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pause ( gir affe Player : ĠG ir affe Player ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lazy Load Error ( gir affe Player : ĠG ir affe Player ?, Ġmessage : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Target StateChange ( old State : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Display Model Change ( old Model : ĠInt , Ġnew Model : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Seek Complete ( gir affe Player : ĠG ir affe Player ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => ĠSeek Change () Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Pause Position Ġ!= Ġ 0 Ġ&& Ġ! is Loaded from Last ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgir affe Player ?. pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Player Start Handler Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Subtitle ) Ġsubtitle Handler . post Delayed ( update Task , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Loaded from Last Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . gir affe Player . player Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Info ( gir affe Player : ĠG ir affe Player ?, Ġwhat : ĠInt , Ġextra : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => ĠInfo () ĠWhat Ġ= Ġ$ what Ġ& ĠExtra Ġ= Ġ$ extra ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Buffer ing Update ( gir affe Player : ĠG ir affe Player ?, Ġpercent : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Current StateChange ( old State : ĠInt , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lazy Load Progress ( gir affe Player : ĠG ir affe Player ?, Ġprogress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( gir affe Player : ĠG ir affe Player ?, Ġwhat : ĠInt , Ġextra : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" => ĠOn Error () ĠWhat Ġ= Ġ$ what Ġ& ĠExtra Ġ= Ġ$ extra ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre paring ( gir affe Player : ĠG ir affe Player ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart ( gir affe Player : ĠG ir affe Player ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State . put Int ( LAST _ POSITION , Ġlast Pause Position ) ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Watcher () Ġ= ĠContinue Watcher Helper . Watcher ( movie Id , Ġmovie Title , Ġbinding . gir affe Player . player . current Position ) Ċ } Ċ