package Ġcom . yz . books . ui . video . player Ċ Ċ import Ġandroid . app . Progress Dialog Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Message Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroid . widget . TextView Ċ import Ġcom . google . android . ex op layer 2 . Exo Playback Exception Ċ import Ġcom . google . android . ex op layer 2 . Exo Player Ċ import Ġcom . google . android . ex op layer 2 . Player Ċ import Ġcom . google . android . ex op layer 2 . Simple Exo Player Ċ import Ġcom . google . android . ex op layer 2 . source . Concat en ating Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source Ċ import Ġcom . google . android . ex op layer 2 . source . Media Source EventListener Ċ import Ġcom . google . android . ex op layer 2 . source . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . track selection . Default Track Selector Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default DataSource Factory Ċ import Ġcom . yz . books . R Ċ import Ġcom . yz . books . api . Api Constant Ċ import Ġcom . yz . books . base . activity . Base MV V MA ct ivity Ċ import Ġcom . yz . books . base . view model . Error State Ċ import Ġcom . yz . books . base . view model . Loaded State Ċ import Ġcom . yz . books . base . view model . Loading State Ċ import Ġcom . yz . books . base . view model . State Ċ import Ġcom . yz . books . common . Constant Ċ import Ġcom . yz . books . ext . add File Host Url Ċ import Ġcom . yz . books . ext . dismiss Dialog Ċ import Ġcom . yz . books . ext . is Network Connected Ċ import Ġcom . yz . books . ext . show Toast Ċ import Ġcom . yz . books . ui . video . Video Books Model Ċ import Ġcom . yz . books . ui . video . Video Books ViewModel Ċ import Ġcom . yz . books . ui . video . bean . Video Book Chapter s Bean Ċ import Ġcom . yz . books . utils . Download Utils Ċ import Ġcom . yz . books . utils . File MD 5 Utils Ċ import Ġcom . yz . books . utils . FileUtils Ċ import Ġcom . yz . books . utils . Log Utils Ċ import Ġcom . yz . books . widget . dialog . Loading Dialog Ċ import Ġcom . yz . books . widget . dialog . Video Chapter s Dialog Ċ import Ġcom . yz . books . widget . pop . Voice Popup Window Ċ import Ġkotlinx . android . synt hetic . main . activity _ video _ player .* Ċ import Ġkotlinx . android . synt hetic . main . view _ playback _ controller .* Ċ import Ġjava . io . File Ċ import Ġjava . lang . ref . Weak Reference ĊĊ Ċ /** Ċ Ġ* Ġ è§Ĩé¢ĳ æĴŃæĶ¾ Ċ Ġ* Ċ Ġ* Ġ@ author Ġl il in Ċ Ġ* Ġ@ time Ġon Ġ 2 0 2 0 - 0 1 - 1 7 Ġ 0 8 : 3 9 Ċ Ġ*/ Ċ class ĠVideo Player Activity x Ġ: ĠBase MV V MA ct ivity < Video Books ViewModel >(), ĠPlayer . EventListener Ġ{ Ċ Ċ // region Ġvar / val ĊĊĠĠĠ Ġprivate Ġval Ġm Default DataSource Factory : ĠDefault DataSource Factory ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDefault DataSource Factory ( this , Ġ" audio / mpeg ") ĊĊĠĠĠ Ġprivate Ġval Ġm Concat en ating Media Source Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠConcat en ating Media Source () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Voice Popup Window Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠVoice Popup Window ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Player ?. volume Ġ= Ġit Ġ/ Ġ 1 0 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log Utils . e (" volume == ${ m Player ?. volume }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Video Chapter s Dialog Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠVideo Chapter s Dialog ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . configuration . orientation Ġ== ĠConfiguration . OR IENTATION _ POR TRA IT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Player Handler Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPlay Handler ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Progress Dialog Ġby Ġlazy ( Lazy Thread Safety Mode . NONE ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLoading Dialog ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Player : ĠSimple Exo Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Seek Bar : ĠSeek Bar ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Time Progress : ĠTextView ĊĊĠĠĠ Ġprivate Ġvar Ġm Video Id : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Book Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Page Num Ġ= Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵåīį æĴŃæĶ¾ çļĦ ç«ł èĬĤ ä½įç½® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Click Position Ġ= Ġ 0 Ċ Ċ // endregion Ċ Ċ // region Ġimplement Ġmethods Ċ Ċ // endregion Ċ Ċ // region Ġpublic Ġmethods ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ<= Ġ 2 3 Ġ|| Ġplayer _ view Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Exo Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer _ view ?. on Resume () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ<= Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer _ view ?. on Pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ> Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer _ view ?. on Pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġm Progress Dialog . dismiss Dialog () ĊĠĠĠĠĠĠĠ Ġm Voice Popup Window . dismiss () ĊĠĠĠĠĠĠĠ Ġm Video Chapter s Dialog . dismiss Dialog () ĊĠĠĠĠĠĠĠ Ġm Player ?. remove Listener ( this ) ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠ Ġm Player Handler . remove Callbacks And Messages ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprovider VM Class () Ġ= ĠVideo Books ViewModel () ĊĊĠĠĠ Ġoverride Ġfun Ġget Layout Id () Ġ= ĠR . layout . activity _ video _ player ĊĊĠĠĠ Ġoverride Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Seek Bar Ġ= Ġseek _ bar ĊĠĠĠĠĠĠĠ Ġm Time Progress Ġ= Ġtv _ time _ progress ĊĠĠĠĠĠĠĠ Ġinit Exo Player () ĊĊĠĠĠĠĠĠĠ Ġm Voice Popup Window . init Voice Value ( m Player ?. volume Ġ?: Ġ 0 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvideo Info Ġ= Ġintent ?. extras ?. getString ( Constant . VIDEO _ INFO _ KEY _ EXTRA ) Ġ?: Ġ"," ĊĠĠĠĠĠĠĠ Ġval Ġ( video Id , Ġvideo Name ) Ġ= Ġvideo Info . split (",") ĊĠĠĠĠĠĠĠ Ġm Video Id Ġ= Ġvideo Id . toInt OrNull () ĊĠĠĠĠĠĠĠ Ġm Book Name Ġ= Ġvideo Name ĊĠĠĠĠĠĠĠ Ġget Video Book Chapter s () ĊĠĠĠĠĠĠĠ Ġ// play Video () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init Listener () ĊĠĠĠĠĠĠĠ Ġm Player ?. addListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġm Concat en ating Media Source . addEventListener ( m Player Handler , Ġobject Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Source EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad Started ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Period Id : ĠMedia Source . Media Period Id ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Event Info : ĠMedia Source EventListener . Load Event Info ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Load Data : ĠMedia Source EventListener . Media Load Data ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Seek Bar . max Ġ= Ġm Player ?. duration ?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player Handler . send Empty Message ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġm Seek Bar . setOn Seek Bar ChangeListener ( object Ġ: ĠSeek Bar . On Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar ?, Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player ?. seek To ( seek Bar ?. progress ?. to Long () Ġ?: Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġplayer _ view . set Controller Visibility Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ back . visibility Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ video _ name . visibility Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn _ back . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġiv _ player _ previous . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// m Player ?. previous () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Pre Next Data ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġiv _ player _ next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// m Player ?. next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Pre Next Data ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġiv _ player _ play . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Player ?. is Playing Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ player _ play . setImage Resource ( R . drawable . ic _ player _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player ?. play When Ready Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player Handler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ player _ play . setImage Resource ( R . drawable . ic _ player _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player ?. play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Player Handler . send Empty Message ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġiv _ player _ voice . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Voice Popup Window . show At Bottom ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġiv _ player _ table . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Video Chapter s Dialog . show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserver Fore ver () Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġobserver UI ( state : ĠState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoading State Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoaded State Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError State Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( state . error Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Books Model . Video Book Chapter s State Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Video Book Chapter s Data ( state . pageNum , Ġstate . video Book Chapter s Bean ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Utils . e (" on Player StateChanged == $ playback State ") ĊĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠPlayer . STATE _ ENDED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ player _ play . setImage Resource ( R . drawable . ic _ player _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Pre Next Data ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Is Playing Changed ( is Playing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ player _ play . setImage Resource ( R . drawable . ic _ player _ pause ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv _ player _ play . setImage Resource ( R . drawable . ic _ player _ start ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Loading Changed ( isLoading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isLoading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Loading () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Loading () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Player Error ( error : ĠEx o Playback Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Toast ( error . message ) ĊĠĠĠĠĠĠĠ Ġiv _ player _ play . setImage Resource ( R . drawable . ic _ player _ start ) ĊĠĠĠ Ġ} Ċ Ċ // endregion Ċ Ċ // region Ġprivate Ġmethods ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Player ?. release () ĊĠĠĠĠĠĠĠ Ġm Player Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Exo Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Player Ġ= ĠSimple Exo Player ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Track Selector ( Default Track Selector ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġm Voice Popup Window . init Voice Value ( m Player ?. volume Ġ?: Ġ 0 f ) ĊĊĠĠĠĠĠĠĠ Ġplayer _ view . player Ġ= Ġm Player ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Time Progress ( player : ĠEx o Player ?, Ġtv Time Progress : ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġplayer ?. duration Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtotal Seconds Ġ= Ġduration Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġseconds Ġ= Ġtotal Seconds Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġminutes Ġ= Ġ( total Seconds Ġ/ Ġ 6 0 ) Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġtotal Time Ġ= ĠString . format ("% 0 2 d :% 0 2 d ", Ġminutes , Ġseconds ) ĊĊĠĠĠĠĠĠĠ Ġval Ġduration 1 Ġ= Ġplayer ?. current Position Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġtotal Seconds 1 Ġ= Ġduration 1 Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġseconds 1 Ġ= Ġtotal Seconds 1 Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġval Ġminutes 1 Ġ= Ġ( total Seconds 1 Ġ/ Ġ 6 0 ) Ġ% Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġvar ĠcurrentTime Ġ= ĠString . format ("% 0 2 d :% 0 2 d ", Ġminutes 1 , Ġseconds 1 ) ĊĠĠĠĠĠĠĠ Ġ// Log Utils . e (" audio == ${ time }// ${ time 1 }// ${ m Player ?. playback Parameters ?. pitch }") ĊĠĠĠĠĠĠĠ Ġif Ġ( total Seconds 1 Ġ> Ġtotal Seconds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= Ġtotal Time ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtv Time Progress . text Ġ= Ġ"$ currentTime /$ total Time " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠPlay Handler ( activity : ĠVideo Player Activity x ) Ġ: ĠHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Weak f Ġ= ĠWeak Reference < Video Player Activity x >( activity ) ĊĠĠĠĠĠĠĠ Ġval Ġplayer Activity Ġ= Ġactivity Weak f . get () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . handle Message ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player Activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg ?. what Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Activity . setTime Progress ( player Activity . m Player , Ġplayer Activity . m Time Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Activity . m Seek Bar . max Ġ= Ġplayer Activity . m Player ?. duration ?. toInt () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer Activity . m Seek Bar . progress Ġ= Ġplayer Activity . m Player ?. current Position ?. toInt () Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Empty Message Delayed ( 0 , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Video Book Chapter s () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Video Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ViewModel ?. get Video Book Chapter s ( it , Ġm Page Num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Video Book Chapter s Data ( pageNum : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Book Chapter s Bean : ĠVideo Book Chapter s Bean ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Click Position Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( video Book Chapter s Bean Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġvalue ) Ġin Ġvideo Book Chapter s Bean . video Chapter . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"${ FileUtils . getLocal Path ()} ${ value . chapter Url }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( File ( path ). exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Book Chapter s Bean . video Chapter [ index ]. downloaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Book Chapter s Bean . video Chapter [ index ]. local Path Ġ= Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* val Ġpath Ġ= Ġ"${ FileUtils . getLocal Path ()} $ m Video Id $ m Book Name " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . list Files Ġ{ Ġdir , Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" file List == $ dir /$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġvalue ) Ġin Ġvideo Book Chapter s Bean . video Chapter . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġvalue . chapter Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Book Chapter s Bean . video Chapter [ index ]. downloaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Book Chapter s Bean . video Chapter [ index ]. local Path Ġ= Ġ"$ dir /$ name " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Video Chapter s Dialog . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Chapter s ( m Book Name , Ġvideo Book Chapter s Bean ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Chapter s Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Page Num Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Video Book Chapter s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Chapter s Ġ{ Ġposition , Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Click Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Video Data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvideo Book Chapter s Bean ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġit . video Chapter [ m Click Position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Video Data ( data , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ Ĵ Ń æĶ¾ video ĊĠĠĠĠ Ġ* Ġ@ param Ġurl ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġplay Video ( url : ĠString , Ġvideo Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtv _ video _ name . text Ġ= Ġvideo Name ĊĠĠĠĠĠĠĠ Ġ// " file :/// android _ asset / test . mp 4 " ĊĠĠĠĠĠĠĠ Ġm Concat en ating Media Source . clear () ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Source Ġ= ĠProgress ive Media Source . Factory ( m Default DataSource Factory ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Media Source ( Uri . parse ( url )) ĊĠĠĠĠĠĠĠ Ġm Concat en ating Media Source . add Media Source ( media Source ) ĊĠĠĠĠĠĠĠ Ġm Player ?. play When Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġm Player ?. prepare ( m Concat en ating Media Source ) ĊĊĠĠĠĠĠĠĠ Ġm Video Chapter s Dialog . refresh Item Data ( m Click Position ," ") ĊĊĠĠĠĠĠĠĠ Ġiv _ player _ play . setImage Resource ( R . drawable . ic _ player _ pause ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¸ĭè½½ æĪĸèĢħ æĴŃæĶ¾ è§Ĩé¢ĳ ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Video Data ( data : ĠVideo Book Chapter s Bean . Video Book Chapter s Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst : ĠBoolean ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . downloaded Ġ&& Ġdata . file Md 5 String Ġ== ĠFile MD 5 Utils . getFile MD 5 ( File ( data . local Path ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Video ( data . local Path , Ġdata . chapter Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Video Chapter s Dialog . dismiss Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete File ( data . local Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Audio ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ ä¸Ĭä¸ĭ ä¸Ģ ç«ł æķ°æį® ĊĠĠĠĠ Ġ* Ġ@ param Ġnext ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Pre Next Data ( next : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġif Ġ( next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Click Position Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Click Position Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog Utils . e (" m Click Position == $ m Click Position //$ index ") ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġm Video Chapter s Dialog . get Previous Next Chapter ( index ) ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast (" å·² æĺ¯ æľĢåĲİ ä¸Ģ ç«ł äºĨ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast (" å·² æĺ¯ ç¬¬ä¸Ģ ç«ł äºĨ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( data . chapter Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Page Num ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Video Book Chapter s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Page Num ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Video Book Chapter s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Click Position Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Video Data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdownload Audio ( chapter Info : ĠVideo Book Chapter s Bean . Video Book Chapter s Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchapter Info . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! chapter Url . endsWith (". mp 4 ") Ġ|| Ġ! is Network Connected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ apply ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġchapter Url . substring ( chapter Url . lastIndexOf ("/") Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFileUtils . create TempFile ( fileName , Ġchapter Url . replace ("/ $ fileName ", Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Audio File ("$ m Video Id $ m Book Name ", ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" filepath == ${ file . path }// ${ file . exists () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġif Ġ( chapter Info . chapter Url . startsWith (" http ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Info . chapter Url . startsWith (" https ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Info . chapter Url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constant . HOST Ġ+ Ġchapter Info . chapter Url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Utils . download ( url , Ġfile . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDownload Utils . On Download Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Downloading ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( m Progress Dialog ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Showing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle (" æıĲç¤º ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Message (" æŃ£åľ¨ ä¸ĭè½½ ... è¯· èĢ Ĳ å¿ĥ çŃīå¾ħ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisIn determinate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Progress Style ( Progress Dialog . STYLE _ HORIZONTAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Button ( DialogInterface . BUTTON _ NEGATIVE , Ġ" åıĸæ¶Ī ä¸ĭè½½ ") Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Utils . m Cancel Download Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete File ( file . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Progress ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Download Failed ( msg : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" on Download Failed == $ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Dialog . dismiss Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast (" ä¸ĭè½½ å¤±è´¥ ï¼Į è¯· éĩįæĸ° ä¸ĭè½½ ï¼ģ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Download Success ( path : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Dialog . dismiss Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Utils . e (" md 5 == ${ File MD 5 Utils . getFile MD 5 ( File ( it )) }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( File MD 5 Utils . getFile MD 5 ( File ( it )) Ġ== Ġchapter Info . file Md 5 String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Video Chapter s Dialog . refresh Item Data ( m Click Position , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Video ( it , Ġchapter Info . chapter Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast (" ä¸ĭè½½ å¤±è´¥ ï¼Į è¯· éĩįæĸ° ä¸ĭè½½ ï¼ģ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . delete File ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ // endregion Ċ }