X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/6fee98e6a4dc85b836f185cecf2b41637469e453..d8ac7b2241bc99df58b5f4be4c3c4d83fc9efaf6:/src/com/owncloud/android/services/OperationsService.java diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index c6651f55..779e5b6a 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/src/com/owncloud/android/services/OperationsService.java @@ -183,7 +183,7 @@ public class OperationsService extends Service { Pair 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; @@ -194,11 +194,16 @@ public class OperationsService extends Service { 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; @@ -208,19 +213,6 @@ public class OperationsService extends Service { 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" ); @@ -387,9 +379,11 @@ public class OperationsService extends Service { * @param account ownCloud account where the remote file is stored. * @param file A file that could be affected */ + /* public boolean isSynchronizing(Account account, String remotePath) { return mSyncFolderHandler.isSynchronizing(account, remotePath); } + */ } @@ -425,7 +419,13 @@ public class OperationsService extends Service { 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 it = mPendingOperations.keySet().iterator(); + boolean found = false; + while (it.hasNext() && !found) { + found = it.next().startsWith(targetKey); + } + return found; } } @@ -474,6 +474,8 @@ public class OperationsService extends Service { } mService.dispatchResultToOperationListeners(null, mCurrentSyncOperation, result); + + sendBroadcastFinishedSyncFolder(account, remotePath, result.isSuccess()); } } } @@ -499,26 +501,27 @@ public class OperationsService extends Service { boolean found = false; while (it.hasNext()) { String keySyncOperation = it.next(); - found = keySyncOperation.contains(targetKey); + found = keySyncOperation.startsWith(targetKey); if (found) { keyItems.add(keySyncOperation); } } + } else { // this is not really expected... Log_OC.d(TAG, "Canceling sync operation"); keyItems.add(buildRemoteName(account, file.getRemotePath())); } - } - for (String item: keyItems) { - syncOperation = mPendingOperations.remove(item); - Log_OC.d(TAG, "Key sync operations removed: " + item); - - if (syncOperation != null) { - syncOperation.cancel(); + 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); @@ -537,6 +540,34 @@ public class OperationsService extends Service { 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); + } + + }