@@ -23,10 +23,17 @@ import com.google.firebase.platforminfo.LibraryVersionComponent
23
23
import com.google.firebase.storage.FileDownloadTask
24
24
import com.google.firebase.storage.FirebaseStorage
25
25
import com.google.firebase.storage.ListResult
26
+ import com.google.firebase.storage.OnPausedListener
27
+ import com.google.firebase.storage.OnProgressListener
26
28
import com.google.firebase.storage.StorageMetadata
27
29
import com.google.firebase.storage.StorageReference
30
+ import com.google.firebase.storage.StorageTaskScheduler
28
31
import com.google.firebase.storage.StreamDownloadTask
29
32
import com.google.firebase.storage.UploadTask
33
+ import kotlinx.coroutines.channels.awaitClose
34
+ import kotlinx.coroutines.channels.trySendBlocking
35
+ import kotlinx.coroutines.flow.Flow
36
+ import kotlinx.coroutines.flow.callbackFlow
30
37
31
38
/* * Returns the [FirebaseStorage] instance of the default [FirebaseApp]. */
32
39
val Firebase .storage: FirebaseStorage
@@ -133,6 +140,93 @@ operator fun ListResult.component2(): List<StorageReference> = prefixes
133
140
*/
134
141
operator fun ListResult.component3 (): String? = pageToken
135
142
143
+ /* *
144
+ * Starts listening to this task's stream download progress and emits its values via a [Flow].
145
+ *
146
+ * - When the returned flow starts being collected, it attaches the following listeners:
147
+ * [OnPausedListener], [OnProgressListener].
148
+ * - When the flow completes the listeners will be removed.
149
+ */
150
+ val StreamDownloadTask .progress: Flow <StorageProgress <StreamDownloadTask .TaskSnapshot >>
151
+ get() = callbackFlow {
152
+ val progressListener = OnProgressListener <StreamDownloadTask .TaskSnapshot > { snapshot ->
153
+ StorageTaskScheduler .getInstance().scheduleCallback {
154
+ trySendBlocking(StorageProgress .InProgress (snapshot))
155
+ }
156
+ }
157
+ val pauseListener = OnPausedListener <StreamDownloadTask .TaskSnapshot > { snapshot ->
158
+ StorageTaskScheduler .getInstance().scheduleCallback {
159
+ trySendBlocking(StorageProgress .Paused (snapshot))
160
+ }
161
+ }
162
+
163
+ addOnProgressListener(progressListener)
164
+ addOnPausedListener(pauseListener)
165
+
166
+ awaitClose {
167
+ removeOnProgressListener(progressListener)
168
+ removeOnPausedListener(pauseListener)
169
+ }
170
+ }
171
+
172
+ /* *
173
+ * Starts listening to this task's file download progress and emits its values via a [Flow].
174
+ *
175
+ * - When the returned flow starts being collected, it attaches the following listeners:
176
+ * [OnPausedListener], [OnProgressListener].
177
+ * - When the flow completes the listeners will be removed.
178
+ */
179
+ val FileDownloadTask .progress: Flow <StorageProgress <FileDownloadTask .TaskSnapshot >>
180
+ get() = callbackFlow {
181
+ val progressListener = OnProgressListener <FileDownloadTask .TaskSnapshot > { snapshot ->
182
+ StorageTaskScheduler .getInstance().scheduleCallback {
183
+ trySendBlocking(StorageProgress .InProgress (snapshot))
184
+ }
185
+ }
186
+ val pauseListener = OnPausedListener <FileDownloadTask .TaskSnapshot > { snapshot ->
187
+ StorageTaskScheduler .getInstance().scheduleCallback {
188
+ trySendBlocking(StorageProgress .Paused (snapshot))
189
+ }
190
+ }
191
+
192
+ addOnProgressListener(progressListener)
193
+ addOnPausedListener(pauseListener)
194
+
195
+ awaitClose {
196
+ removeOnProgressListener(progressListener)
197
+ removeOnPausedListener(pauseListener)
198
+ }
199
+ }
200
+
201
+ /* *
202
+ * Starts listening to this task's upload progress and emits its values via a [Flow].
203
+ *
204
+ * - When the returned flow starts being collected, it attaches the following listeners:
205
+ * [OnPausedListener], [OnProgressListener].
206
+ * - When the flow completes the listeners will be removed.
207
+ */
208
+ val UploadTask .progress: Flow <StorageProgress <UploadTask .TaskSnapshot >>
209
+ get() = callbackFlow {
210
+ val progressListener = OnProgressListener <UploadTask .TaskSnapshot > { snapshot ->
211
+ StorageTaskScheduler .getInstance().scheduleCallback {
212
+ trySendBlocking(StorageProgress .InProgress (snapshot))
213
+ }
214
+ }
215
+ val pauseListener = OnPausedListener <UploadTask .TaskSnapshot > { snapshot ->
216
+ StorageTaskScheduler .getInstance().scheduleCallback {
217
+ trySendBlocking(StorageProgress .Paused (snapshot))
218
+ }
219
+ }
220
+
221
+ addOnProgressListener(progressListener)
222
+ addOnPausedListener(pauseListener)
223
+
224
+ awaitClose {
225
+ removeOnProgressListener(progressListener)
226
+ removeOnPausedListener(pauseListener)
227
+ }
228
+ }
229
+
136
230
internal const val LIBRARY_NAME : String = " fire-stg-ktx"
137
231
138
232
/* * @suppress */
0 commit comments