X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/a7cbc53251aac878a9a356166d388685523f26bc..8361540852ec87b51c85937e0f326a83e19cd8ad:/src/com/owncloud/android/files/services/FileUploader.java diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 958036a7..6d443a9c 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -36,9 +36,9 @@ import com.owncloud.android.files.InstantUploadBroadcastReceiver; import com.owncloud.android.operations.ChunkedUploadFileOperation; import com.owncloud.android.operations.RemoteOperationResult; import com.owncloud.android.operations.UploadFileOperation; +import com.owncloud.android.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.ui.activity.FileDetailActivity; import com.owncloud.android.ui.fragment.FileDetailFragment; -import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.OwnCloudVersion; import eu.alefzero.webdav.OnDatatransferProgressListener; @@ -87,6 +87,11 @@ public class FileUploader extends Service implements OnDatatransferProgressListe public static final String KEY_UPLOAD_TYPE = "UPLOAD_TYPE"; public static final String KEY_FORCE_OVERWRITE = "KEY_FORCE_OVERWRITE"; public static final String KEY_INSTANT_UPLOAD = "INSTANT_UPLOAD"; + public static final String KEY_LOCAL_BEHAVIOUR = "BEHAVIOUR"; + + public static final int LOCAL_BEHAVIOUR_COPY = 0; + public static final int LOCAL_BEHAVIOUR_MOVE = 1; + public static final int LOCAL_BEHAVIOUR_FORGET = 2; public static final int UPLOAD_SINGLE_FILE = 0; public static final int UPLOAD_MULTIPLE_FILES = 1; @@ -199,7 +204,8 @@ public class FileUploader extends Service implements OnDatatransferProgressListe FileDataStorageManager storageManager = new FileDataStorageManager(account, getContentResolver()); boolean forceOverwrite = intent.getBooleanExtra(KEY_FORCE_OVERWRITE, false); - boolean isInstant = intent.getBooleanExtra(KEY_INSTANT_UPLOAD, false); + boolean isInstant = intent.getBooleanExtra(KEY_INSTANT_UPLOAD, false); + int localAction = intent.getIntExtra(KEY_LOCAL_BEHAVIOUR, LOCAL_BEHAVIOUR_COPY); boolean fixed = false; if (isInstant) { fixed = checkAndFixInstantUploadDirectory(storageManager); // MUST be done BEFORE calling obtainNewOCFileToUpload @@ -238,9 +244,9 @@ public class FileUploader extends Service implements OnDatatransferProgressListe for (int i=0; i < files.length; i++) { uploadKey = buildRemoteName(account, files[i].getRemotePath()); if (chunked) { - newUpload = new ChunkedUploadFileOperation(account, files[i], isInstant, forceOverwrite); + newUpload = new ChunkedUploadFileOperation(account, files[i], isInstant, forceOverwrite, localAction); } else { - newUpload = new UploadFileOperation(account, files[i], isInstant, forceOverwrite); + newUpload = new UploadFileOperation(account, files[i], isInstant, forceOverwrite, localAction); } if (fixed && i==0) { newUpload.setRemoteFolderToBeCreated(); @@ -458,42 +464,21 @@ public class FileUploader extends Service implements OnDatatransferProgressListe } catch (Exception e) { result = new RemoteOperationResult(e); - Log.i(TAG, "Update: synchronizing properties for uploaded " + mCurrentUpload.getRemotePath() + ": " + result.getLogMessage(), e); + Log.e(TAG, "Update: synchronizing properties for uploaded " + mCurrentUpload.getRemotePath() + ": " + result.getLogMessage(), e); } finally { if (propfind != null) propfind.releaseConnection(); } - + /// maybe this would be better as part of UploadFileOperation... or maybe all this method if (mCurrentUpload.wasRenamed()) { OCFile oldFile = mCurrentUpload.getOldFile(); - if (!oldFile.fileExists()) { - // just a name coincidence - file.setStoragePath(oldFile.getStoragePath()); - - } else { - // conflict resolved with 'Keep both' by the user - File localFile = new File(oldFile.getStoragePath()); - File newLocalFile = new File(FileStorageUtils.getDefaultSavePathFor(mCurrentUpload.getAccount().name, file)); - boolean renameSuccessed = localFile.renameTo(newLocalFile); - if (renameSuccessed) { - file.setStoragePath(newLocalFile.getAbsolutePath()); - - } else { - // poor solution - Log.d(TAG, "DAMN IT: local rename failed after uploading a file with a new name already existing both in the remote account and the local database (should be due to a conflict solved with 'keep both'"); - file.setStoragePath(null); - // not so fine: - // - local file will be kept there as 'trash' until is download (and overwritten) again from the server; - // - user will see as 'not down' a file that was just upload - // BUT: - // - no loss of data happened - // - when the user downloads again the renamed and original file from the server, local file names and contents will be correctly synchronized with names and contents in server - } + if (oldFile.fileExists()) { oldFile.setStoragePath(null); mStorageManager.saveFile(oldFile); - } + + } // else: it was just an automatic renaming due to a name coincidence; nothing else is needed, the storagePath is right in the instance returned by mCurrentUpload.getFile() } mStorageManager.saveFile(file); @@ -661,9 +646,18 @@ public class FileUploader extends Service implements OnDatatransferProgressListe finalNotification.flags |= Notification.FLAG_AUTO_CANCEL; // TODO put something smart in the contentIntent below finalNotification.contentIntent = PendingIntent.getActivity(getApplicationContext(), (int)System.currentTimeMillis(), new Intent(), 0); + + String content = null; + if (uploadResult.getCode() == ResultCode.LOCAL_STORAGE_FULL || + uploadResult.getCode() == ResultCode.LOCAL_STORAGE_NOT_COPIED) { + // TODO we need a class to provide error messages for the users from a RemoteOperationResult and a RemoteOperation + content = String.format(getString(R.string.error__upload__local_file_not_copied), (new File(upload.getStoragePath())).getName(), getString(R.string.app_name)); + } else { + content = String.format(getString(R.string.uploader_upload_failed_content_single), (new File(upload.getStoragePath())).getName()); + } finalNotification.setLatestEventInfo( getApplicationContext(), getString(R.string.uploader_upload_failed_ticker), - String.format(getString(R.string.uploader_upload_failed_content_single), (new File(upload.getStoragePath())).getName()), + content, finalNotification.contentIntent); mNotificationManager.notify(R.string.uploader_upload_failed_ticker, finalNotification);