Skip to content

Commit

Permalink
Better FileWrapper abstraction
Browse files Browse the repository at this point in the history
  • Loading branch information
Anggrayudi Hardiannico committed Jul 12, 2022
1 parent 206d02a commit 710dc65
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 83 deletions.
152 changes: 75 additions & 77 deletions storage/src/main/java/com/anggrayudi/storage/FileWrapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,97 +18,95 @@ import java.io.OutputStream
* @author Anggrayudi Hardiannico A. (anggrayudi.hardiannico@dana.id)
* @version FileWrapper, 09/07/22 18.41
*/
class FileWrapper {
interface FileWrapper {

/**
* Either [DocumentFile], [MediaFile], or `null`
*/
val file: Any?
val uri: Uri

constructor(file: MediaFile?) {
this.file = file
}

constructor(file: DocumentFile?) {
this.file = file
}
val name: String?

val uri: Uri?
get() = when (file) {
is MediaFile -> file.uri
is DocumentFile -> file.uri
else -> null
}
val baseName: String

val name: String?
get() = when (file) {
is MediaFile -> file.name
is DocumentFile -> file.name
else -> null
}

val baseName: String?
get() = when (file) {
is MediaFile -> file.baseName
is DocumentFile -> file.baseName
else -> null
}

val extension: String?
get() = when (file) {
is MediaFile -> file.extension
is DocumentFile -> file.extension
else -> null
}
val extension: String

val mimeType: String?
get() = when (file) {
is MediaFile -> file.mimeType
is DocumentFile -> file.mimeTypeByFileName
else -> null
}

fun isEmpty(context: Context): Boolean = when (file) {
is MediaFile -> file.isEmpty
is DocumentFile -> file.isEmpty(context)
else -> false
}

fun getAbsolutePath(context: Context): String = when (file) {
is MediaFile -> file.absolutePath
is DocumentFile -> file.getAbsolutePath(context)
else -> ""
}
fun isEmpty(context: Context): Boolean

fun getBasePath(context: Context): String = when (file) {
is MediaFile -> file.basePath
is DocumentFile -> file.getBasePath(context)
else -> ""
}
fun getAbsolutePath(context: Context): String

fun getRelativePath(context: Context): String = when (file) {
is MediaFile -> file.relativePath
is DocumentFile -> file.getRelativePath(context)
else -> ""
}
fun getBasePath(context: Context): String

fun getRelativePath(context: Context): String

@WorkerThread
fun openOutputStream(context: Context, append: Boolean = true): OutputStream? = when (file) {
is MediaFile -> file.openOutputStream(append)
is DocumentFile -> file.openOutputStream(context, append)
else -> null
}
fun openOutputStream(context: Context, append: Boolean = true): OutputStream?

@WorkerThread
fun openInputStream(context: Context): InputStream? = when (file) {
is MediaFile -> file.openInputStream()
is DocumentFile -> file.openInputStream(context)
else -> null
fun openInputStream(context: Context): InputStream?

fun delete(): Boolean

class Media(val mediaFile: MediaFile) : FileWrapper {

override val uri: Uri
get() = mediaFile.uri

override val name: String?
get() = mediaFile.name

override val baseName: String
get() = mediaFile.baseName

override val extension: String
get() = mediaFile.extension

override val mimeType: String
get() = mediaFile.mimeType

override fun isEmpty(context: Context): Boolean = mediaFile.isEmpty

override fun getAbsolutePath(context: Context): String = mediaFile.absolutePath

override fun getBasePath(context: Context): String = mediaFile.basePath

override fun getRelativePath(context: Context): String = mediaFile.relativePath

override fun openOutputStream(context: Context, append: Boolean): OutputStream? = mediaFile.openOutputStream(append)

override fun openInputStream(context: Context): InputStream? = mediaFile.openInputStream()

override fun delete(): Boolean = mediaFile.delete()
}

fun delete(): Boolean = when (file) {
is MediaFile -> file.delete()
is DocumentFile -> file.delete()
else -> false
class Document(val documentFile: DocumentFile) : FileWrapper {

override val uri: Uri
get() = documentFile.uri

override val name: String?
get() = documentFile.name

override val baseName: String
get() = documentFile.baseName

override val extension: String
get() = documentFile.extension

override val mimeType: String?
get() = documentFile.mimeTypeByFileName

override fun isEmpty(context: Context): Boolean = documentFile.isEmpty(context)

override fun getAbsolutePath(context: Context): String = documentFile.getAbsolutePath(context)

override fun getBasePath(context: Context): String = documentFile.getBasePath(context)

override fun getRelativePath(context: Context): String = documentFile.getRelativePath(context)

override fun openOutputStream(context: Context, append: Boolean): OutputStream? = documentFile.openOutputStream(context, append)

override fun openInputStream(context: Context): InputStream? = documentFile.openInputStream(context)

override fun delete(): Boolean = documentFile.delete()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -573,22 +573,22 @@ object DocumentFileCompat {
}

@JvmStatic
fun createDownloadWithMediaStoreFallback(context: Context, file: FileDescription): FileWrapper {
fun createDownloadWithMediaStoreFallback(context: Context, file: FileDescription): FileWrapper? {
val publicFolder = fromPublicFolder(context, PublicDirectory.DOWNLOADS, requiresWriteAccess = true)
return if (publicFolder == null && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
FileWrapper(MediaStoreCompat.createDownload(context, file))
MediaStoreCompat.createDownload(context, file)?.let { FileWrapper.Media(it) }
} else {
FileWrapper(publicFolder?.makeFile(context, file.name, file.mimeType))
publicFolder?.makeFile(context, file.name, file.mimeType)?.let { FileWrapper.Document(it) }
}
}

@JvmStatic
fun createPictureWithMediaStoreFallback(context: Context, file: FileDescription): FileWrapper {
fun createPictureWithMediaStoreFallback(context: Context, file: FileDescription): FileWrapper? {
val publicFolder = fromPublicFolder(context, PublicDirectory.PICTURES, requiresWriteAccess = true)
return if (publicFolder == null && Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
FileWrapper(MediaStoreCompat.createImage(context, file))
MediaStoreCompat.createImage(context, file)?.let { FileWrapper.Media(it) }
} else {
FileWrapper(publicFolder?.makeFile(context, file.name, file.mimeType))
publicFolder?.makeFile(context, file.name, file.mimeType)?.let { FileWrapper.Document(it) }
}
}

Expand Down

0 comments on commit 710dc65

Please sign in to comment.