package Ġcom . hl xh . interactive vide ot ool . ui . edit Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Activity . RESULT _ OK Ċ import Ġandroid . content . Intent Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Texture View Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . GONE Ċ import Ġandroid . view . View . VISIBLE Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . view . isVisible Ċ 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 . Progress ive Media Source Ċ import Ġcom . google . android . ex op layer 2 . upstream . DataSource Ċ import Ġcom . google . android . ex op layer 2 . upstream . Default DataSource Factory Ċ import Ġcom . google . android . ex op layer 2 . util . Util Ċ Ċ import Ġcom . hl xh . interactive vide ot ool . R Ċ import Ġcom . hl xh . interactive vide ot ool . find Ċ import Ġcom . hl xh . interactive vide ot ool . from Asset Ċ import Ġcom . hl xh . interactive vide ot ool . logic . repo . Repo Ċ import Ġcom . hl xh . interactive vide ot ool . model .* Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġkotlinx . android . synt hetic . main . card _ layout . view .* Ċ import Ġkotlinx . android . synt hetic . main . edit _ episode _ frag .* Ċ import Ġjava . io . File Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* Ġ@ author Ġw ench eng ye Ġon Ġ 0 1 / 0 7 / 2 0 2 0 . Ċ Ġ*/ Ċ class ĠEdit Configure Fragment Ġ: ĠFixed Height Bottom Sheet Dialog Fragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ E PI SO DE _ ID Ġ= Ġ" episode _ id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ SCRIPT _ ID Ġ= Ġ" script _ id " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠREQUEST _ CODE _ SELECT _ VIDEO Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġoption Indicators Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠ Ġ" A ", Ġ" B ", Ġ" C ", Ġ" D " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġframe : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġepisode Id : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġarguments ?. get ( KEY _ E PI SO DE _ ID ) Ġas ? ĠString Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscript Id : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġarguments ?. get ( KEY _ SCRIPT _ ID ) Ġas ? ĠString Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġincome Episode : ĠEp isode ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvideo Url : ĠString ĊĊĠĠĠ Ġprivate Ġval Ġoption List : ĠMutable List < EditText > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġvar Ġextract Disposable : ĠDis posable ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġplayer : ĠSimple Exo Player ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠdataSource Factory : ĠDataSource . Factory ĊĊĠĠĠ Ġprivate Ġvar Ġon Save : Ġ(( episode : ĠEp isode ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . edit _ episode _ frag , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Suppress Lint (" Check Result ") ĊĠĠĠ Ġoverride Ġfun Ġon View Created ( ĊĠĠĠĠĠĠĠ Ġview : ĠView , ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Episode ( episode Id , Ġscript Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincome Episode Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind View () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ob serve () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind View () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġupdate Video Url ( income Episode . url ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġincome Episode . title . trim () ĊĠĠĠĠĠĠĠ Ġepisode _ title . setText ( title ) ĊĠĠĠĠĠĠĠ Ġepisode _ title . setSelection ( title . length ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinteract Type Ġ= Ġincome Episode . interact ?. type Ġ?: ĠQ UEST ION _ AN SW ER ĊĠĠĠĠĠĠĠ Ġif Ġ( interact Type Ġ== ĠQ UEST ION _ SELECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect _ radio _ button . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect _ container . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQA _ container . isVisible Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoption _ title . setText ( income Episode . interact ?. question Text ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġincome Episode . interact ?. option Text List ?. forEach Indexed Ġ{ Ġindex , Ġoption Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption A _ text . setText ( option ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption List . add ( option A _ text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption B _ text . setText ( option ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption List . add ( option B _ text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQA _ radio _ button . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect _ container . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQA _ container . isVisible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġquestion _ text . setText ( income Episode . interact ?. question Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanswer _ text . setText ( income Episode . interact ?. answer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// update Options Title Visible () Ġ Ġæ Ħ Ł è§ī çĶ¨ ä¸į ä¸Ĭ ĊĠĠĠĠĠĠĠ Ġupdate Edit Frame Btn Visible () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Ob serve () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd _ video _ button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpick Video () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġedit _ frame _ btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç¼ĸè¾ĳ éĢīé¡¹ ä½įç½® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( video Url . isNotEmpty () Ġ&& Ġoption List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Frame () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsave _ button _ container . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Episode () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Episode ( episode Id : ĠString , Ġscript Id : ĠString ): ĠObservable < Episode > Ġ= ĠObservable . from Callable Ġ{ ĊĠĠĠĠĠĠĠ ĠRepo . scripts . value ?. find Ġ{ Ġit . id Ġ== Ġscript Id Ġ Ġ} ?. find ( episode Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠEp isode ( id Ġ= ĠUUID . randomUUID (). toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Episode () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Episode () ĊĊĠĠĠĠĠĠĠ Ġon Save ?. invoke ( income Episode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Episode () Ġ{ ĊĠĠĠĠĠĠĠ Ġincome Episode . url Ġ= Ġvideo Url ĊĠĠĠĠĠĠĠ Ġincome Episode . title Ġ= Ġepisode _ title . text . toString () ĊĠĠĠĠĠĠĠ Ġincome Episode . interact ?. question Text Ġ= Ġquestion _ text . text . toString () ĊĊĠĠĠĠĠĠĠ Ġoption List . forEach Indexed Ġ{ Ġindex , Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincome Episode . interact ?. option Text List ?. set ( index , Ġview . text . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġpick Video () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( Intent . ACTION _ P ICK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . EXTERNAL _ CONTENT _ URI ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CODE _ SELECT _ VIDEO ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġedit Frame () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Episode () ĊĠĠĠĠĠĠĠ ĠEdit Options Activity . start ( require Context (), Ġepisode Id , Ġscript Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Video Url ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo Url Ġ= Ġurl ĊĠĠĠĠĠĠĠ Ġif Ġ( video Url . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġextract Frame ( url ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd _ video _ button . setImage Resource ( R . drawable . ic _ launcher _ background )// è®¾ èĥĮæĻ¯ åĽ¾ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Edit Frame Btn Visible () Ġ{ ĊĠĠĠĠĠĠĠ Ġedit _ frame _ btn . visibility Ġ= ĠVIS IBLE Ċ // ĠĠĠĠĠĠĠ Ġedit _ frame _ btn . visibility Ġ= Ġif Ġ( video Url . isNotEmpty () Ġ&& Ġoption List . isNotEmpty ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠVIS IBLE Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠG ONE Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Options Title Visible () Ġ{ ĊĠĠĠĠĠĠĠ Ġoption _ title . visibility Ġ= Ġif Ġ( option List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG ONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠRESULT _ OK Ġ&& Ġrequest Code Ġ== ĠREQUEST _ CODE _ SELECT _ VIDEO ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. data ?. to Video Path ( require Activity ()) ?. take If Ġ{ Ġit . isNotEmpty () Ġ} ?. let Ġ{ Ġurl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Video Url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Edit Frame Btn Visible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Frame ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// èĩªåĬ¨ æĬ½ å¸ § ĊĠĠĠĠĠĠĠ Ġextract Disposable ?. dispose () ĊĠĠĠĠĠĠĠ Ġextract Disposable Ġ= ĠSingle . create < Unit > Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Player () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . addListener ( object Ġ: ĠPlayer . EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Player StateChanged ( play When Ready : ĠBoolean , Ġplayback State : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠPlayer . STATE _ READY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . seek To ( player . duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( playback State Ġ== ĠPlayer . STATE _ ENDED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . seek To ( player . duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Seek Processed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare ( Progress ive Media Source . Factory ( dataSource Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Media Source ( if Ġ( url . startsWith ("/ ")) ĠUri . from File ( File ( url )) Ġelse Ġfrom Asset ( url ))) ĊĠĠĠĠĠĠĠ Ġ}. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Ġ= Ġ( player _ view . video Surface View Ġas ĠTexture View ). bitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd _ video _ button . setImage Bitmap ( frame ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: player . isInitialized ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġplayer Ġ= ĠSimple Exo Player . Builder ( require Context ()). build () ĊĠĠĠĠĠĠĠ Ġplayer _ view . player Ġ= Ġplayer ĊĊĠĠĠĠĠĠĠ ĠdataSource Factory Ġ= Ġ ĠDefault DataSource Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtil . getUser Agent ( require Context (), Ġ" your Application Name ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġplayer . play When Ready Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: player . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Save ( action : Ġ( episode : ĠEp isode ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Save Ġ= Ġaction Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( episode Id Ġ== Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġedit Configure Fragment . dismiss () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Node ( it , ĠOPTION _ TYPE _ E PI SO DE ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġedit Configure Fragment . dismiss () Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġupdate View () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠUri . to Video Path ( activity : ĠActivity ): ĠString Ġ{ ĊĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( Media Store . Video . Media . DATA ) ĊĠĠĠ Ġval Ġcursor : ĠCursor Ġ= Ġ Ġactivity . managed Query ( this , Ġprojection , Ġnull , Ġnull , Ġnull ) ĊĠĠĠ Ġval ĠcolumnIndex : ĠInt Ġ= Ġcursor . getColumnIndex OrThrow ( Media Store . Video . Media . DATA ) ĊĠĠĠ Ġcursor . moveTo First () ĊĠĠĠ Ġreturn Ġcursor . getString ( column Index ) Ċ }