syncContents(client);
}
- if (mFilesForDirectDownload.isEmpty()) {
- sendBroadcastForNotifyingUIUpdate(result.isSuccess());
- }
}
if (mCancellationRequested.get()) {
} 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(false);
-
- 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;
}
}
- 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
package com.owncloud.android.services;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
Pair<Target, RemoteOperation> itemToQueue = newOperation(intent);
if (itemToQueue != null) {
mSyncFolderHandler.add(account, remotePath, (SynchronizeFolderOperation)itemToQueue.second);
- sendBroadcastNewSyncFolder(account, remotePath);
+ mSyncFolderHandler.sendBroadcastNewSyncFolder(account, remotePath);
Message msg = mSyncFolderHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = itemSyncKey;
Log_OC.e(TAG, "Not enough information provided in intent");
return START_NOT_STICKY;
}
- Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
- OCFile file = intent.getParcelableExtra(EXTRA_FILE);
-
+ final Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
+ final OCFile file = intent.getParcelableExtra(EXTRA_FILE);
// Cancel operation
- mSyncFolderHandler.cancel(account,file);
+ new Thread(new Runnable() {
+ public void run() {
+ // Cancel the download
+ mSyncFolderHandler.cancel(account,file);
+ }
+ }).start();
+
} else {
Message msg = mOperationsHandler.obtainMessage();
msg.arg1 = startId;
return START_NOT_STICKY;
}
- /**
- * TODO remove this method when "folder synchronization" replaces "folder download"; this is a fast and ugly
- * patch.
- */
- private void sendBroadcastNewSyncFolder(Account account, String remotePath) {
- Intent added = new Intent(FileDownloader.getDownloadAddedMessage());
- added.putExtra(FileDownloader.ACCOUNT_NAME, account.name);
- added.putExtra(FileDownloader.EXTRA_REMOTE_PATH, remotePath);
- added.putExtra(FileDownloader.EXTRA_FILE_PATH, FileStorageUtils.getSavePath(account.name) + remotePath);
- sendStickyBroadcast(added);
- }
-
-
@Override
public void onDestroy() {
//Log_OC.wtf(TAG, "onDestroy init" );
if (account == null || remotePath == null) return false;
String targetKey = buildRemoteName(account, remotePath);
synchronized (mPendingOperations) {
- return (mPendingOperations.containsKey(targetKey));
+ // TODO - this can be slow when synchronizing a big tree - need a better data structure
+ Iterator<String> it = mPendingOperations.keySet().iterator();
+ boolean found = false;
+ while (it.hasNext() && !found) {
+ found = it.next().startsWith(targetKey);
+ }
+ return found;
}
}
}
mService.dispatchResultToOperationListeners(null, mCurrentSyncOperation, result);
+
+ sendBroadcastFinishedSyncFolder(account, remotePath, result.isSuccess());
}
}
}
public void cancel(Account account, OCFile file){
SynchronizeFolderOperation syncOperation = null;
String targetKey = buildRemoteName(account, file.getRemotePath());
+ ArrayList<String> keyItems = new ArrayList<String>();
synchronized (mPendingOperations) {
if (file.isFolder()) {
Log_OC.d(TAG, "Canceling pending sync operations");
String keySyncOperation = it.next();
found = keySyncOperation.startsWith(targetKey);
if (found) {
- syncOperation = mPendingOperations.get(keySyncOperation);
- if (syncOperation != null) {
- syncOperation.cancel();
- // Leave the ops in the hash; the cancellation is "passive"
- // TODO review full life-cicle of operations when folder download is replaced with
- // folder synchronization
- }
+ keyItems.add(keySyncOperation);
}
}
+
} else {
// this is not really expected...
Log_OC.d(TAG, "Canceling sync operation");
- syncOperation = mPendingOperations.get(buildRemoteName(account, file.getRemotePath()));
+ keyItems.add(buildRemoteName(account, file.getRemotePath()));
+ }
+ for (String item: keyItems) {
+ syncOperation = mPendingOperations.remove(item);
if (syncOperation != null) {
syncOperation.cancel();
}
}
}
+ //sendBroadcastFinishedSyncFolder(account, file.getRemotePath());
+
/// 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(mService, FileDownloader.class);
private String buildRemoteName(Account account, String path) {
return account.name + path;
}
+
+
+ /**
+ * TODO review this method when "folder synchronization" replaces "folder download"; this is a fast and ugly
+ * patch.
+ */
+ private void sendBroadcastNewSyncFolder(Account account, String remotePath) {
+ Intent added = new Intent(FileDownloader.getDownloadAddedMessage());
+ added.putExtra(FileDownloader.ACCOUNT_NAME, account.name);
+ added.putExtra(FileDownloader.EXTRA_REMOTE_PATH, remotePath);
+ added.putExtra(FileDownloader.EXTRA_FILE_PATH, FileStorageUtils.getSavePath(account.name) + remotePath);
+ mService.sendStickyBroadcast(added);
+ }
+
+ /**
+ * TODO review this method when "folder synchronization" replaces "folder download"; this is a fast and ugly
+ * patch.
+ */
+ private void sendBroadcastFinishedSyncFolder(Account account, String remotePath, boolean success) {
+ Intent finished = new Intent(FileDownloader.getDownloadFinishMessage());
+ finished.putExtra(FileDownloader.ACCOUNT_NAME, account.name);
+ finished.putExtra(FileDownloader.EXTRA_REMOTE_PATH, remotePath);
+ finished.putExtra(FileDownloader.EXTRA_FILE_PATH, FileStorageUtils.getSavePath(account.name) + remotePath);
+ finished.putExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, success);
+ mService.sendStickyBroadcast(finished);
+ }
+
+
}