}
if (mFilesForDirectDownload.isEmpty()) {
- // Send a broadcast message for notifying UI update
- Intent uiUpdate = new Intent(FileDownloader.getDownloadFinishMessage());
- uiUpdate.putExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, result.isSuccess());
- uiUpdate.putExtra(FileDownloader.ACCOUNT_NAME, mAccount.name);
- uiUpdate.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mRemotePath);
- uiUpdate.putExtra(FileDownloader.EXTRA_FILE_PATH, mLocalFolder.getRemotePath());
- mContext.sendStickyBroadcast(uiUpdate);
+ sendBroadcastForNotifyingUIUpdate(result.isSuccess());
}
}
- } catch (OperationCancelledException e) {
- result = new RemoteOperationResult(e);
- // cancel 'child' synchronizations
- for (SyncOperation synchOp: mFoldersToWalkDown) {
- ((SynchronizeFolderOperation) synchOp).cancel();
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
}
+
+ } catch (OperationCancelledException e) {
+ result = new RemoteOperationResult(e);
+
+ // Needed in case that cancellation occurs before starting any download.
+ // If not, yellow arrow continues being shown.
+ sendBroadcastForNotifyingUIUpdate(result.isSuccess());
+
+ /// cancellation of download needs to be done separately in any case; a SynchronizeFolderOperation
+ // may finish much sooner than the real download of the files in the folder
+ Intent intent = new Intent(mContext, FileDownloader.class);
+ intent.setAction(FileDownloader.ACTION_CANCEL_FILE_DOWNLOAD);
+ intent.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);
+ intent.putExtra(FileDownloader.EXTRA_FILE, mLocalFolder);
+ mContext.startService(intent);
}
return result;
Log_OC.e(TAG, "Checked " + mAccount.name + mRemotePath + " : " +
result.getLogMessage());
}
+
+ sendBroadcastForNotifyingUIUpdate(result.isSuccess());
}
return result;
* retrieved.
* @return 'True' when any change was made in the local data, 'false' otherwise
*/
- private void synchronizeData(ArrayList<Object> folderAndFiles, OwnCloudClient client) {
+ private void synchronizeData(ArrayList<Object> folderAndFiles, OwnCloudClient client)
+ throws OperationCancelledException {
FileDataStorageManager storageManager = getStorageManager();
// parse data from remote folder
mFilesForDirectDownload.clear();
mFilesToSyncContentsWithoutUpload.clear();
mFavouriteFilesToSyncContents.clear();
- mFoldersToWalkDown.clear();
+
+ synchronized(mFoldersToWalkDown) {
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
+ mFoldersToWalkDown.clear();
+ }
// get current data about local contents of the folder to synchronize
List<OCFile> localFiles = storageManager.getFolderContent(mLocalFolder);
mAccount,
mCurrentSyncTime
);
- mFoldersToWalkDown.add(synchFolderOp);
-
+
+ synchronized(mFoldersToWalkDown) {
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
+ mFoldersToWalkDown.add(synchFolderOp);
+ }
+
} else if (remoteFile.keepInSync()) {
/// prepare content synchronization for kept-in-sync files
SynchronizeFileOperation operation = new SynchronizeFileOperation(
}
- private void prepareOpsFromLocalKnowledge() {
+ private void prepareOpsFromLocalKnowledge() throws OperationCancelledException {
List<OCFile> children = getStorageManager().getFolderContent(mLocalFolder);
for (OCFile child : children) {
/// classify file to sync/download contents later
mAccount,
mCurrentSyncTime
);
- mFoldersToWalkDown.add(synchFolderOp);
-
+
+ synchronized(mFoldersToWalkDown) {
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
+ mFoldersToWalkDown.add(synchFolderOp);
+ }
+
} else {
/// prepare limited synchronization for regular files
if (!child.isDown()) {
}
}
+ private void sendBroadcastForNotifyingUIUpdate(boolean result) {
+ // Send a broadcast message for notifying UI update
+ Intent uiUpdate = new Intent(FileDownloader.getDownloadFinishMessage());
+ uiUpdate.putExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, result);
+ uiUpdate.putExtra(FileDownloader.ACCOUNT_NAME, mAccount.name);
+ uiUpdate.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mRemotePath);
+ uiUpdate.putExtra(FileDownloader.EXTRA_FILE_PATH, mLocalFolder.getRemotePath());
+ mContext.sendStickyBroadcast(uiUpdate);
+ }
+
/**
* Cancel operation
*/
public void cancel() {
mCancellationRequested.set(true);
+
+ synchronized(mFoldersToWalkDown) {
+ // cancel 'child' synchronizations
+ for (SyncOperation synchOp : mFoldersToWalkDown) {
+ ((SynchronizeFolderOperation) synchOp).cancel();
+ }
+ }
+ }
+
+ public String getFolderPath() {
+ String path = mLocalFolder.getStoragePath();
+ if (path != null && path.length() > 0) {
+ return path;
+ }
+ return FileStorageUtils.getDefaultSavePathFor(mAccount.name, mLocalFolder);
}
}