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;
private List<SyncOperation> mFavouriteFilesToSyncContents;
// this will be used for every file when 'folder synchronization' replaces 'folder download'
- private List<SyncOperation> mFoldersToWalkDown;
-
private final AtomicBoolean mCancellationRequested;
/**
mFilesForDirectDownload = new Vector<OCFile>();
mFilesToSyncContentsWithoutUpload = new Vector<SyncOperation>();
mFavouriteFilesToSyncContents = new Vector<SyncOperation>();
- mFoldersToWalkDown = new Vector<SyncOperation>();
mCancellationRequested = new AtomicBoolean(false);
}
syncContents(client);
}
- if (mFilesForDirectDownload.isEmpty()) {
- sendBroadcastForNotifyingUIUpdate(result.isSuccess());
- }
}
if (mCancellationRequested.get()) {
} 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;
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();
+
+ if (mCancellationRequested.get()) {
+ throw new OperationCancelledException();
+ }
// get current data about local contents of the folder to synchronize
List<OCFile> localFiles = storageManager.getFolderContent(mLocalFolder);
/// 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(
}
- 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
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()) {
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);
}
}
*/
private void startContentSynchronizations(List<SyncOperation> filesToSyncContents, OwnCloudClient client)
throws OperationCancelledException {
-
+
+ Log_OC.v(TAG, "Starting content synchronization... ");
RemoteOperationResult contentsResult = null;
for (SyncOperation op: filesToSyncContents) {
if (mCancellationRequested.get()) {
}
}
-
- 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.
}
}
- 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);
}
+
+ 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;
+ }
}