/* Ċ Ġ* ĠFile Helper . kt Ċ Ġ* ĠImplements Ġthe ĠFile Helper Ġobject Ċ Ġ* ĠA ĠFile Helper Ġprovides Ġhelper Ġmethods Ġfor Ġreading Ġand Ġwriting Ġfiles Ġfrom Ġand Ġto Ġdevice Ġstorage Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof Ċ Ġ* ĠTRAN SI STOR Ġ- ĠRadio ĠApp Ġfor ĠAndroid Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 5 - 2 1 Ġ- ĠY 2 0 K . org Ċ Ġ* ĠLicensed Ġunder Ġthe ĠMIT - License Ċ Ġ* Ġhttp :// opensource . org / licenses / MIT Ċ Ġ*/ ĊĊ Ċ package Ġorg . y 2 0 k . trans istor . helpers Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Open able Columns Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . core . net . to Uri Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . y 2 0 k . trans istor . Keys Ċ import Ġorg . y 2 0 k . trans istor . core . Collection Ċ import Ġorg . y 2 0 k . trans istor . core . Station Ċ import Ġjava . io .* Ċ import Ġjava . net . URL Ċ import Ġjava . text . NumberFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ import Ġkotlin . math . ln Ċ import Ġkotlin . math . pow ĊĊ Ċ /* Ċ Ġ* ĠFile Helper Ġobject Ċ Ġ*/ Ċ object ĠFile Helper Ġ{ ĊĊĠĠĠ Ġ/* ĠDefine Ġlog Ġtag Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠTAG : ĠString Ġ= ĠLog Helper . make Log Tag ( File Helper :: class . java ) ĊĊĊĠĠĠ Ġ/* ĠReturn Ġan ĠInputStream Ġfor Ġgiven ĠUri Ġ*/ ĊĠĠĠ Ġfun ĠgetText FileStream ( context : ĠContext , Ġuri : ĠUri ): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstream Ġ: ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream Ġ= Ġcontext . content Resolver . open InputStream ( uri ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstream ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠGet Ġfile Ġsize Ġfor Ġgiven ĠUri Ġ*/ ĊĠĠĠ Ġfun Ġget FileSize ( context : ĠContext , Ġuri : ĠUri ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcursor : ĠCursor ? Ġ= Ġcontext . content Resolver . query ( uri , Ġnull , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Index : ĠInt Ġ= Ġcursor . getColumnIndex ( Open able Columns . SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize : ĠLong Ġ= Ġcursor . getLong ( size Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠGet Ġfile Ġname Ġfor Ġgiven ĠUri Ġ*/ ĊĠĠĠ Ġfun Ġget FileName ( context : ĠContext , Ġuri : ĠUri ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcursor : ĠCursor ? Ġ= Ġcontext . content Resolver . query ( uri , Ġnull , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Index : ĠInt Ġ= Ġcursor . getColumnIndex ( Open able Columns . DISPLAY _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . moveTo First () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġ= Ġcursor . getString ( name Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠGet Ġcontent Ġtype Ġfor Ġgiven Ġfile Ġ*/ ĊĠĠĠ Ġfun Ġget ContentType ( context : ĠContext , Ġuri : ĠUri ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġget Ġfile Ġtype Ġfrom Ġcontent Ġresolver ĊĠĠĠĠĠĠĠ Ġvar ĠcontentType : ĠString Ġ= Ġcontext . content Resolver . getType ( uri ) Ġ?: ĠKeys . MIME _ TYPE _ UNSUPPORTED ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠcontentType . toLowerCase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( contentType Ġ!= ĠKeys . MIME _ TYPE _ UNSUPPORTED Ġ&& Ġ! contentType . contains ( Keys . MIME _ TYPE _ OCT ET _ STREAM )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġthe Ġfound Ġcontent Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠcontentType ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfallback : Ġtry Ġto Ġdetermine Ġfile Ġtype Ġbased Ġon Ġfile Ġextension ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget ContentType From Extension ( get FileName ( context , Ġuri )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠDetermine Ġcontent Ġtype Ġbased Ġon Ġfile Ġextension Ġ*/ ĊĠĠĠ Ġfun Ġget ContentType From Extension ( fileName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Helper . i ( TAG , Ġ" Ded uc ing Ġcontent Ġtype Ġfrom Ġfile Ġname : Ġ$ fileName ") ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName . endsWith (" m 3 u ", Ġtrue )) Ġreturn ĠKeys . MIME _ TYPE _ M 3 U ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName . endsWith (" pl s ", Ġtrue )) Ġreturn ĠKeys . MIME _ TYPE _ PL S ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName . endsWith (" png ", Ġtrue )) Ġreturn ĠKeys . MIME _ TYPE _ PNG ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName . endsWith (" jpg ", Ġtrue )) Ġreturn ĠKeys . MIME _ TYPE _ JPG ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName . endsWith (" jpeg ", Ġtrue )) Ġreturn ĠKeys . MIME _ TYPE _ JPG ĊĠĠĠĠĠĠĠ Ġ// Ġdefault Ġreturn ĊĠĠĠĠĠĠĠ Ġreturn ĠKeys . MIME _ TYPE _ UNSUPPORTED ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠDetermines Ġa Ġdestination Ġfolder Ġ*/ ĊĠĠĠ Ġfun Ġdetermine Destination FolderPath ( type : ĠInt , Ġstation Uuid : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfolder Path : ĠString ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeys . FILE _ TYPE _ PLAY LIST Ġ-> Ġfolder Path Ġ= ĠKeys . FOLDER _ TEMP ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeys . FILE _ TYPE _ AUDIO Ġ-> Ġfolder Path Ġ= ĠKeys . FOLDER _ AUDIO Ġ+ Ġ"/" Ġ+ Ġstation Uuid ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeys . FILE _ TYPE _ IMAGE Ġ-> Ġfolder Path Ġ= ĠKeys . FOLDER _ I MAGES Ġ+ Ġ"/" Ġ+ Ġstation Uuid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfolder Path Ġ= Ġ"/" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfolder Path ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠClear s Ġgiven Ġfolder Ġ- Ġkeeps Ġgiven Ġnumber Ġof Ġfiles Ġ*/ ĊĠĠĠ Ġfun Ġclear Folder ( folder : ĠFile ?, Ġkeep : ĠInt , Ġdelete Folder : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( folder Ġ!= Ġnull Ġ&& Ġfolder . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġfolder . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Count : ĠInt Ġ= Ġfiles . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . sortBy Ġ{ Ġit . lastModified () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Number Ġin Ġfiles . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Number Ġ< Ġfile Count Ġ- Ġkeep ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles [ file Number ]. delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delete Folder Ġ&& Ġkeep Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolder . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* ĠCreates Ġa Ġcopy Ġof Ġa Ġgiven Ġuri Ġfrom Ġdownload manager Ġ- Ġgoal Ġis Ġto Ġprovide Ġstable ĠU ris Ġ*/ ĊĠĠĠ Ġfun Ġsave Copy Of File ( context : ĠContext , Ġstation Uuid : ĠString , Ġtemp File Uri : ĠUri , ĠfileType : ĠInt , ĠfileName : ĠString , Ġasync : ĠBoolean Ġ= Ġfalse ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget File : ĠFile Ġ= ĠFile ( context . get External Files Dir ( determine Destination FolderPath ( fileType , Ġstation Uuid )), ĠfileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ( target File . exists ()) Ġtarget File . delete () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( async ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfile Ġasync Ġ(= Ġfire Ġ& Ġforget Ġ- Ġno Ġreturn Ġvalue Ġneeded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ Ġsave Copy Of File Sus pended ( context , Ġtemp File Uri , Ġtarget File . to Uri ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcopy Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy File ( context , Ġtemp File Uri , Ġtarget File . to Uri (), Ġdelete Original Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget File . to Uri () ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* ĠCreates Ġand Ġsave Ġa Ġscaled Ġversion Ġof Ġthe Ġstation Ġimage Ġ*/ ĊĠĠĠ Ġfun Ġsave Station Image ( context : ĠContext , Ġstation Uuid : ĠString , Ġsource Image Uri : ĠString , Ġsize : ĠInt , ĠfileName : ĠString ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcover Bitmap : ĠBitmap Ġ= ĠImage Helper . getS ca led Station Image ( context , Ġsource Image Uri , Ġsize ) ĊĠĠĠĠĠĠĠ Ġval Ġfile : ĠFile Ġ= ĠFile ( context . get External Files Dir ( determine Destination FolderPath ( Keys . FILE _ TYPE _ IMAGE , Ġstation Uuid )), ĠfileName ) ĊĠĠĠĠĠĠĠ Ġwrite Image File ( cover Bitmap , Ġfile , ĠBitmap . Compress Format . JPEG , Ġquality Ġ= Ġ 7 5 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . to Uri () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠS aves Ġcollection Ġof Ġradio Ġstations Ġas ĠJSON Ġtext Ġfile Ġ*/ ĊĠĠĠ Ġfun Ġsave Collection ( context : ĠContext , Ġcollection : ĠCollection , Ġlast Save : ĠDate ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Helper . v ( TAG , Ġ" Saving Ġcollection Ġ- ĠThread : Ġ${ Thread . currentThread (). name }") ĊĠĠĠĠĠĠĠ Ġval Ġcollection Size : ĠInt Ġ= Ġcollection . stations . size ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġoverride Ġan Ġexisting Ġcollection Ġwith Ġan Ġempty Ġone Ġ- Ġexcept Ġwhen Ġlast Ġstation Ġis Ġdeleted ĊĠĠĠĠĠĠĠ Ġif Ġ( collection Size Ġ> Ġ 0 Ġ|| ĠPreferences Helper . load Collection Size ( context ) Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconvert Ġto ĠJSON ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgson : ĠGson Ġ= Ġget Custom Gson () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġjson : ĠString Ġ= ĠString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Ġ= Ġgson . toJson ( collection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwrite Ġtext Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Text File ( context , Ġjson , ĠKeys . FOLDER _ COLLECTION , ĠKeys . COLLECTION _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave Ġmodification Ġdate Ġand Ġcollection Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreferences Helper . save Collection Modification Date ( context , Ġlast Save ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPreferences Helper . save Collection Size ( context , Ġcollection Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . w ( TAG , Ġ" Not Ġwriting Ġcollection Ġfile . ĠReason : ĠJSON Ġstring Ġwas Ġcompletely Ġempty .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . w ( TAG , Ġ" Not Ġsaving Ġcollection . ĠReason : ĠTrying Ġto Ġoverride Ġan Ġcollection Ġwith Ġmore Ġthan Ġone Ġstation ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠChecks Ġif Ġa Ġfolder Ġcontains Ġa Ġcollection . json Ġfile Ġ*/ ĊĠĠĠ Ġfun Ġcheck For Collection File ( folder : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( folder . exists () Ġ&& Ġfolder . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollection Files Ġ= Ġfolder . list Files Ġ{ Ġ_, Ġname Ġ-> Ġname ?. equals ( Keys . COLLECTION _ FILE ) Ġ?: Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcollection Files ?. isNotEmpty () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* ĠReads Ġm 3 u Ġor Ġpl s Ġplay lists Ġ*/ ĊĠĠĠ Ġfun Ġread Station Playlist ( playlist InputStream : ĠInputStream ?): ĠStation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstation : ĠStation Ġ= ĠStation () ĊĠĠĠĠĠĠĠ Ġif Ġ( playlist InputStream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader : ĠBufferedReader Ġ= ĠBufferedReader ( InputStream Reader ( playlist InputStream )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuntil Ġlast Ġline Ġreached : Ġread Ġstation Ġname Ġand Ġstream Ġaddress ( es ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . forEach Line Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠM 3 U : Ġfound Ġstation Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . contains ("# EXTINF :- 1 , ") Ġ-> Ġstation . name Ġ= Ġline . substring ( 1 1 ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . contains ("# EXTINF : 0 , ") Ġ-> Ġstation . name Ġ= Ġline . substring ( 1 0 ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠM 3 U : Ġfound Ġstream ĠURL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith (" http ") Ġ-> Ġstation . stream U ris . add ( 0 , Ġline . trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP LS : Ġfound Ġstation Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . matches ( Regex ("^ Title [ 0 - 9 ]+ = .* ")) Ġ-> Ġstation . name Ġ= Ġline . substring ( line . indexOf (" =") Ġ+ Ġ 1 ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP LS : Ġfound Ġstream ĠURL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . matches ( Regex ("^ File [ 0 - 9 ]+ = http .* ")) Ġ-> Ġstation . stream U ris . add ( line . substring ( line . indexOf (" =") Ġ+ Ġ 1 ). trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaylist InputStream . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstation ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠReads Ġcollection Ġof Ġradio Ġstations Ġfrom Ġstorage Ġusing ĠG SON Ġ*/ ĊĠĠĠ Ġfun Ġread Collection ( context : ĠContext ): ĠCollection Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Helper . v ( TAG , Ġ" Reading Ġcollection Ġ- ĠThread : Ġ${ Thread . currentThread (). name }") ĊĠĠĠĠĠĠĠ Ġ// Ġget ĠJSON Ġfrom Ġtext Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġjson : ĠString Ġ= Ġread Text File ( context , ĠKeys . FOLDER _ COLLECTION , ĠKeys . COLLECTION _ FILE ) ĊĠĠĠĠĠĠĠ Ġvar Ġcollection : ĠCollection Ġ= ĠCollection () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( json . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconvert ĠJSON Ġand Ġreturn Ġas Ġcollection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Ġ= Ġget Custom Gson (). fromJson ( json , Ġcollection :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcollection ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠApp ends Ġa Ġmessage Ġto Ġan Ġexisting Ġlog Ġ- Ġand Ġsaves Ġit Ġ*/ ĊĠĠĠ Ġfun Ġsave Log ( context : ĠContext , ĠlogMessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlog : ĠString Ġ= Ġread Text File ( context , ĠKeys . FOLDER _ COLLECTION , ĠKeys . DEBUG _ LOG _ FILE ) ĊĠĠĠĠĠĠĠ Ġlog Ġ= Ġ"${ log } Ġ{$ log Message }" ĊĠĠĠĠĠĠĠ Ġwrite Text File ( context , Ġlog , ĠKeys . FOLDER _ COLLECTION , ĠKeys . DEBUG _ LOG _ FILE ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠDeletes Ġthe Ġdebug Ġlog Ġfile Ġ*/ ĊĠĠĠ Ġfun Ġdelete Log ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog File : ĠFile Ġ= ĠFile ( context . get External Files Dir ( Keys . FOLDER _ COLLECTION ), ĠKeys . DEBUG _ LOG _ FILE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( log File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog File . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠChecks Ġif Ġenough Ġ( Ġ= Ġmore Ġthan Ġ 5 1 2 mb ) Ġfree Ġspace Ġis Ġavailable Ġ*/ ĊĠĠĠ Ġfun Ġenough Free Space Available ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusable Space : ĠLong Ġ= Ġcontext . get External Files Dir ( Keys . FOLDER _ COLLECTION )?. usable Space Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠ ĠLog Helper . e ( TAG , Ġ" usable Space : Ġ$ usable Space ") ĊĠĠĠĠĠĠĠ Ġreturn Ġusable Space Ġ> Ġ 5 1 2 0 0 0 0 0 0 L ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠGet Ġcontent ĠUri Ġfor ĠM 3 U Ġfile Ġ*/ ĊĠĠĠ Ġfun Ġget M 3 ul Uri ( activity : ĠActivity ): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm 3 ul Uri : ĠUri ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ// Ġtry Ġto Ġget Ġan Ġexisting ĠM 3 U ĠFile ĊĠĠĠĠĠĠĠ Ġvar Ġm 3 u File Ġ= ĠFile ( activity . get External Files Dir ( Keys . FOLDER _ COLLECTION ), ĠKeys . COLLECTION _ M 3 U _ FILE ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! m 3 u File . exists ()) Ġ{ Ġm 3 u File Ġ= ĠFile ( activity . get External Files Dir ( Keys . TRAN SI STOR _ LEG ACY _ FOLDER _ COLLECTION ), ĠKeys . COLLECTION _ M 3 U _ FILE ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġget ĠUri Ġfor Ġexisting ĠM 3 U ĠFile ĊĠĠĠĠĠĠĠ Ġif Ġ( m 3 u File . exists ()) Ġ{ Ġm 3 ul Uri Ġ= ĠFile Provider . get Uri For File ( activity , Ġ"${ activity . application Context . packageName }. provider ", Ġm 3 u File ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġm 3 ul Uri ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* ĠS uspend Ġfunction : ĠWrapper Ġfor Ġsave Collection Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġsave Collection Sus pended ( context : ĠContext , Ġcollection : ĠCollection , Ġlast Update : ĠDate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( save Collection ( context , Ġcollection , Ġlast Update )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠS uspend Ġfunction : ĠWrapper Ġfor Ġread Collection Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġread Collection Sus pended ( context : ĠContext ): ĠCollection Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ cont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( read Collection ( context )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠS uspend Ġfunction : ĠWrapper Ġfor Ġcopy File Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġsave Copy Of File Sus pended ( context : ĠContext , Ġoriginal File Uri : ĠUri , Ġtarget File Uri : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( copy File ( context , Ġoriginal File Uri , Ġtarget File Uri , Ġdelete Original Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠS uspend Ġfunction : ĠEx ports Ġcollection Ġof Ġstations Ġas ĠM 3 U Ġfile Ġ- Ġlocal Ġbackup Ġcopy Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġbackup Collection As M 3 u Sus pended ( context : ĠContext , Ġcollection : ĠCollection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . v ( TAG , Ġ" Backing Ġup Ġcollection Ġas ĠM 3 U Ġ- ĠThread : Ġ${ Thread . currentThread (). name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate ĠM 3 U Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm 3 u String : ĠString Ġ= ĠCollection Helper . create M 3 u String ( collection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave ĠM 3 U Ġas Ġtext Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( write Text File ( context , Ġm 3 u String , ĠKeys . FOLDER _ COLLECTION , ĠKeys . COLLECTION _ M 3 U _ FILE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠCop ies Ġfile Ġto Ġspecified Ġtarget Ġ*/ ĊĠĠĠ Ġfun Ġcopy File ( context : ĠContext , Ġoriginal File Uri : ĠUri , Ġtarget File Uri : ĠUri , Ġdelete Original : ĠBoolean Ġ= Ġfalse ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsuccess : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġcontext . content Resolver . open InputStream ( original File Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġcontext . content Resolver . open OutputStream ( target File Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Stream Ġ!= Ġnull Ġ&& ĠinputStream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . copy To ( output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . e ( TAG , Ġ" Unable Ġto Ġcopy Ġfile .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( delete Original ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġcontent Resolver Ġto Ġhandle Ġfiles Ġof Ġtype Ġcontent :// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . delete ( original File Uri , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . e ( TAG , Ġ" Unable Ġto Ġdelete Ġthe Ġoriginal Ġfile . ĠStack Ġtrace : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuccess ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* Ġ ĠCreates Ġa ĠGson Ġobject Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Custom Gson (): ĠGson Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Builder Ġ= ĠGson Builder () ĊĠĠĠĠĠĠĠ Ġgson Builder . set DateFormat (" M / d / yy Ġhh : mm Ġa ") ĊĠĠĠĠĠĠĠ Ġgson Builder . exclude Fields Without Expose Annotation () ĊĠĠĠĠĠĠĠ Ġreturn Ġgson Builder . create () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠCreate Ġnome dia Ġfile Ġin Ġgiven Ġfolder Ġto Ġprevent Ġmedia Ġscanning Ġ*/ ĊĠĠĠ Ġfun Ġcreate Nome dia File ( folder : ĠFile ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( folder Ġ!= Ġnull Ġ&& Ġfolder . exists () Ġ&& Ġfolder . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnome dia File : ĠFile Ġ= Ġget No Media File ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! nome dia File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Media Out Stream : ĠFileOutputStream Ġ= ĠFileOutputStream ( get No Media File ( folder )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Media Out Stream . write ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . v ( TAG , Ġ". nome dia Ġfile Ġexists Ġalready Ġin Ġgiven Ġfolder .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . w ( TAG , Ġ" Unable Ġto Ġcreate Ġ. nome dia Ġfile . ĠGiven Ġfolder Ġis Ġnot Ġvalid .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠDelete Ġnome dia Ġfile Ġin Ġgiven Ġfolder Ġ*/ ĊĠĠĠ Ġfun Ġdelete No Media File ( folder : ĠFile ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( folder Ġ!= Ġnull Ġ&& Ġfolder . exists () Ġ&& Ġfolder . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget No Media File ( folder ). delete () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . w ( TAG , Ġ" Unable Ġto Ġdelete Ġ. nome dia Ġfile . ĠGiven Ġfolder Ġis Ġnot Ġvalid .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠConverts Ġbyte Ġvalue Ġinto Ġa Ġhuman Ġreadable Ġformat Ġ*/ ĊĠĠĠ Ġ// ĠSource : Ġhttps :// programming . guide / java / formatting - byte - size - to - human - readable - format . html ĊĠĠĠ Ġfun Ġget Readable Byte Count ( bytes : ĠLong , Ġsi : ĠBoolean Ġ= Ġtrue ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif ĠDecimal Ġprefix Ġsymbol Ġ( SI ) Ġor ĠBinary Ġprefix Ġsymbol Ġ( IE C ) Ġrequested ĊĠĠĠĠĠĠĠ Ġval Ġunit : ĠLong Ġ= Ġif Ġ( si ) Ġ 1 0 0 0 L Ġelse Ġ 1 0 2 4 L ĊĊĠĠĠĠĠĠĠ Ġ// Ġjust Ġreturn Ġbytes Ġif Ġfile Ġsize Ġis Ġsmaller Ġthan Ġrequested Ġunit ĊĠĠĠĠĠĠĠ Ġif Ġ( bytes Ġ< Ġunit ) Ġreturn Ġ"$ bytes ĠB " ĊĊĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġexp ĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠInt Ġ= Ġ( ln ( bytes . toDouble ()) Ġ/ Ġln ( unit . toDouble ())). toInt () ĊĊĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġprefix Ġsymbol ĊĠĠĠĠĠĠĠ Ġval Ġprefix : ĠString Ġ= Ġ(( if Ġ( si ) Ġ" k M GT PE " Ġelse Ġ" KM GT PE ")[ exp Ġ- Ġ 1 ] Ġ+ Ġif Ġ( si ) Ġ"" Ġelse Ġ" i ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġresult Ġand Ġset Ġnumber Ġformat ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠDouble Ġ= Ġbytes Ġ/ Ġunit . toDouble (). pow ( exp . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġnumber Format Ġ= ĠNumber Format . getNumber Instance () ĊĠĠĠĠĠĠĠ Ġnumber Format . maximum Fraction Digits Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnumber Format . format ( result ) Ġ+ Ġ" Ġ" Ġ+ Ġprefix Ġ+ Ġ" B " ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠReads ĠInputStream Ġfrom Ġfile Ġuri Ġand Ġreturns Ġit Ġas ĠString Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Text File ( context : ĠContext , Ġfolder : ĠString , ĠfileName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġread Ġhttps :// commons ware . com / blog / 2 0 1 6 / 0 3 / 1 5 / how - consume - content - uri . html ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// developer . android . com / training / secure - file - sharing / retrieve - info ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġfile Ġexists ĊĠĠĠĠĠĠĠ Ġval Ġfile : ĠFile Ġ= ĠFile ( context . get External Files Dir ( folder ), ĠfileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġread Sus pended Ġuntil Ġlast Ġline Ġreached ĊĠĠĠĠĠĠĠ Ġval Ġstream : ĠInputStream Ġ= Ġfile . inputStream () ĊĠĠĠĠĠĠĠ Ġval Ġreader : ĠBufferedReader Ġ= ĠBufferedReader ( InputStream Reader ( stream )) ĊĠĠĠĠĠĠĠ Ġval Ġbuilder : ĠStringBuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġreader . forEach Line Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") Ġ} ĊĠĠĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠWrites Ġgiven Ġtext Ġto Ġfile Ġon Ġstorage Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite Text File ( context : ĠContext , Ġtext : ĠString , Ġfolder : ĠString , ĠfileName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( context . get External Files Dir ( folder ), ĠfileName ). write Text ( text ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . w ( TAG , Ġ" Writing Ġtext Ġfile Ġ$ fileName Ġfailed . ĠEmpty Ġtext Ġstring Ġtext Ġwas Ġprovided .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠWrites Ġgiven Ġtext Ġto Ġfile Ġspecified Ġby Ġdestination Uri Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite Text To Uri ( context : ĠContext , Ġtext : ĠString , Ġdestination Uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolver : ĠContent Resolver Ġ= Ġcontext . content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream : ĠOutputStream ? Ġ= Ġresolver . open OutputStream ( destination Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream ?. write ( text . toByteArray ( Charsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Helper . w ( TAG , Ġ" Writing Ġtext Ġfile Ġ$ destination Uri Ġfailed . ĠEmpty Ġtext Ġstring Ġtext Ġwas Ġprovided .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* ĠWrites Ġgiven Ġbitmap Ġas Ġimage Ġfile Ġto Ġstorage Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwrite Image File ( bitmap : ĠBitmap , Ġfile : ĠFile , Ġformat : ĠBitmap . Compress Format Ġ= ĠBitmap . Compress Format . JPEG , Ġquality : ĠInt Ġ= Ġ 7 5 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġfile . delete Ġ() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( format , Ġquality , Ġout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠChecks Ġthe Ġsize Ġof Ġthe Ġcollection Ġfolder Ġ*/ ĊĠĠĠ Ġfun Ġget Collection Folder Size ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfolder : ĠFile ? Ġ= Ġcontext . get External Files Dir ( Keys . FOLDER _ COLLECTION ) ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġfolder ?. list Files () ĊĠĠĠĠĠĠĠ Ġif Ġ( folder Ġ!= Ġnull Ġ&& Ġfolder . exists () Ġ&& Ġfolder . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfiles ?. size Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/* ĠReturns Ġa Ġnome dia Ġfile Ġobject Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget No Media File ( folder : ĠFile ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( folder , Ġ". nome dia ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/* ĠT ries Ġto Ġparse Ġfeed ĠURL Ġstring Ġas ĠURL Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Par s able As Url ( feed Url : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( feed Url ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ Ċ } Ċ