package Ġcom . ky l ent t . medi ap layer . helper . external . providers Ċ Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . provider . Open able Columns Ċ import Ġandroidx . core . net . to Uri Ċ import Ġcom . ky l ent t . medi ap layer . Build Config Ċ import Ġcom . ky l ent t . medi ap layer . helper . Preconditions . check Argument Ċ import Ġcom . ky l ent t . medi ap layer . helper . Version Helper Ċ import Ġok io . IOException Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . net . URL Decoder Ċ Ċ object ĠContent Providers Helper Ġ{ ĊĠ Ġconst Ġval Ġstorage Path Ġ= Ġ"/ storage " ĊĠ Ġconst Ġval Ġex ter al Storage Path Ġ= Ġ"/ storage / em ulated / 0 " ĊĠ Ġconst Ġval Ġcontent Scheme Ġ= ĠContent Resolver . SCHEME _ CONTENT ĊĠ Ġconst Ġval Ġfile Scheme Ġ= ĠContent Resolver . SCHEME _ FILE ĊĊĠ Ġ@ Jvm Static ĊĠ Ġval Ġstorage Dir ĊĠĠĠ Ġget () Ġ= Ġget Device Storage () ĊĊĠ Ġ@ Jvm Static ĊĠ Ġval Ġexternal Storage Dir ĊĠĠĠ Ġget () Ġ= ĠEnvironment . get External Storage Directory () ĊĠĠĠĠĠ Ġ?: Ġif Ġ( File ( ex ter al Storage Path ). exists ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ( ex ter al Storage Path ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġval Ġstorage Dir String ĊĠĠĠĠ Ġget () Ġ= Ġstorage Dir . toString () ĊĊĠ Ġ@ Jvm Static ĊĠ Ġval Ġexternal Storage Dir String ĊĠĠĠĠ Ġget () Ġ= Ġ( external Storage Dir Ġ?: Ġex ter al Storage Path ). toString () ĊĊĠ Ġ@ Jvm Static ĊĠ Ġval Ġmedia Audio Content Uri Prefix ĊĠĠĠ Ġget () Ġ= ĠMedia Store . Audio . Media . EXTERNAL _ CONTENT _ URI Ġ?: Ġ" content :// media / external / audio / media " ĊĊ ĉ private Ġfun Ġget Device Storage (): ĠFile ? Ġ{ Ċĉ ĉ if Ġ( Version Helper . has R ()) Ġreturn ĠEnvironment . get Storage Directory () ĊĊĉ ĉ val Ġstorage Ġ= ĠFile ( storage Path ) Ċĉ ĉ if Ġ( storage . exists ()) Ġreturn Ġstorage ĊĊĉ ĉ val Ġext Storage Ġ= ĠEnvironment . get External Storage Directory () Ġ?: ĠFile ( ex ter al Storage Path ) Ċĉ ĉ return Ġif Ġ( ext Storage . exists ()) Ġ{ Ċĉĉ ĉ val Ġsplit Ġ= Ġext Storage . toString (). split ("/") Ċĉĉ ĉ val Ġf Ġ= ĠFile ("/ ${ split . first () }") Ċĉĉ ĉ if Ġ( f . exists ()) Ġf Ġelse Ġnull Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ null Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Jvm Static Ċ ĉ fun Ġis Content Uri Exist ( context : ĠContext , Ġuri : ĠUri ): ĠBoolean Ġ{ Ċĉ ĉ return Ġtry Ġ{ Ċĉĉ ĉ context . content Resolver . open InputStream ( uri ) !!. close () Ċĉĉ ĉ true Ċĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ċĉĉ ĉ when Ġ( e ) Ġ{ Ċĉĉĉ ĉ is ĠIOException Ġ-> Ġfalse Ċĉĉĉ ĉ is ĠNullPointerException Ġ-> Ġ{ Ċĉĉĉĉ ĉ Tim ber . e (" N PE Ġis Ġthrown Ġinstead Ġof ĠIOException ") Ċĉĉĉĉ ĉ false Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉĉ ĉ if Ġ( Build Config . DEBUG ) Ġthrow ĠIllegalStateException (" Un caught ĠException : Ġ\ n ${ e }") Ċĉĉĉĉ ĉ false Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġis Media Audio Uri ( uri : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġis Media Audio Uri ( uri . toString ()) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġis Media Audio Uri ( uri : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġuri . startsWith ( media Audio Content Uri Prefix . toString ()) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġis Scheme Content Uri ( uri : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġis Scheme Content Uri ( uri . toString ()) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġis Scheme Content Uri ( uri : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġuri . startsWith ( content Scheme ) ĊĠ Ġ} ĊĊ ĉ @ Jvm Static Ġfun Ġget Decoded Content Uri ( uri : ĠUri , Ġcontext : ĠContext , ĠfileName : ĠString ?): ĠUri Ġ= Ċĉ ĉ get Decoded Content Uri ( uri . toString (), Ġcontext , ĠfileName ). to Uri () ĊĊ ĉ @ Jvm Static Ċ ĉ fun Ġget Decoded Content Uri ( uri String : ĠString , Ġcontext : ĠContext , ĠfileName : ĠString ?): ĠString Ġ{ Ċĉ ĉ check Argument ( is Scheme Content Uri ( uri String )) Ċĉ ĉ val Ġuri Ġ= ĠUri . parse ( uri String ) Ċĉ ĉ val Ġn Filename Ġ= ĠfileName Ċĉĉ ĉ ?: Ġcontext . content Resolver . query ( uri , Ġnull , Ġnull , Ġnull Ġ, null )?. use Ġ{ Ġcursor Ġ-> Ċĉĉĉ ĉ cursor . moveTo First () Ċĉĉĉ ĉ val Ġindex Ġ= Ġcursor . getColumnIndex OrThrow ( Open able Columns . DISPLAY _ NAME ) Ċĉĉĉ ĉ cursor . getString ( index ) Ċĉĉ ĉ } ĊĊĉ ĉ var Ġdecode Times Ġ= Ġ 0 Ċĉ ĉ var Ġdecoded Uri String : ĠString Ġ= Ġuri String ĊĊĉ ĉ when Ġ{ Ċĉĉ ĉ n Filename Ġ== Ġnull Ġ-> Ġ{ Ċĉĉĉ ĉ throw ĠIllegalStateException (" Could Ġnot Ġretrieve ĠFileName Ġ($ fileName ) Ġfor Ġ$ uri String Ġis Ġnull ") Ċĉĉ ĉ } Ċĉĉ ĉ n Filename . contains ("% ") Ġ|| Ġn Filename . contains ("% ") Ġ-> Ġ{ Ċĉĉĉ ĉ var Ġtimes Ġ= Ġ 0 Ċĉĉĉ ĉ if Ġ( n Filename . contains ("% 2 5 ") Ġ&& Ġ! n Filename . contains ("% 2 5 Ġ")) Ġtimes ++ Ċĉĉĉ ĉ decode Times Ġ+= Ġtimes Ċĉĉ ĉ } Ċĉĉ ĉ uri String . contains ("% ") Ġ-> Ġ{ Ċĉĉĉ ĉ var Ġtimes Ġ= Ġ 1 Ċĉĉĉ ĉ if Ġ( n Filename . contains ("% 2 5 ") Ġ&& Ġ! n Filename . contains ("% 2 5 Ġ")) Ġtimes ++ Ċĉĉĉ ĉ decode Times Ġ+= Ġtimes Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ repeat ( decode Times ) Ġ{ Ġdecoded Uri String Ġ= Ġdecode Uri ( decoded Uri String ) Ġ} ĊĊĉ ĉ Tim ber . d (" get Decoded Content Uri Ġreturning Ġ$ decoded Uri String ") Ċĉ ĉ return Ġdecoded Uri String Ċ ĉ } ĊĊ ĉ private Ġfun Ġdecode Uri ( uri String : ĠString ) Ġ= ĠURL Decoder . decode ( uri String , Ġ" UTF - 8 ") Ċ Ċ } ĊĊĊ