@ammarahmed/react-native-upload 6.23.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.
@@ -72,10 +72,7 @@ dependencies {
72
72
 
73
73
  implementation "org.jetbrains.kotlin:$_kotlinStdlib:$_kotlinVersion"
74
74
 
75
- //noinspection GradleDependency
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'
@@ -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
- ModifiedBinaryUploadRequest(this.reactApplicationContext, url!!, limitNetwork)
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
- ModifiedMultipartUploadRequest(this.reactApplicationContext, url!!, limitNetwork)
218
+ MultipartUploadRequest(this.reactApplicationContext, url!!)
212
219
  .addFileToUpload(filePath!!, options.getString("field")!!)
213
220
  }
214
221
  request.setMethod(method!!)
215
222
  .setMaxRetries(maxRetries)
216
- if (notification.getBoolean("enabled")) {
217
- val notificationConfig = UploadNotificationConfig(
218
- notificationChannelId = notificationChannelID,
219
- isRingToneEnabled = notification.hasKey("enableRingTone") && notification.getBoolean("enableRingTone"),
220
- progress = UploadNotificationStatusConfig(
221
- title = if (notification.hasKey("onProgressTitle")) notification.getString("onProgressTitle")!! else "",
222
- message = if (notification.hasKey("onProgressMessage")) notification.getString("onProgressMessage")!! else ""
223
- ),
224
- success = UploadNotificationStatusConfig(
225
- title = if (notification.hasKey("onCompleteTitle")) notification.getString("onCompleteTitle")!! else "",
226
- message = if (notification.hasKey("onCompleteMessage")) notification.getString("onCompleteMessage")!! else "",
227
- autoClear = notification.hasKey("autoClear") && notification.getBoolean("autoClear")
228
- ),
229
- error = UploadNotificationStatusConfig(
230
- title = if (notification.hasKey("onErrorTitle")) notification.getString("onErrorTitle")!! else "",
231
- message = if (notification.hasKey("onErrorMessage")) notification.getString("onErrorMessage")!! else ""
232
- ),
233
- cancelled = UploadNotificationStatusConfig(
234
- title = if (notification.hasKey("onCancelledTitle")) notification.getString("onCancelledTitle")!! else "",
235
- message = if (notification.hasKey("onCancelledMessage")) notification.getString("onCancelledMessage")!! else ""
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
- request.setNotificationConfig { _, _ ->
239
- notificationConfig
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.setCustomUploadID(customUploadId)
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
- UploadManager.stopUpload(cancelUploadId)
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
- UploadManager.stopAllUploads()
314
- UploadManager.taskList.forEach {
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 = UploadManager.taskList
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
  */
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ammarahmed/react-native-upload",
3
- "version": "6.23.0",
3
+ "version": "6.24.0",
4
4
  "description": "Cross platform http post file uploader with Android and iOS background support.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
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
- }