package Ġat . ro tes k re uz . stop cor ona . model . repositories Ċ Ċ import Ġandroidx . annotation . Raw Res Ċ import Ġat . ro tes k re uz . stop cor ona . Build Config Ċ import Ġat . ro tes k re uz . stop cor ona . model . repositories . other . Context Interactor Ċ import Ġat . ro tes k re uz . stop cor ona . skeleton . core . model . helpers . App Dispatch ers Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . io .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ /** Ċ Ġ* ĠRepository Ġfor Ġworking Ġwith Ġfiles Ġstored Ġin Ġthe Ġapp 's Ġprivate Ġstorage . Ċ Ġ*/ Ċ interface ĠFiles Repository Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrite Ġinput Ġstream Ġinto Ġa Ġnew Ġfile Ġin Ġthe Ġapp 's Ġstorage . ĠIf Ġthe Ġdestination Ġfile Ġalready ĊĠĠĠĠ Ġ* Ġexists , Ġit Ġwill Ġnot Ġbe Ġoverwritten . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠinputStream : ĠThe Ġcontent Ġto Ġwrite . ĊĠĠĠĠ Ġ* Ġ@ param ĠfileName Ġa Ġfile Ġname , Ġrelative Ġto Ġthe Ġapps Ġstorage ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġcreate File From InputStream ( inputStream : ĠInputStream , Ġfolder : ĠString , ĠfileName : ĠString ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġa Ġraw Ġresource Ġfile Ġand Ġreturns Ġit 's Ġcontent Ġas Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġload Raw Resource ( fileName : ĠString ): ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġ[ File ] Ġwith Ġpath Ġ[ folder ]/ [ fileName ], Ġrelative Ġto Ġthe Ġapplication 's Ġbase Ġfolder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠgetFile ( folder : ĠString , ĠfileName : ĠString ): ĠFile ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġa Ġ[ File ] Ġon Ġpath Ġ[ folder ]/ [ fileName ], Ġrelative Ġto Ġthe Ġapplication 's Ġbase Ġfolder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġremove File ( folder : ĠString , ĠfileName : ĠString ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġall Ġfiles Ġin Ġ[ folder ] Ġbased Ġin Ġapplication 's Ġfolder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġremove Folder ( folder : ĠString ) Ċ } Ċ Ċ class ĠFiles Repository Impl ( ĊĠĠĠ Ġprivate Ġval Ġapp Dispatch ers : ĠApp Dispatch ers , ĊĠĠĠ Ġprivate Ġval Ġcontext Interactor : ĠContext Interactor Ċ ) Ġ: ĠFiles Repository , ĊĠĠĠ ĠCor outine Scope Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġapp Dispatch ers . IO ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPath Ġto Ġ/ data / data / packageName / files / Ġor Ġequivalent Ġ/ data / user / 0 / packageName / files /. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġapplication Internal Base Folder : ĠFile ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontext Interactor . files Dir ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcreate File From InputStream ( inputStream : ĠInputStream , Ġfolder : ĠString , ĠfileName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest File Ġ= ĠgetFile ( folder , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dest File . exists (). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . save To ( dest File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠInputStream . save To ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Dest File : ĠFile Ġ= ĠFile . create TempFile ( file . name , Ġnull , Ġfile . parent File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġto Ġtemp Ġfile Ġand Ġonly Ġmove Ġto Ġthe Ġrequested Ġfile Ġname Ġwhen Ġwe Ġknow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġsucceeded . ĠOtherwise Ġwe Ġmight Ġleave Ġa Ġhalf Ġwritten Ġfile Ġaround Ġwhich Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnever Ġbe Ġreplaced Ġbecause ĠÂ ´ if Ġ(! file Exists ( dest Filename )) Â ´ Ġthink s Ġeverything Ġis Ġok ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( tmp Dest File ). use Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . copy To ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . flush () Ġ// ĠFlush Ġbuffers Ġto ĠOS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . fd . sync () Ġ// ĠMake Ġsure ĠOS Ġwrites Ġall Ġthe Ġway Ġto Ġdisc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tmp Dest File . rename To ( file )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Could Ġnot Ġmove Ġtemporary Ġfile Ġto Ġfinal Ġdestination Ġ${ file . canonical Path }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload Raw Resource ( fileName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Id Ġ= Ġcontext Interactor . resources . getIdentifier ( fileName , Ġ" raw ", ĠBuild Config . APPLICATION _ ID ) ĊĠĠĠĠĠĠĠ Ġif Ġ( res Id Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException ( fileName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġload Raw Resource ( res Id ) Ġ?: Ġthrow ĠFileNotFoundException ( fileName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Raw Resource (@ Raw Res Ġres Id : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Interactor . resources . open Raw Resource ( res Id ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( inputStream . reader ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . use Ġ{ Ġcontent Ġ= Ġit . read Text () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġcontent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetFile ( folder : ĠString , ĠfileName : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( get Folder ( folder ). mkdir s IfNeeded (), ĠfileName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Folder ( folder : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( application Internal Base Folder , Ġfolder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġremove File ( folder : ĠString , ĠfileName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile ( folder , ĠfileName ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġremove Folder ( folder : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Folder ( folder ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠFile . mkdir s IfNeeded (): ĠFile Ġ{ ĊĠĠĠ Ġif Ġ(! exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġmkdir s () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ }