@@ -8,8 +8,10 @@ package dev.gitlive.firebase.storage
8
8
import android.net.Uri
9
9
import com.google.android.gms.tasks.OnCanceledListener
10
10
import com.google.android.gms.tasks.OnCompleteListener
11
+ import com.google.android.gms.tasks.Task
11
12
import com.google.firebase.storage.OnPausedListener
12
13
import com.google.firebase.storage.OnProgressListener
14
+ import com.google.firebase.storage.StorageMetadata
13
15
import com.google.firebase.storage.UploadTask
14
16
import dev.gitlive.firebase.Firebase
15
17
import dev.gitlive.firebase.FirebaseApp
@@ -18,7 +20,10 @@ import kotlinx.coroutines.channels.awaitClose
18
20
import kotlinx.coroutines.channels.trySendBlocking
19
21
import kotlinx.coroutines.flow.FlowCollector
20
22
import kotlinx.coroutines.flow.callbackFlow
23
+ import kotlinx.coroutines.flow.channelFlow
21
24
import kotlinx.coroutines.flow.emitAll
25
+ import kotlinx.coroutines.flow.first
26
+ import kotlinx.coroutines.launch
22
27
import kotlinx.coroutines.tasks.await
23
28
24
29
actual val Firebase .storage get() =
@@ -57,6 +62,8 @@ actual class StorageReference(val android: com.google.firebase.storage.StorageRe
57
62
actual val root: StorageReference get() = StorageReference (android.root)
58
63
actual val storage: FirebaseStorage get() = FirebaseStorage (android.storage)
59
64
65
+ actual suspend fun getMetadata (): FirebaseStorageMetadata ? = android.metadata.await().toFirebaseStorageMetadata()
66
+
60
67
actual fun child (path : String ): StorageReference = StorageReference (android.child(path))
61
68
62
69
actual suspend fun delete () = android.delete().await().run { Unit }
@@ -65,10 +72,28 @@ actual class StorageReference(val android: com.google.firebase.storage.StorageRe
65
72
66
73
actual suspend fun listAll (): ListResult = ListResult (android.listAll().await())
67
74
68
- actual suspend fun putFile (file : File ) = android.putFile(file.uri).await().run {}
75
+ actual suspend fun putFile (file : File , metadata : FirebaseStorageMetadata ? ) {
76
+ if (metadata != null ) {
77
+ android.putFile(file.uri, metadata.toStorageMetadata()).await().run {}
78
+ } else {
79
+ android.putFile(file.uri).await().run {}
80
+ }
81
+ }
69
82
70
- actual fun putFileResumable (file : File ): ProgressFlow {
71
- val android = android.putFile(file.uri)
83
+ actual suspend fun putData (data : Data , metadata : FirebaseStorageMetadata ? ) {
84
+ if (metadata != null ) {
85
+ android.putBytes(data.data, metadata.toStorageMetadata()).await().run {}
86
+ } else {
87
+ android.putBytes(data.data).await().run {}
88
+ }
89
+ }
90
+
91
+ actual fun putFileResumable (file : File , metadata : FirebaseStorageMetadata ? ): ProgressFlow {
92
+ val android = if (metadata != null ) {
93
+ android.putFile(file.uri, metadata.toStorageMetadata())
94
+ } else {
95
+ android.putFile(file.uri)
96
+ }
72
97
73
98
val flow = callbackFlow {
74
99
val onCanceledListener = OnCanceledListener { cancel() }
@@ -104,4 +129,35 @@ actual class ListResult(android: com.google.firebase.storage.ListResult) {
104
129
105
130
actual class File (val uri : Uri )
106
131
132
+ actual class Data (val data : ByteArray )
133
+
107
134
actual typealias FirebaseStorageException = com.google.firebase.storage.StorageException
135
+
136
+ fun FirebaseStorageMetadata.toStorageMetadata (): StorageMetadata {
137
+ return StorageMetadata .Builder ()
138
+ .setCacheControl(this .cacheControl)
139
+ .setContentDisposition(this .contentDisposition)
140
+ .setContentEncoding(this .contentEncoding)
141
+ .setContentLanguage(this .contentLanguage)
142
+ .setContentType(this .contentType)
143
+ .apply {
144
+ customMetadata.entries.forEach {
145
+ (key, value) -> setCustomMetadata(key, value)
146
+ }
147
+ }.build()
148
+ }
149
+
150
+ fun StorageMetadata.toFirebaseStorageMetadata (): FirebaseStorageMetadata {
151
+ val sdkMetadata = this
152
+ return storageMetadata {
153
+ md5Hash = sdkMetadata.md5Hash
154
+ cacheControl = sdkMetadata.cacheControl
155
+ contentDisposition = sdkMetadata.contentDisposition
156
+ contentEncoding = sdkMetadata.contentEncoding
157
+ contentLanguage = sdkMetadata.contentLanguage
158
+ contentType = sdkMetadata.contentType
159
+ sdkMetadata.customMetadataKeys.forEach {
160
+ setCustomMetadata(it, sdkMetadata.getCustomMetadata(it))
161
+ }
162
+ }
163
+ }
0 commit comments