X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/14bbe5bf01b8983de8011f217356b40d912bd4a1..01fc29c892bf5d1cb7dc1f8094d91a1a6a96a6bf:/src/com/owncloud/android/operations/SynchronizeFolderOperation.java diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index 8bdc55e0..06760e85 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -34,6 +34,7 @@ import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation; import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation; import com.owncloud.android.lib.resources.files.RemoteFile; import com.owncloud.android.operations.common.SyncOperation; +import com.owncloud.android.services.OperationsService; import com.owncloud.android.utils.FileStorageUtils; import java.io.File; @@ -98,8 +99,6 @@ public class SynchronizeFolderOperation extends SyncOperation { private List mFavouriteFilesToSyncContents; // this will be used for every file when 'folder synchronization' replaces 'folder download' - private List mFoldersToWalkDown; - private final AtomicBoolean mCancellationRequested; /** @@ -119,7 +118,6 @@ public class SynchronizeFolderOperation extends SyncOperation { mFilesForDirectDownload = new Vector(); mFilesToSyncContentsWithoutUpload = new Vector(); mFavouriteFilesToSyncContents = new Vector(); - mFoldersToWalkDown = new Vector(); mCancellationRequested = new AtomicBoolean(false); } @@ -161,9 +159,6 @@ public class SynchronizeFolderOperation extends SyncOperation { syncContents(client); } - if (mFilesForDirectDownload.isEmpty()) { - sendBroadcastForNotifyingUIUpdate(result.isSuccess()); - } } if (mCancellationRequested.get()) { @@ -172,19 +167,6 @@ public class SynchronizeFolderOperation extends SyncOperation { } catch (OperationCancelledException e) { result = new RemoteOperationResult(e); - - // cancel 'child' synchronizations - for (SyncOperation synchOp: mFoldersToWalkDown) { - ((SynchronizeFolderOperation) synchOp).cancel(); - } - - /// 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; @@ -229,7 +211,6 @@ public class SynchronizeFolderOperation extends SyncOperation { result.getLogMessage()); } - sendBroadcastForNotifyingUIUpdate(result.isSuccess()); } return result; @@ -288,7 +269,8 @@ public class SynchronizeFolderOperation extends SyncOperation { * retrieved. * @return 'True' when any change was made in the local data, 'false' otherwise */ - private void synchronizeData(ArrayList folderAndFiles, OwnCloudClient client) { + private void synchronizeData(ArrayList folderAndFiles, OwnCloudClient client) + throws OperationCancelledException { FileDataStorageManager storageManager = getStorageManager(); // parse data from remote folder @@ -303,7 +285,10 @@ public class SynchronizeFolderOperation extends SyncOperation { mFilesForDirectDownload.clear(); mFilesToSyncContentsWithoutUpload.clear(); mFavouriteFilesToSyncContents.clear(); - mFoldersToWalkDown.clear(); + + if (mCancellationRequested.get()) { + throw new OperationCancelledException(); + } // get current data about local contents of the folder to synchronize List localFiles = storageManager.getFolderContent(mLocalFolder); @@ -359,14 +344,13 @@ public class SynchronizeFolderOperation extends SyncOperation { /// classify file to sync/download contents later if (remoteFile.isFolder()) { /// to download children files recursively - SynchronizeFolderOperation synchFolderOp = new SynchronizeFolderOperation( - mContext, - remoteFile.getRemotePath(), - mAccount, - mCurrentSyncTime - ); - mFoldersToWalkDown.add(synchFolderOp); - + synchronized(mCancellationRequested) { + if (mCancellationRequested.get()) { + throw new OperationCancelledException(); + } + startSyncFolderOperation(remoteFile.getRemotePath()); + } + } else if (remoteFile.keepInSync()) { /// prepare content synchronization for kept-in-sync files SynchronizeFileOperation operation = new SynchronizeFileOperation( @@ -400,20 +384,19 @@ public class SynchronizeFolderOperation extends SyncOperation { } - private void prepareOpsFromLocalKnowledge() { + private void prepareOpsFromLocalKnowledge() throws OperationCancelledException { List children = getStorageManager().getFolderContent(mLocalFolder); for (OCFile child : children) { /// classify file to sync/download contents later if (child.isFolder()) { /// to download children files recursively - SynchronizeFolderOperation synchFolderOp = new SynchronizeFolderOperation( - mContext, - child.getRemotePath(), - mAccount, - mCurrentSyncTime - ); - mFoldersToWalkDown.add(synchFolderOp); - + synchronized(mCancellationRequested) { + if (mCancellationRequested.get()) { + throw new OperationCancelledException(); + } + startSyncFolderOperation(child.getRemotePath()); + } + } else { /// prepare limited synchronization for regular files if (!child.isDown()) { @@ -428,19 +411,20 @@ public class SynchronizeFolderOperation extends SyncOperation { startDirectDownloads(); startContentSynchronizations(mFilesToSyncContentsWithoutUpload, client); startContentSynchronizations(mFavouriteFilesToSyncContents, client); - walkSubfolders(client); // this must be the last! } private void startDirectDownloads() throws OperationCancelledException { for (OCFile file : mFilesForDirectDownload) { - if (mCancellationRequested.get()) { - throw new OperationCancelledException(); + synchronized(mCancellationRequested) { + if (mCancellationRequested.get()) { + throw new OperationCancelledException(); + } + Intent i = new Intent(mContext, FileDownloader.class); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount); + i.putExtra(FileDownloader.EXTRA_FILE, file); + mContext.startService(i); } - Intent i = new Intent(mContext, FileDownloader.class); - i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount); - i.putExtra(FileDownloader.EXTRA_FILE, file); - mContext.startService(i); } } @@ -456,7 +440,8 @@ public class SynchronizeFolderOperation extends SyncOperation { */ private void startContentSynchronizations(List filesToSyncContents, OwnCloudClient client) throws OperationCancelledException { - + + Log_OC.v(TAG, "Starting content synchronization... "); RemoteOperationResult contentsResult = null; for (SyncOperation op: filesToSyncContents) { if (mCancellationRequested.get()) { @@ -481,26 +466,6 @@ public class SynchronizeFolderOperation extends SyncOperation { } } - - private void walkSubfolders(OwnCloudClient client) throws OperationCancelledException { - RemoteOperationResult contentsResult = null; - for (SyncOperation op: mFoldersToWalkDown) { - if (mCancellationRequested.get()) { - throw new OperationCancelledException(); - } - contentsResult = op.execute(client, getStorageManager()); // to watch out: possibly deep recursion - if (!contentsResult.isSuccess()) { - // TODO - some kind of error count, and use it with notifications - if (contentsResult.getException() != null) { - Log_OC.e(TAG, "Non blocking exception : " - + contentsResult.getLogMessage(), contentsResult.getException()); - } else { - Log_OC.e(TAG, "Non blocking error : " + contentsResult.getLogMessage()); - } - } // won't let these fails break the synchronization process - } - } - /** * Creates and populates a new {@link com.owncloud.android.datamodel.OCFile} object with the data read from the server. @@ -538,16 +503,6 @@ public class SynchronizeFolderOperation extends SyncOperation { } } - 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 @@ -555,4 +510,24 @@ public class SynchronizeFolderOperation extends SyncOperation { public void cancel() { mCancellationRequested.set(true); } + + public String getFolderPath() { + String path = mLocalFolder.getStoragePath(); + if (path != null && path.length() > 0) { + return path; + } + return FileStorageUtils.getDefaultSavePathFor(mAccount.name, mLocalFolder); + } + + private void startSyncFolderOperation(String path){ + Intent intent = new Intent(mContext, OperationsService.class); + intent.setAction(OperationsService.ACTION_SYNC_FOLDER); + intent.putExtra(OperationsService.EXTRA_ACCOUNT, mAccount); + intent.putExtra(OperationsService.EXTRA_REMOTE_PATH, path); + mContext.startService(intent); + } + + public String getRemotePath() { + return mRemotePath; + } }