@ammarahmed/react-native-upload 6.22.0 → 6.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +1 -4
- package/android/src/main/java/com/appfolio/uploader/GlobalRequestObserverDelegate.kt +4 -4
- package/android/src/main/java/com/appfolio/uploader/UploaderModule.kt +51 -34
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/android/src/main/java/com/appfolio/extensions/ContextExtensions.kt +0 -63
- package/android/src/main/java/com/appfolio/extensions/UploadExtensions.kt +0 -57
- package/android/src/main/java/com/appfolio/uploader/ModifiedBinaryUploadRequest.kt +0 -29
- package/android/src/main/java/com/appfolio/uploader/ModifiedHttpUploadRequest.kt +0 -57
- package/android/src/main/java/com/appfolio/uploader/ModifiedMultipartUploadRequest.kt +0 -60
- package/android/src/main/java/com/appfolio/work/TaskCompletionNotifier.kt +0 -47
- package/android/src/main/java/com/appfolio/work/UploadManager.kt +0 -109
- package/android/src/main/java/com/appfolio/work/UploadWorker.kt +0 -20
package/android/build.gradle
CHANGED
|
@@ -72,10 +72,7 @@ dependencies {
|
|
|
72
72
|
|
|
73
73
|
implementation "org.jetbrains.kotlin:$_kotlinStdlib:$_kotlinVersion"
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
implementation 'net.gotev:uploadservice:4.9.4'
|
|
77
|
-
//noinspection GradleDependency
|
|
78
|
-
implementation 'net.gotev:uploadservice-okhttp:4.9.4'
|
|
75
|
+
implementation 'com.github.ammarahm-ed:android-upload-service:e7fdda2c3dc18b0e5b838bfb53c59b728f66a42d'
|
|
79
76
|
|
|
80
77
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
|
81
78
|
implementation 'com.google.code.gson:gson:2.10.1'
|
|
@@ -40,8 +40,8 @@ class GlobalRequestObserverDelegate(reactContext: ReactApplicationContext) : Req
|
|
|
40
40
|
val params = Arguments.createMap()
|
|
41
41
|
params.putString("id", uploadInfo.uploadId)
|
|
42
42
|
params.putInt("progress", uploadInfo.progressPercent) //0-100
|
|
43
|
-
params.
|
|
44
|
-
params.
|
|
43
|
+
params.putDouble("totalBytes", uploadInfo.totalBytes.toDouble())
|
|
44
|
+
params.putDouble("uploadedBytes", uploadInfo.uploadedBytes.toDouble())
|
|
45
45
|
sendEvent("progress", params, context)
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -51,8 +51,8 @@ class GlobalRequestObserverDelegate(reactContext: ReactApplicationContext) : Req
|
|
|
51
51
|
params.putInt("responseCode", serverResponse.code)
|
|
52
52
|
params.putString("responseBody", serverResponse.bodyString)
|
|
53
53
|
params.putInt("progress", uploadInfo.progressPercent)
|
|
54
|
-
params.
|
|
55
|
-
params.
|
|
54
|
+
params.putDouble("totalBytes", uploadInfo.totalBytes.toDouble())
|
|
55
|
+
params.putDouble("uploadedBytes", uploadInfo.uploadedBytes.toDouble())
|
|
56
56
|
sendEvent("completed", params, context)
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -7,18 +7,24 @@ import android.content.Context
|
|
|
7
7
|
import android.os.Build
|
|
8
8
|
import android.util.Log
|
|
9
9
|
import android.webkit.MimeTypeMap
|
|
10
|
+
import androidx.work.OneTimeWorkRequestBuilder
|
|
10
11
|
import androidx.work.WorkInfo
|
|
11
12
|
import androidx.work.WorkManager
|
|
12
|
-
import com.appfolio.work.UploadManager
|
|
13
|
-
import com.appfolio.work.UploadWorker
|
|
14
13
|
import com.facebook.react.BuildConfig
|
|
15
14
|
import com.facebook.react.bridge.*
|
|
15
|
+
import net.gotev.uploadservice.UploadServiceConfig
|
|
16
|
+
import net.gotev.uploadservice.UploadServiceConfig.defaultNotificationChannel
|
|
16
17
|
import net.gotev.uploadservice.UploadServiceConfig.httpStack
|
|
17
18
|
import net.gotev.uploadservice.UploadServiceConfig.initialize
|
|
19
|
+
import net.gotev.uploadservice.UploadWorker
|
|
18
20
|
import net.gotev.uploadservice.data.UploadNotificationConfig
|
|
19
21
|
import net.gotev.uploadservice.data.UploadNotificationStatusConfig
|
|
22
|
+
import net.gotev.uploadservice.extensions.startNewUpload
|
|
20
23
|
import net.gotev.uploadservice.observer.request.GlobalRequestObserver
|
|
21
24
|
import net.gotev.uploadservice.okhttp.OkHttpStack
|
|
25
|
+
import net.gotev.uploadservice.placeholders.Placeholder
|
|
26
|
+
import net.gotev.uploadservice.protocols.binary.BinaryUploadRequest
|
|
27
|
+
import net.gotev.uploadservice.protocols.multipart.MultipartUploadRequest
|
|
22
28
|
import okhttp3.OkHttpClient
|
|
23
29
|
import java.io.File
|
|
24
30
|
import java.util.concurrent.TimeUnit
|
|
@@ -119,6 +125,7 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
119
125
|
}
|
|
120
126
|
readTimeout = options.getInt("readTimeout")
|
|
121
127
|
}
|
|
128
|
+
|
|
122
129
|
httpStack = OkHttpStack(OkHttpClient().newBuilder()
|
|
123
130
|
.followRedirects(followRedirects)
|
|
124
131
|
.followSslRedirects(followSslRedirects)
|
|
@@ -197,7 +204,7 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
197
204
|
val customUploadId = if (options.hasKey("customUploadId") && options.getType("method") == ReadableType.String) options.getString("customUploadId") else null
|
|
198
205
|
try {
|
|
199
206
|
val request = if (requestType == "raw") {
|
|
200
|
-
|
|
207
|
+
BinaryUploadRequest(this.reactApplicationContext, url!!)
|
|
201
208
|
.setFileToUpload(filePath!!)
|
|
202
209
|
} else {
|
|
203
210
|
if (!options.hasKey("field")) {
|
|
@@ -208,36 +215,46 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
208
215
|
promise.reject(java.lang.IllegalArgumentException("field must be string."))
|
|
209
216
|
return
|
|
210
217
|
}
|
|
211
|
-
|
|
218
|
+
MultipartUploadRequest(this.reactApplicationContext, url!!)
|
|
212
219
|
.addFileToUpload(filePath!!, options.getString("field")!!)
|
|
213
220
|
}
|
|
214
221
|
request.setMethod(method!!)
|
|
215
222
|
.setMaxRetries(maxRetries)
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
223
|
+
|
|
224
|
+
val filename = notification.getString("filename")
|
|
225
|
+
val notificationConfig = UploadNotificationConfig(
|
|
226
|
+
notificationChannelId = defaultNotificationChannel!!,
|
|
227
|
+
isRingToneEnabled = true,
|
|
228
|
+
progress = UploadNotificationStatusConfig(
|
|
229
|
+
title = "Uploading ${filename}",
|
|
230
|
+
message = "Uploading at ${Placeholder.UploadRate} (${Placeholder.Progress})",
|
|
231
|
+
// actions = arrayListOf(
|
|
232
|
+
// UploadNotificationAction(
|
|
233
|
+
// icon = android.R.drawable.ic_menu_close_clear_cancel,
|
|
234
|
+
// title = "Cancel",
|
|
235
|
+
// intent = context.getCancelUploadIntent(uploadId)
|
|
236
|
+
// )
|
|
237
|
+
// )
|
|
238
|
+
),
|
|
239
|
+
success = UploadNotificationStatusConfig(
|
|
240
|
+
title = "Upload complete",
|
|
241
|
+
message = "Upload completed successfully in ${Placeholder.ElapsedTime}",
|
|
242
|
+
autoClear = true
|
|
243
|
+
),
|
|
244
|
+
error = UploadNotificationStatusConfig(
|
|
245
|
+
title = "Upload failed",
|
|
246
|
+
message = "Error uploading ${filename}",
|
|
247
|
+
autoClear = true
|
|
248
|
+
),
|
|
249
|
+
cancelled = UploadNotificationStatusConfig(
|
|
250
|
+
title = "Upload cancelled",
|
|
251
|
+
message = "Upload cancelled",
|
|
252
|
+
autoClear = true
|
|
237
253
|
)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
request.setNotificationConfig { _, _ ->
|
|
257
|
+
notificationConfig
|
|
241
258
|
}
|
|
242
259
|
if (options.hasKey("parameters")) {
|
|
243
260
|
if (requestType == "raw") {
|
|
@@ -268,8 +285,7 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
268
285
|
}
|
|
269
286
|
}
|
|
270
287
|
if (customUploadId != null)
|
|
271
|
-
request.
|
|
272
|
-
|
|
288
|
+
request.setUploadID(customUploadId)
|
|
273
289
|
val uploadId = request.startUpload()
|
|
274
290
|
promise.resolve(uploadId)
|
|
275
291
|
} catch (exc: java.lang.Exception) {
|
|
@@ -292,7 +308,7 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
292
308
|
}
|
|
293
309
|
|
|
294
310
|
try {
|
|
295
|
-
|
|
311
|
+
UploadWorker.stopUpload(cancelUploadId);
|
|
296
312
|
val params = Arguments.createMap()
|
|
297
313
|
params.putString("id", cancelUploadId)
|
|
298
314
|
this.reactContext.emitDeviceEvent("RNFileUploader-cancelled", params)
|
|
@@ -310,8 +326,8 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
310
326
|
@ReactMethod
|
|
311
327
|
fun stopAllUploads(promise: Promise) {
|
|
312
328
|
try {
|
|
313
|
-
|
|
314
|
-
|
|
329
|
+
UploadWorker.stopAllUploads()
|
|
330
|
+
UploadWorker.taskList.forEach {
|
|
315
331
|
val params = Arguments.createMap()
|
|
316
332
|
params.putString("id", it)
|
|
317
333
|
this.reactContext.emitDeviceEvent("RNFileUploader-cancelled", params);
|
|
@@ -339,6 +355,7 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
339
355
|
continue
|
|
340
356
|
}
|
|
341
357
|
|
|
358
|
+
|
|
342
359
|
val upload = Arguments.createMap()
|
|
343
360
|
|
|
344
361
|
val idTag = info.tags.toTypedArray().find { it.startsWith(UploadWorker::class.java.simpleName) }
|
|
@@ -358,7 +375,7 @@ class UploaderModule(val reactContext: ReactApplicationContext) : ReactContextBa
|
|
|
358
375
|
uploads.pushMap(upload)
|
|
359
376
|
}
|
|
360
377
|
|
|
361
|
-
val uploadTaskList =
|
|
378
|
+
val uploadTaskList = UploadWorker.taskList
|
|
362
379
|
for (task in uploadTaskList) {
|
|
363
380
|
val upload = Arguments.createMap()
|
|
364
381
|
upload.putString("id", task)
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { EmitterSubscription } from 'react-native';
|
|
5
5
|
export type UploadEvent = 'progress' | 'error' | 'completed' | 'cancelled';
|
|
6
6
|
export type NotificationOptions = {
|
|
7
|
+
filename: string;
|
|
7
8
|
/**
|
|
8
9
|
* Enable or diasable notifications. Works only on Android version < 8.0 Oreo. On Android versions >= 8.0 Oreo is required by Google's policy to display a notification when a background service run { enabled: true }
|
|
9
10
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
export type UploadEvent = 'progress' | 'error' | 'completed' | 'cancelled';
|
|
12
12
|
|
|
13
13
|
export type NotificationOptions = {
|
|
14
|
+
filename: string;
|
|
14
15
|
/**
|
|
15
16
|
* Enable or diasable notifications. Works only on Android version < 8.0 Oreo. On Android versions >= 8.0 Oreo is required by Google's policy to display a notification when a background service run { enabled: true }
|
|
16
17
|
*/
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
package com.appfolio.extensions
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import com.appfolio.work.TaskCompletionNotifier
|
|
5
|
-
import com.appfolio.work.UploadManager
|
|
6
|
-
import net.gotev.uploadservice.UploadTask
|
|
7
|
-
import net.gotev.uploadservice.data.UploadNotificationConfig
|
|
8
|
-
import net.gotev.uploadservice.data.UploadTaskParameters
|
|
9
|
-
import net.gotev.uploadservice.logger.UploadServiceLogger
|
|
10
|
-
import net.gotev.uploadservice.observer.task.BroadcastEmitter
|
|
11
|
-
|
|
12
|
-
data class UploadTaskCreationParameters(
|
|
13
|
-
val params: UploadTaskParameters,
|
|
14
|
-
val notificationConfig: UploadNotificationConfig
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Creates a new task instance based on the requested task class in the intent.
|
|
19
|
-
* @param creationParameters task creation params
|
|
20
|
-
* @return task instance or null if the task class is not supported or invalid
|
|
21
|
-
*/
|
|
22
|
-
@Suppress("UNCHECKED_CAST")
|
|
23
|
-
fun Context.getUploadTask(
|
|
24
|
-
creationParameters: UploadTaskCreationParameters,
|
|
25
|
-
notificationId: Int
|
|
26
|
-
): UploadTask? {
|
|
27
|
-
return try {
|
|
28
|
-
val observers = arrayOf(
|
|
29
|
-
BroadcastEmitter(this),
|
|
30
|
-
TaskCompletionNotifier()
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
val taskClass = Class.forName(creationParameters.params.taskClass) as Class<out UploadTask>
|
|
34
|
-
val uploadTask = taskClass.newInstance().apply {
|
|
35
|
-
init(
|
|
36
|
-
context = this@getUploadTask,
|
|
37
|
-
taskParams = creationParameters.params,
|
|
38
|
-
notificationConfig = creationParameters.notificationConfig,
|
|
39
|
-
notificationId = notificationId,
|
|
40
|
-
taskObservers = observers
|
|
41
|
-
)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
UploadServiceLogger.debug(
|
|
45
|
-
component = UploadManager.TAG,
|
|
46
|
-
uploadId = creationParameters.params.id,
|
|
47
|
-
message = {
|
|
48
|
-
"Successfully created new task with class: ${taskClass.name}"
|
|
49
|
-
}
|
|
50
|
-
)
|
|
51
|
-
uploadTask
|
|
52
|
-
} catch (exc: Throwable) {
|
|
53
|
-
UploadServiceLogger.error(
|
|
54
|
-
component = UploadManager.TAG,
|
|
55
|
-
uploadId = "",
|
|
56
|
-
exception = exc,
|
|
57
|
-
message = {
|
|
58
|
-
"Error while instantiating new task"
|
|
59
|
-
}
|
|
60
|
-
)
|
|
61
|
-
null
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
package com.appfolio.extensions
|
|
2
|
-
|
|
3
|
-
import androidx.work.Constraints
|
|
4
|
-
import androidx.work.Data
|
|
5
|
-
import androidx.work.NetworkType
|
|
6
|
-
import androidx.work.OneTimeWorkRequest
|
|
7
|
-
import com.google.gson.Gson
|
|
8
|
-
import net.gotev.uploadservice.data.UploadFile
|
|
9
|
-
import net.gotev.uploadservice.data.UploadNotificationConfig
|
|
10
|
-
import net.gotev.uploadservice.data.UploadTaskParameters
|
|
11
|
-
import net.gotev.uploadservice.extensions.setOrRemove
|
|
12
|
-
import net.gotev.uploadservice.persistence.PersistableData
|
|
13
|
-
|
|
14
|
-
private const val PROPERTY_PARAM_NAME = "multipartParamName"
|
|
15
|
-
private const val PROPERTY_REMOTE_FILE_NAME = "multipartRemoteFileName"
|
|
16
|
-
private const val PROPERTY_CONTENT_TYPE = "multipartContentType"
|
|
17
|
-
const val PARAM_KEY_TASK_PARAMS = "PARAM_KEY_TASK_PARAMS"
|
|
18
|
-
const val PARAM_KEY_NOTIF_CONFIG = "PARAM_KEY_NOTIF_CONFIG"
|
|
19
|
-
|
|
20
|
-
internal var UploadFile.parameterName: String?
|
|
21
|
-
get() = properties[PROPERTY_PARAM_NAME]
|
|
22
|
-
set(value) {
|
|
23
|
-
properties.setOrRemove(PROPERTY_PARAM_NAME, value)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
internal var UploadFile.remoteFileName: String?
|
|
27
|
-
get() = properties[PROPERTY_REMOTE_FILE_NAME]
|
|
28
|
-
set(value) {
|
|
29
|
-
properties.setOrRemove(PROPERTY_REMOTE_FILE_NAME, value)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
internal var UploadFile.contentType: String?
|
|
33
|
-
get() = properties[PROPERTY_CONTENT_TYPE]
|
|
34
|
-
set(value) {
|
|
35
|
-
properties.setOrRemove(PROPERTY_CONTENT_TYPE, value)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
internal fun UploadTaskParameters.toJson(): String = toPersistableData().toJson()
|
|
39
|
-
|
|
40
|
-
internal fun String.toUploadTaskParameters(): UploadTaskParameters = UploadTaskParameters.createFromPersistableData(PersistableData.fromJson(this))
|
|
41
|
-
|
|
42
|
-
internal fun UploadNotificationConfig.toJson(): String = Gson().toJson(this)
|
|
43
|
-
|
|
44
|
-
internal fun String.toUploadNotificationConfig() = Gson().fromJson(this, UploadNotificationConfig::class.java)
|
|
45
|
-
|
|
46
|
-
internal fun OneTimeWorkRequest.Builder.setData(uploadTaskParameters: UploadTaskParameters, notificationConfig: UploadNotificationConfig) {
|
|
47
|
-
val data = Data.Builder()
|
|
48
|
-
data.putString(PARAM_KEY_TASK_PARAMS, uploadTaskParameters.toJson())
|
|
49
|
-
data.putString(PARAM_KEY_NOTIF_CONFIG, notificationConfig.toJson())
|
|
50
|
-
setInputData(data.build())
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
internal fun OneTimeWorkRequest.Builder.shouldLimitNetwork(limit: Boolean) {
|
|
54
|
-
val network = if (limit) NetworkType.UNMETERED else NetworkType.CONNECTED
|
|
55
|
-
val constraints = Constraints.Builder().setRequiredNetworkType(network).build()
|
|
56
|
-
setConstraints(constraints)
|
|
57
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
package com.appfolio.uploader
|
|
2
|
-
import android.content.Context
|
|
3
|
-
import net.gotev.uploadservice.UploadTask
|
|
4
|
-
import net.gotev.uploadservice.data.UploadFile
|
|
5
|
-
import net.gotev.uploadservice.protocols.binary.BinaryUploadRequest
|
|
6
|
-
import net.gotev.uploadservice.protocols.binary.BinaryUploadTask
|
|
7
|
-
import java.io.FileNotFoundException
|
|
8
|
-
import java.io.IOException
|
|
9
|
-
|
|
10
|
-
class ModifiedBinaryUploadRequest(context: Context, serverUrl: String, limitNetwork: Boolean) :
|
|
11
|
-
ModifiedHttpUploadRequest<ModifiedBinaryUploadRequest>(context, serverUrl, limitNetwork) {
|
|
12
|
-
|
|
13
|
-
override val taskClass: Class<out UploadTask>
|
|
14
|
-
get() = BinaryUploadTask::class.java
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Sets the file used as raw body of the upload request.
|
|
18
|
-
*
|
|
19
|
-
* @param path path to the file that you want to upload
|
|
20
|
-
* @throws FileNotFoundException if the file to upload does not exist
|
|
21
|
-
* @return [BinaryUploadRequest]
|
|
22
|
-
*/
|
|
23
|
-
@Throws(IOException::class)
|
|
24
|
-
fun setFileToUpload(path: String): ModifiedBinaryUploadRequest {
|
|
25
|
-
files.clear()
|
|
26
|
-
files.add(UploadFile(path))
|
|
27
|
-
return this
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
package com.appfolio.uploader
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import androidx.work.OneTimeWorkRequest
|
|
5
|
-
import androidx.work.WorkManager
|
|
6
|
-
import com.appfolio.extensions.setData
|
|
7
|
-
import com.appfolio.extensions.shouldLimitNetwork
|
|
8
|
-
import com.appfolio.work.UploadManager
|
|
9
|
-
import com.appfolio.work.UploadWorker
|
|
10
|
-
import net.gotev.uploadservice.HttpUploadRequest
|
|
11
|
-
import net.gotev.uploadservice.data.UploadTaskParameters
|
|
12
|
-
import java.util.*
|
|
13
|
-
|
|
14
|
-
abstract class ModifiedHttpUploadRequest<B : HttpUploadRequest<B>>(context: Context, serverUrl: String, private val limitNetwork: Boolean = false) :
|
|
15
|
-
HttpUploadRequest<B>(context, serverUrl) {
|
|
16
|
-
|
|
17
|
-
private var started: Boolean = false
|
|
18
|
-
private var uploadId = UUID.randomUUID().toString()
|
|
19
|
-
private val uploadTaskParameters: UploadTaskParameters
|
|
20
|
-
get() = UploadTaskParameters(
|
|
21
|
-
taskClass = taskClass.name,
|
|
22
|
-
id = uploadId,
|
|
23
|
-
serverUrl = serverUrl,
|
|
24
|
-
maxRetries = maxRetries,
|
|
25
|
-
autoDeleteSuccessfullyUploadedFiles = autoDeleteSuccessfullyUploadedFiles,
|
|
26
|
-
files = files,
|
|
27
|
-
additionalParameters = getAdditionalParameters()
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
override fun startUpload(): String {
|
|
31
|
-
require(files.isNotEmpty()) { "Set the file to be used in the request body first!" }
|
|
32
|
-
check(!started) {
|
|
33
|
-
"You have already called startUpload() on this Upload request instance once and you " +
|
|
34
|
-
"cannot call it multiple times. Check your code."
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
check(!UploadManager.taskList.contains(uploadTaskParameters.id)) {
|
|
38
|
-
"You have tried to perform startUpload() using the same uploadID of an " +
|
|
39
|
-
"already running task. You're trying to use the same ID for multiple uploads."
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
started = true
|
|
43
|
-
val workManager: WorkManager = WorkManager.getInstance(context)
|
|
44
|
-
val uploadRequest = OneTimeWorkRequest.Builder(UploadWorker::class.java)
|
|
45
|
-
uploadRequest.shouldLimitNetwork(limitNetwork)
|
|
46
|
-
uploadRequest.addTag("${UploadWorker::class.java.simpleName}-$uploadId")
|
|
47
|
-
uploadRequest.setData(uploadTaskParameters, notificationConfig(context, uploadId))
|
|
48
|
-
workManager.enqueue(uploadRequest.build())
|
|
49
|
-
|
|
50
|
-
return uploadTaskParameters.id;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
fun setCustomUploadID(uploadID: String) {
|
|
54
|
-
this.uploadId = uploadID
|
|
55
|
-
setUploadID(uploadID)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
package com.appfolio.uploader
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import com.appfolio.extensions.contentType
|
|
5
|
-
import com.appfolio.extensions.parameterName
|
|
6
|
-
import com.appfolio.extensions.remoteFileName
|
|
7
|
-
import net.gotev.uploadservice.UploadTask
|
|
8
|
-
import net.gotev.uploadservice.data.UploadFile
|
|
9
|
-
import net.gotev.uploadservice.protocols.multipart.MultipartUploadTask
|
|
10
|
-
import java.io.FileNotFoundException
|
|
11
|
-
|
|
12
|
-
class ModifiedMultipartUploadRequest(context: Context, serverUrl: String, limitNetwork: Boolean) :
|
|
13
|
-
ModifiedHttpUploadRequest<ModifiedMultipartUploadRequest>(context, serverUrl, limitNetwork) {
|
|
14
|
-
|
|
15
|
-
override val taskClass: Class<out UploadTask>
|
|
16
|
-
get() = MultipartUploadTask::class.java
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Adds a file to this upload request.
|
|
20
|
-
*
|
|
21
|
-
* @param filePath path to the file that you want to upload
|
|
22
|
-
* @param parameterName Name of the form parameter that will contain file's data
|
|
23
|
-
* @param fileName File name seen by the server side script. If null, the original file name
|
|
24
|
-
* will be used
|
|
25
|
-
* @param contentType Content type of the file. If null or empty, the mime type will be
|
|
26
|
-
* automatically detected. If fore some reasons autodetection fails,
|
|
27
|
-
* `application/octet-stream` will be used by default
|
|
28
|
-
* @return [ModifiedMultipartUploadRequest]
|
|
29
|
-
*/
|
|
30
|
-
@Throws(FileNotFoundException::class)
|
|
31
|
-
@JvmOverloads
|
|
32
|
-
fun addFileToUpload(
|
|
33
|
-
filePath: String,
|
|
34
|
-
parameterName: String,
|
|
35
|
-
fileName: String? = null,
|
|
36
|
-
contentType: String? = null
|
|
37
|
-
): ModifiedMultipartUploadRequest {
|
|
38
|
-
require(filePath.isNotBlank() && parameterName.isNotBlank()) {
|
|
39
|
-
"Please specify valid filePath and parameterName. They cannot be blank."
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
files.add(UploadFile(filePath).apply {
|
|
43
|
-
this.parameterName = parameterName
|
|
44
|
-
|
|
45
|
-
this.contentType = if (contentType.isNullOrBlank()) {
|
|
46
|
-
handler.contentType(context)
|
|
47
|
-
} else {
|
|
48
|
-
contentType
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
remoteFileName = if (fileName.isNullOrBlank()) {
|
|
52
|
-
handler.name(context)
|
|
53
|
-
} else {
|
|
54
|
-
fileName
|
|
55
|
-
}
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
return this
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
package com.appfolio.work
|
|
2
|
-
|
|
3
|
-
import net.gotev.uploadservice.data.UploadInfo
|
|
4
|
-
import net.gotev.uploadservice.data.UploadNotificationConfig
|
|
5
|
-
import net.gotev.uploadservice.network.ServerResponse
|
|
6
|
-
import net.gotev.uploadservice.observer.task.UploadTaskObserver
|
|
7
|
-
|
|
8
|
-
class TaskCompletionNotifier : UploadTaskObserver {
|
|
9
|
-
override fun onStart(
|
|
10
|
-
info: UploadInfo,
|
|
11
|
-
notificationId: Int,
|
|
12
|
-
notificationConfig: UploadNotificationConfig
|
|
13
|
-
) {
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
override fun onProgress(
|
|
17
|
-
info: UploadInfo,
|
|
18
|
-
notificationId: Int,
|
|
19
|
-
notificationConfig: UploadNotificationConfig
|
|
20
|
-
) {
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
override fun onSuccess(
|
|
24
|
-
info: UploadInfo,
|
|
25
|
-
notificationId: Int,
|
|
26
|
-
notificationConfig: UploadNotificationConfig,
|
|
27
|
-
response: ServerResponse
|
|
28
|
-
) {
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
override fun onError(
|
|
32
|
-
info: UploadInfo,
|
|
33
|
-
notificationId: Int,
|
|
34
|
-
notificationConfig: UploadNotificationConfig,
|
|
35
|
-
exception: Throwable
|
|
36
|
-
) {
|
|
37
|
-
UploadManager.taskFailed(info.uploadId)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
override fun onCompleted(
|
|
41
|
-
info: UploadInfo,
|
|
42
|
-
notificationId: Int,
|
|
43
|
-
notificationConfig: UploadNotificationConfig
|
|
44
|
-
) {
|
|
45
|
-
UploadManager.taskCompleted(info.uploadId)
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
package com.appfolio.work
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import com.appfolio.extensions.UploadTaskCreationParameters
|
|
5
|
-
import com.appfolio.extensions.getUploadTask
|
|
6
|
-
import net.gotev.uploadservice.UploadTask
|
|
7
|
-
import net.gotev.uploadservice.data.UploadNotificationConfig
|
|
8
|
-
import net.gotev.uploadservice.data.UploadTaskParameters
|
|
9
|
-
import net.gotev.uploadservice.logger.UploadServiceLogger
|
|
10
|
-
import java.util.concurrent.*
|
|
11
|
-
|
|
12
|
-
class UploadManager {
|
|
13
|
-
|
|
14
|
-
companion object {
|
|
15
|
-
/**
|
|
16
|
-
* Sets the Thread Pool to use for upload operations.
|
|
17
|
-
* By default a thread pool with size equal to the number of processors is created.
|
|
18
|
-
*/
|
|
19
|
-
@JvmStatic
|
|
20
|
-
var threadPool: AbstractExecutorService = ThreadPoolExecutor(
|
|
21
|
-
Runtime.getRuntime().availableProcessors(), // Initial pool size
|
|
22
|
-
Runtime.getRuntime().availableProcessors(), // Max pool size
|
|
23
|
-
5.toLong(), // Keep Alive Time
|
|
24
|
-
TimeUnit.SECONDS,
|
|
25
|
-
LinkedBlockingQueue<Runnable>()
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
val TAG: String = UploadManager::class.java.simpleName
|
|
29
|
-
|
|
30
|
-
private const val UPLOAD_NOTIFICATION_BASE_ID = 1234 // Something unique
|
|
31
|
-
|
|
32
|
-
private var notificationIncrementalId = 0
|
|
33
|
-
private val uploadTasksMap = ConcurrentHashMap<String, UploadTask>()
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Stops the upload task with the given uploadId.
|
|
37
|
-
* @param uploadId The unique upload id
|
|
38
|
-
*/
|
|
39
|
-
@Synchronized
|
|
40
|
-
@JvmStatic
|
|
41
|
-
fun stopUpload(uploadId: String) {
|
|
42
|
-
uploadTasksMap[uploadId]?.cancel()
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Gets the list of the currently active upload tasks.
|
|
47
|
-
* @return list of uploadIDs or an empty list if no tasks are currently running
|
|
48
|
-
*/
|
|
49
|
-
@JvmStatic
|
|
50
|
-
val taskList: List<String>
|
|
51
|
-
@Synchronized get() = if (uploadTasksMap.isEmpty()) {
|
|
52
|
-
emptyList()
|
|
53
|
-
} else {
|
|
54
|
-
uploadTasksMap.keys().toList()
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Stop all the active uploads.
|
|
59
|
-
*/
|
|
60
|
-
@Synchronized
|
|
61
|
-
@JvmStatic
|
|
62
|
-
fun stopAllUploads() {
|
|
63
|
-
val iterator = uploadTasksMap.keys.iterator()
|
|
64
|
-
|
|
65
|
-
while (iterator.hasNext()) {
|
|
66
|
-
uploadTasksMap[iterator.next()]?.cancel()
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
fun startUpload(context: Context, params: UploadTaskParameters, notificationConfig: UploadNotificationConfig) {
|
|
71
|
-
val taskCreationParameters = UploadTaskCreationParameters(params, notificationConfig)
|
|
72
|
-
|
|
73
|
-
if (uploadTasksMap.containsKey(taskCreationParameters.params.id)) {
|
|
74
|
-
UploadServiceLogger.error(TAG, taskCreationParameters.params.id) {
|
|
75
|
-
"Preventing upload! An upload with the same ID is already in progress. " +
|
|
76
|
-
"Every upload must have unique ID. Please check your code and fix it!"
|
|
77
|
-
}
|
|
78
|
-
return
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
val currentTask = context.getUploadTask(
|
|
82
|
-
creationParameters = taskCreationParameters,
|
|
83
|
-
notificationId = UPLOAD_NOTIFICATION_BASE_ID + notificationIncrementalId,
|
|
84
|
-
) ?: return
|
|
85
|
-
|
|
86
|
-
uploadTasksMap[currentTask.params.id] = currentTask
|
|
87
|
-
threadPool.execute(currentTask)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Called by each task when it errors out.
|
|
92
|
-
* @param uploadId the uploadID of the task with error
|
|
93
|
-
*/
|
|
94
|
-
@Synchronized
|
|
95
|
-
fun taskFailed(uploadId: String) {
|
|
96
|
-
uploadTasksMap.remove(uploadId)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Called by each task when it is completed (either successfully, with an error or due to
|
|
101
|
-
* user cancellation).
|
|
102
|
-
* @param uploadId the uploadID of the finished task
|
|
103
|
-
*/
|
|
104
|
-
@Synchronized
|
|
105
|
-
fun taskCompleted(uploadId: String) {
|
|
106
|
-
uploadTasksMap.remove(uploadId)
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
package com.appfolio.work
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import androidx.work.Worker
|
|
5
|
-
import androidx.work.WorkerParameters
|
|
6
|
-
import com.appfolio.extensions.PARAM_KEY_NOTIF_CONFIG
|
|
7
|
-
import com.appfolio.extensions.PARAM_KEY_TASK_PARAMS
|
|
8
|
-
import com.appfolio.extensions.toUploadNotificationConfig
|
|
9
|
-
import com.appfolio.extensions.toUploadTaskParameters
|
|
10
|
-
|
|
11
|
-
class UploadWorker(val context: Context, params: WorkerParameters): Worker(context, params) {
|
|
12
|
-
|
|
13
|
-
override fun doWork(): Result {
|
|
14
|
-
val taskParamsStr = inputData.getString(PARAM_KEY_TASK_PARAMS) ?: return Result.failure()
|
|
15
|
-
val notifConfigStr = inputData.getString(PARAM_KEY_NOTIF_CONFIG) ?: return Result.failure()
|
|
16
|
-
|
|
17
|
-
UploadManager.startUpload(context, taskParamsStr.toUploadTaskParameters(), notifConfigStr.toUploadNotificationConfig())
|
|
18
|
-
return Result.success()
|
|
19
|
-
}
|
|
20
|
-
}
|