Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÁlvaro Brey <alvaro.brey@nextcloud.com>2022-10-27 16:52:42 +0300
committerÁlvaro Brey <alvaro.brey@nextcloud.com>2022-10-28 11:37:42 +0300
commit044a32167835894a63d6c9b7809e56af01d358ce (patch)
tree07d2bfbd838bf5fc25cfdc8ff36a1dcd4d3b4dd7
parent81ec72416f8509a6219bc94e3930da541b9ee50e (diff)
FilesUploadHelper: insert all uploads in single transaction to avoid too many listener calls
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
-rw-r--r--app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java66
-rw-r--r--app/src/main/java/com/owncloud/android/utils/FilesUploadHelper.kt12
2 files changed, 59 insertions, 19 deletions
diff --git a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java
index 0e5be35b90..8d477f6005 100644
--- a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java
+++ b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java
@@ -23,13 +23,18 @@
*/
package com.owncloud.android.datamodel;
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
+import android.os.RemoteException;
import com.nextcloud.client.account.CurrentAccountProvider;
import com.nextcloud.client.account.User;
+import com.owncloud.android.MainApp;
import com.owncloud.android.db.OCUpload;
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
import com.owncloud.android.db.UploadResult;
@@ -42,6 +47,7 @@ import com.owncloud.android.operations.UploadFileOperation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
+import java.util.List;
import java.util.Locale;
import java.util.Observable;
@@ -82,6 +88,52 @@ public class UploadsStorageManager extends Observable {
public long storeUpload(OCUpload ocUpload) {
Log_OC.v(TAG, "Inserting " + ocUpload.getLocalPath() + " with status=" + ocUpload.getUploadStatus());
+ ContentValues cv = getContentValues(ocUpload);
+ Uri result = getDB().insert(ProviderTableMeta.CONTENT_URI_UPLOADS, cv);
+
+ Log_OC.d(TAG, "storeUpload returns with: " + result + " for file: " + ocUpload.getLocalPath());
+ if (result == null) {
+ Log_OC.e(TAG, "Failed to insert item " + ocUpload.getLocalPath() + " into upload db.");
+ return -1;
+ } else {
+ long new_id = Long.parseLong(result.getPathSegments().get(1));
+ ocUpload.setUploadId(new_id);
+ notifyObserversNow();
+ return new_id;
+ }
+ }
+
+ public long[] storeUploads(final List<OCUpload> ocUploads) {
+ Log_OC.v(TAG, "Inserting " + ocUploads.size() + " uploads");
+ ArrayList<ContentProviderOperation> operations = new ArrayList<>(ocUploads.size());
+ for (OCUpload ocUpload : ocUploads) {
+ final ContentProviderOperation operation = ContentProviderOperation
+ .newInsert(ProviderTableMeta.CONTENT_URI_UPLOADS)
+ .withValues(getContentValues(ocUpload))
+ .build();
+ operations.add(operation);
+ }
+
+ try {
+ final ContentProviderResult[] contentProviderResults = getDB().applyBatch(MainApp.getAuthority(), operations);
+ final long[] newIds = new long[ocUploads.size()];
+ for (int i = 0; i < contentProviderResults.length; i++) {
+ final ContentProviderResult result = contentProviderResults[i];
+ final long new_id = Long.parseLong(result.uri.getPathSegments().get(1));
+ ocUploads.get(i).setUploadId(new_id);
+ newIds[i] = new_id;
+ }
+ notifyObserversNow();
+ return newIds;
+ } catch (OperationApplicationException | RemoteException e) {
+ Log_OC.e(TAG, "Error inserting uploads", e);
+ }
+
+ return null;
+ }
+
+ @NonNull
+ private ContentValues getContentValues(OCUpload ocUpload) {
ContentValues cv = new ContentValues();
cv.put(ProviderTableMeta.UPLOADS_LOCAL_PATH, ocUpload.getLocalPath());
cv.put(ProviderTableMeta.UPLOADS_REMOTE_PATH, ocUpload.getRemotePath());
@@ -96,20 +148,10 @@ public class UploadsStorageManager extends Observable {
cv.put(ProviderTableMeta.UPLOADS_IS_WHILE_CHARGING_ONLY, ocUpload.isWhileChargingOnly() ? 1 : 0);
cv.put(ProviderTableMeta.UPLOADS_IS_WIFI_ONLY, ocUpload.isUseWifiOnly() ? 1 : 0);
cv.put(ProviderTableMeta.UPLOADS_FOLDER_UNLOCK_TOKEN, ocUpload.getFolderUnlockToken());
- Uri result = getDB().insert(ProviderTableMeta.CONTENT_URI_UPLOADS, cv);
-
- Log_OC.d(TAG, "storeUpload returns with: " + result + " for file: " + ocUpload.getLocalPath());
- if (result == null) {
- Log_OC.e(TAG, "Failed to insert item " + ocUpload.getLocalPath() + " into upload db.");
- return -1;
- } else {
- long new_id = Long.parseLong(result.getPathSegments().get(1));
- ocUpload.setUploadId(new_id);
- notifyObserversNow();
- return new_id;
- }
+ return cv;
}
+
/**
* Update an upload object in DB.
*
diff --git a/app/src/main/java/com/owncloud/android/utils/FilesUploadHelper.kt b/app/src/main/java/com/owncloud/android/utils/FilesUploadHelper.kt
index 16f8017e62..d20cf289ad 100644
--- a/app/src/main/java/com/owncloud/android/utils/FilesUploadHelper.kt
+++ b/app/src/main/java/com/owncloud/android/utils/FilesUploadHelper.kt
@@ -55,8 +55,8 @@ class FilesUploadHelper {
nameCollisionPolicy: NameCollisionPolicy,
localBehavior: Int
) {
- for (i in localPaths.indices) {
- OCUpload(localPaths[i], remotePaths[i], user.accountName).apply {
+ val uploads = localPaths.mapIndexed { index, localPath ->
+ OCUpload(localPath, remotePaths[index], user.accountName).apply {
this.nameCollisionPolicy = nameCollisionPolicy
isUseWifiOnly = requiresWifi
isWhileChargingOnly = requiresCharging
@@ -64,10 +64,9 @@ class FilesUploadHelper {
this.createdBy = createdBy
isCreateRemoteFolder = createRemoteFolder
localAction = localBehavior
- }.also {
- uploadsStorageManager.storeUpload(it)
}
}
+ uploadsStorageManager.storeUploads(uploads)
backgroundJobManager.startFilesUploadJob(user)
}
@@ -79,7 +78,7 @@ class FilesUploadHelper {
) {
Log_OC.d(this, "upload updated file")
- for (file in existingFiles) {
+ val uploads = existingFiles.map { file ->
OCUpload(file, user).apply {
fileSize = file.fileLength
this.nameCollisionPolicy = nameCollisionPolicy
@@ -88,10 +87,9 @@ class FilesUploadHelper {
isUseWifiOnly = false
isWhileChargingOnly = false
uploadStatus = UploadsStorageManager.UploadStatus.UPLOAD_IN_PROGRESS
- }.also {
- uploadsStorageManager.storeUpload(it)
}
}
+ uploadsStorageManager.storeUploads(uploads)
backgroundJobManager.startFilesUploadJob(user)
}