/* Ċ Ġ* Ġ************************************************************************* Ċ Ġ* Ġ ĠFile Picker Fragment . java Ċ Ġ* Ġ************************************************************************* * Ċ Ġ* Ġ ĠCopyright ĠÂ© Ġ 2 0 1 5 ĠV LC Ġauthors Ġand ĠVideo LAN Ċ Ġ* Ġ ĠAuthor : ĠGe off rey ĠM Ã© ta is Ċ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġfree Ġsoftware ; Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ċ Ġ* Ġ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ċ Ġ* Ġ Ġthe ĠFree ĠSoftware ĠFoundation ; Ġeither Ġversion Ġ 2 Ġof Ġthe ĠLicense , Ġor Ċ Ġ* Ġ Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . Ċ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , Ċ Ġ* Ġ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof Ċ Ġ* Ġ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe Ċ Ġ* Ġ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . Ċ Ġ* Ċ Ġ* Ġ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ Ġ* Ġ Ġalong Ġwith Ġthis Ġprogram ; Ġif Ġnot , Ġwrite Ġto Ġthe ĠFree ĠSoftware Ċ Ġ* Ġ ĠFoundation , ĠInc ., Ġ 5 1 ĠFranklin ĠStreet , ĠFifth ĠFloor , ĠBoston ĠMA Ġ 0 2 1 1 0 - 1 3 0 1 , ĠUSA . Ċ Ġ* Ġ Ġ************************************************************************* ** Ċ Ġ*/ Ċ Ċ package Ġorg . vide ol an . v lc . gui . browser Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . net . to Uri Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Obsolete Cor outines Api Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . vide ol an . med iali brary . ML Service Locator Ċ import Ġorg . vide ol an . med iali brary . interfaces . media . Media Wrapper Ċ import Ġorg . vide ol an . med iali brary . media . Media Library Item Ċ import Ġorg . vide ol an . resources . Android Devices Ċ import Ġorg . vide ol an . tools . remove File Proto co le Ċ import Ġorg . vide ol an . v lc . R Ċ import Ġorg . vide ol an . v lc . gui . Content Activity Ċ import Ġorg . vide ol an . v lc . providers . Picker Type Ċ import Ġorg . vide ol an . v lc . repository . Directory Repository Ċ import Ġorg . vide ol an . v lc . util . FileUtils Ċ import Ġorg . vide ol an . v lc . view models . browser . Browser Model Ċ import Ġorg . vide ol an . v lc . view models . browser . TYPE _ P ICK ER Ċ Ċ const Ġval ĠEX TRA _ M RL Ġ= Ġ" sub _ m rl " Ċ Ċ @ Experimental Cor outines Api Ċ @ Obsolete Cor outines Api Ċ class ĠFile Picker Fragment Ġ: ĠFile Browser Fragment (), ĠBrowser Container < Media Library Item > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Fragment (): ĠFragment Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile Picker Fragment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( bundle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Activity (). intent ?. get Parcelable Extra < Media Wrapper >( KEY _ MEDIA )?. let Ġ{ Ġmedia Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media . uri Ġ== Ġnull Ġ|| Ġmedia . uri . scheme Ġ== Ġ" http " Ġ|| Ġmedia . uri . scheme Ġ== Ġ" content " Ġ|| Ġmedia . uri . scheme Ġ== Ġ" fd ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. intent Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire Activity (). intent ?. getInt Extra ( KEY _ P ICK ER _ TYPE , Ġ 0 )?. let Ġ{ Ġpicker Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicker Type Ġ= ĠP icker Type . values ()[ picker Index ] ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠP icker Type . SUB TITLE ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( bundle ) ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠFile Picker Adapter ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Browser () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this , ĠBrowser Model . Factory ( require Context (), Ġm rl , ĠTYPE _ P ICK ER , Ġfalse , Ġpicker Type Ġ= Ġpicker Type )). get ( Browser Model :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding . empty Loading . empty Text Ġ= ĠR . string . no _ subs _ found ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ! is ĠContent Activity Ġ|| Ġ( activity Ġas ĠContent Activity ). display Title ) Ġactivity ?. title Ġ= Ġget Title () ĊĠĠĠĠĠĠĠ Ġswipe Refresh Layout . isEnabled Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView , Ġposition : ĠInt , Ġitem : ĠMedia Library Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Ġ= Ġitem Ġas ĠMedia Wrapper ĊĠĠĠĠĠĠĠ Ġif Ġ( media . type Ġ== ĠMedia Wrapper . TYPE _ DIR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbrowse ( media , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpick File ( media ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġback To ( tag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tag Ġ== Ġ" root ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsupport FragmentManager Ġ= Ġrequire Activity (). support FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsupport FragmentManager . back Stack Entry Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . pop Back Stack ( tag , ĠFragment Manager . POP _ BACK _ STACK _ INCL USIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Destination ( ML Service Locator . get Abstract Media Wrapper ( tag . to Uri ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction (). detach ( this ). attach ( this ). commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . back To ( tag ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Image Click ( v : ĠView , Ġposition : ĠInt , Ġitem : ĠMedia Library Item ) Ġ{} ĊĊĠĠĠ Ġprivate Ġfun Ġpick File ( mw : ĠMedia Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= ĠIntent ( Intent . ACTION _ P ICK ) ĊĠĠĠĠĠĠĠ Ġi . putExtra ( EXTRA _ M RL , Ġmw . location ) ĊĠĠĠĠĠĠĠ Ġrequire Activity (). set Result ( Activity . RESULT _ OK , Ġi ) ĊĠĠĠĠĠĠĠ Ġrequire Activity (). finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbrowse Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Root Directory Ġ-> Ġrequire Activity (). finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm rl ?. remove File Proto co le () Ġ== ĠAndroid Devices . EXTERNAL _ PUBLIC _ DIRECTORY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm rl Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Root Directory Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . refresh () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm rl Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmw Ġ= ĠML Service Locator . get Abstract Media Wrapper ( FileUtils . getParent ( m rl )?. to Uri ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrowse ( mw , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdefine Is Root () Ġ= Ġm rl ?. run Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( startsWith (" file ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġremove File Proto co le () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Directories Ġ= Ġrun Blocking ( Dispatch ers . IO ) Ġ{ ĠDirectory Repository . getInstance ( require Context ()). get Media Directories () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( directory Ġin Ġroot Directories ) Ġif Ġ( path . startsWith ( directory )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġlength Ġ< Ġ 7 ĊĠĠĠ Ġ} Ġ?: Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġcontainer Activity () Ġ= Ġrequire Activity () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpicker Type : ĠP icker Type ĊĠĠĠ Ġoverride Ġval Ġis Network Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġval Ġis File Ġ= Ġtrue Ċ } Ċ