Fixed cancellation of SynchronizeOperationFolder
authorDavid A. Velasco <dvelasco@solidgear.es>
Mon, 26 Jan 2015 12:32:54 +0000 (13:32 +0100)
committerDavid A. Velasco <dvelasco@solidgear.es>
Mon, 26 Jan 2015 12:32:54 +0000 (13:32 +0100)
src/com/owncloud/android/files/services/FileDownloader.java
src/com/owncloud/android/operations/SynchronizeFolderOperation.java
src/com/owncloud/android/services/OperationsService.java
src/com/owncloud/android/services/SyncFolderHandler.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

index 06ebc0b..70292af 100644 (file)
@@ -135,6 +135,11 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
             final Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
             final OCFile file = intent.getParcelableExtra(EXTRA_FILE);
 
             final Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
             final OCFile file = intent.getParcelableExtra(EXTRA_FILE);
 
+            Log_OC.v(
+                    "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                    "Received request to download file"
+            );
+
             /*
             if (ACTION_CANCEL_FILE_DOWNLOAD.equals(intent.getAction())) {
 
             /*
             if (ACTION_CANCEL_FILE_DOWNLOAD.equals(intent.getAction())) {
 
@@ -158,6 +163,10 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
                     );
                     String downloadKey = putResult.first;
                     requestedDownloads.add(downloadKey);
                     );
                     String downloadKey = putResult.first;
                     requestedDownloads.add(downloadKey);
+                    Log_OC.v(
+                        "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Download on " + file.getRemotePath() + " added to queue"
+                    );
 
                     // Store file on db with state 'downloading'
                     /*
 
                     // Store file on db with state 'downloading'
                     /*
@@ -231,14 +240,24 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
          * @param file          A file in the queue of pending downloads
          */
         public void cancel(Account account, OCFile file) {
          * @param file          A file in the queue of pending downloads
          */
         public void cancel(Account account, OCFile file) {
+            Log_OC.v(
+                    "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                    "Received request to cancel download of " + file.getRemotePath()
+            );
+            Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                    "Removing download of " + file.getRemotePath());
             Pair<DownloadFileOperation, String> removeResult = mPendingDownloads.remove(account, file.getRemotePath());
             DownloadFileOperation download = removeResult.first;
             if (download != null) {
             Pair<DownloadFileOperation, String> removeResult = mPendingDownloads.remove(account, file.getRemotePath());
             DownloadFileOperation download = removeResult.first;
             if (download != null) {
+                Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Canceling returned download of " + file.getRemotePath());
                 download.cancel();
             } else {
                 if (mCurrentDownload != null && mCurrentAccount != null &&
                         mCurrentDownload.getRemotePath().startsWith(file.getRemotePath()) &&
                         account.name.equals(mCurrentAccount.name)) {
                 download.cancel();
             } else {
                 if (mCurrentDownload != null && mCurrentAccount != null &&
                         mCurrentDownload.getRemotePath().startsWith(file.getRemotePath()) &&
                         account.name.equals(mCurrentAccount.name)) {
+                    Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                            "Canceling current sync as descendant: " + mCurrentDownload.getRemotePath());
                     mCurrentDownload.cancel();
                 }
             }
                     mCurrentDownload.cancel();
                 }
             }
@@ -335,7 +354,10 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
             if (msg.obj != null) {
                 Iterator<String> it = requestedDownloads.iterator();
                 while (it.hasNext()) {
             if (msg.obj != null) {
                 Iterator<String> it = requestedDownloads.iterator();
                 while (it.hasNext()) {
-                    mService.downloadFile(it.next());
+                    String next = it.next();
+                    Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                            "Handling download file " + next);
+                    mService.downloadFile(next);
                 }
             }
             mService.stopSelf(msg.arg1);
                 }
             }
             mService.stopSelf(msg.arg1);
@@ -350,6 +372,8 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
      */
     private void downloadFile(String downloadKey) {
 
      */
     private void downloadFile(String downloadKey) {
 
+        Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                "Getting download of " + downloadKey);
         mCurrentDownload = mPendingDownloads.get(downloadKey);
 
         if (mCurrentDownload != null) {
         mCurrentDownload = mPendingDownloads.get(downloadKey);
 
         if (mCurrentDownload != null) {
@@ -369,6 +393,8 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
                 }
 
                 /// perform the download
                 }
 
                 /// perform the download
+                Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Executing download of " + mCurrentDownload.getRemotePath());
                 downloadResult = mCurrentDownload.execute(mDownloadClient);
                 if (downloadResult.isSuccess()) {
                     saveDownloadedFile();
                 downloadResult = mCurrentDownload.execute(mDownloadClient);
                 if (downloadResult.isSuccess()) {
                     saveDownloadedFile();
@@ -385,6 +411,9 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
                 downloadResult = new RemoteOperationResult(e);
                 
             } finally {
                 downloadResult = new RemoteOperationResult(e);
                 
             } finally {
+                Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Removing payload " + mCurrentDownload.getRemotePath());
+
                 Pair<DownloadFileOperation, String> removeResult =
                         mPendingDownloads.removePayload(mCurrentAccount, mCurrentDownload.getRemotePath());
 
                 Pair<DownloadFileOperation, String> removeResult =
                         mPendingDownloads.removePayload(mCurrentAccount, mCurrentDownload.getRemotePath());
 
@@ -594,50 +623,4 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
         sendStickyBroadcast(added);
     }
 
         sendStickyBroadcast(added);
     }
 
-    /**
-     * Cancel operation
-     * @param account       ownCloud account where the remote file is stored.
-     * @param file          File OCFile
-     *-/
-    public void cancel(Account account, OCFile file){
-        DownloadFileOperation download = null;
-        //String targetKey = buildKey(account, file.getRemotePath());
-        ArrayList<String> keyItems = new ArrayList<String>();
-        if (file.isFolder()) {
-            Log_OC.d(TAG, "Folder download. Canceling pending downloads (from folder)");
-
-            // TODO
-            /*
-            Iterator<String> it = mPendingDownloads.keySet().iterator();
-            boolean found = false;
-            while (it.hasNext()) {
-                String keyDownloadOperation = it.next();
-                found = keyDownloadOperation.startsWith(targetKey);
-                if (found) {
-                    keyItems.add(keyDownloadOperation);
-                }
-            }
-
-            for (String item: keyItems) {
-                download = mPendingDownloads.remove(item);
-                Log_OC.d(TAG, "Key removed: " + item);
-
-                if (download != null) {
-                    download.cancel();
-                }
-            }
-
-            *-/
-
-        } else {
-            // this is not really expected...
-            Log_OC.d(TAG, "Canceling file download");
-            download = mPendingDownloads.remove(account, file.getRemotePath());
-            if (download != null) {
-                download.cancel();
-            }
-        }
-    }
-    */
-
 }
 }
index 61375c4..4b5343b 100644 (file)
@@ -344,10 +344,11 @@ public class SynchronizeFolderOperation extends SyncOperation {
             /// classify file to sync/download contents later
             if (remoteFile.isFolder()) {
                 /// to download children files recursively
             /// classify file to sync/download contents later
             if (remoteFile.isFolder()) {
                 /// to download children files recursively
-                startSyncFolderOperation(remoteFile.getRemotePath());
-
-                if (mCancellationRequested.get()) {
-                    throw new OperationCancelledException();
+                synchronized(mCancellationRequested) {
+                    if (mCancellationRequested.get()) {
+                        throw new OperationCancelledException();
+                    }
+                    startSyncFolderOperation(remoteFile.getRemotePath());
                 }
 
             } else if (remoteFile.keepInSync()) {
                 }
 
             } else if (remoteFile.keepInSync()) {
@@ -389,9 +390,11 @@ public class SynchronizeFolderOperation extends SyncOperation {
             /// classify file to sync/download contents later
             if (child.isFolder()) {
                 /// to download children files recursively
             /// classify file to sync/download contents later
             if (child.isFolder()) {
                 /// to download children files recursively
-                startSyncFolderOperation(child.getRemotePath());
-                if (mCancellationRequested.get()) {
-                    throw new OperationCancelledException();
+                synchronized(mCancellationRequested) {
+                    if (mCancellationRequested.get()) {
+                        throw new OperationCancelledException();
+                    }
+                    startSyncFolderOperation(child.getRemotePath());
                 }
 
             } else {
                 }
 
             } else {
@@ -413,13 +416,15 @@ public class SynchronizeFolderOperation extends SyncOperation {
     
     private void startDirectDownloads() throws OperationCancelledException {
         for (OCFile file : mFilesForDirectDownload) {
     
     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);
         }
     }
 
         }
     }
 
@@ -520,4 +525,8 @@ public class SynchronizeFolderOperation extends SyncOperation {
         intent.putExtra(OperationsService.EXTRA_REMOTE_PATH, path);
         mContext.startService(intent);
     }
         intent.putExtra(OperationsService.EXTRA_REMOTE_PATH, path);
         mContext.startService(intent);
     }
+
+    public String getRemotePath() {
+        return mRemotePath;
+    }
 }
 }
index a47385b..f654310 100644 (file)
@@ -169,6 +169,8 @@ public class OperationsService extends Service {
         // the rest of the operations are requested through the Binder
         if (ACTION_SYNC_FOLDER.equals(intent.getAction())) {
 
         // the rest of the operations are requested through the Binder
         if (ACTION_SYNC_FOLDER.equals(intent.getAction())) {
 
+            Log_OC.v("NOW " + TAG + ", thread " + Thread.currentThread().getName(), "Received request to sync folder");
+
             if (!intent.hasExtra(EXTRA_ACCOUNT) || !intent.hasExtra(EXTRA_REMOTE_PATH)) {
                 Log_OC.e(TAG, "Not enough information provided in intent");
                 return START_NOT_STICKY;
             if (!intent.hasExtra(EXTRA_ACCOUNT) || !intent.hasExtra(EXTRA_REMOTE_PATH)) {
                 Log_OC.e(TAG, "Not enough information provided in intent");
                 return START_NOT_STICKY;
@@ -184,6 +186,10 @@ public class OperationsService extends Service {
                 Message msg = mSyncFolderHandler.obtainMessage();
                 msg.arg1 = startId;
                 msg.obj = itemSyncKey;
                 Message msg = mSyncFolderHandler.obtainMessage();
                 msg.arg1 = startId;
                 msg.obj = itemSyncKey;
+                Log_OC.v(
+                        "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Sync folder " + remotePath + " added to queue"
+                );
                 mSyncFolderHandler.sendMessage(msg);
             }
 
                 mSyncFolderHandler.sendMessage(msg);
             }
 
@@ -215,7 +221,7 @@ public class OperationsService extends Service {
             e.printStackTrace();
         }
         
             e.printStackTrace();
         }
         
-        //Log_OC.wtf(TAG, "Clear mUndispatchedFinisiedOperations" );
+        //Log_OC.wtf(TAG, "Clear mUndispatchedFinishedOperations" );
         mUndispatchedFinishedOperations.clear();
         
         //Log_OC.wtf(TAG, "onDestroy end" );
         mUndispatchedFinishedOperations.clear();
         
         //Log_OC.wtf(TAG, "onDestroy end" );
@@ -270,6 +276,10 @@ public class OperationsService extends Service {
          * @param file          A folder in the queue of pending synchronizations
          */
         public void cancel(Account account, OCFile file) {
          * @param file          A folder in the queue of pending synchronizations
          */
         public void cancel(Account account, OCFile file) {
+            Log_OC.v(
+                    "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                    "Received request to cancel folder " + file.getRemotePath()
+            );
             mSyncFolderHandler.cancel(account, file);
         }
 
             mSyncFolderHandler.cancel(account, file);
         }
 
index b0116b3..319a158 100644 (file)
@@ -86,6 +86,8 @@ class SyncFolderHandler extends Handler {
     @Override
     public void handleMessage(Message msg) {
         Pair<Account, String> itemSyncKey = (Pair<Account, String>) msg.obj;
     @Override
     public void handleMessage(Message msg) {
         Pair<Account, String> itemSyncKey = (Pair<Account, String>) msg.obj;
+        Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                    "Handling sync folder " + itemSyncKey.second);
         doOperation(itemSyncKey.first, itemSyncKey.second);
         mService.stopSelf(msg.arg1);
     }
         doOperation(itemSyncKey.first, itemSyncKey.second);
         mService.stopSelf(msg.arg1);
     }
@@ -96,6 +98,8 @@ class SyncFolderHandler extends Handler {
      */
     private void doOperation(Account account, String remotePath) {
 
      */
     private void doOperation(Account account, String remotePath) {
 
+        Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                "Getting sync folder " + remotePath);
         mCurrentSyncOperation = mPendingOperations.get(account, remotePath);
 
         if (mCurrentSyncOperation != null) {
         mCurrentSyncOperation = mPendingOperations.get(account, remotePath);
 
         if (mCurrentSyncOperation != null) {
@@ -115,13 +119,18 @@ class SyncFolderHandler extends Handler {
 
                 }   // else, reuse client from previous operation
 
 
                 }   // else, reuse client from previous operation
 
+                Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Executing sync folder " + remotePath);
                 result = mCurrentSyncOperation.execute(mOwnCloudClient, mStorageManager);
 
             } catch (AccountsException e) {
                 result = mCurrentSyncOperation.execute(mOwnCloudClient, mStorageManager);
 
             } catch (AccountsException e) {
-                Log_OC.e(TAG, "Error while trying to get autorization", e);
+                Log_OC.e(TAG, "Error while trying to get authorization", e);
             } catch (IOException e) {
             } catch (IOException e) {
-                Log_OC.e(TAG, "Error while trying to get autorization", e);
+                Log_OC.e(TAG, "Error while trying to get authorization", e);
             } finally {
             } finally {
+                Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Removing payload " + remotePath);
+
                 mPendingOperations.removePayload(account, remotePath);
 
                 mService.dispatchResultToOperationListeners(null, mCurrentSyncOperation, result);
                 mPendingOperations.removePayload(account, remotePath);
 
                 mService.dispatchResultToOperationListeners(null, mCurrentSyncOperation, result);
@@ -148,17 +157,26 @@ class SyncFolderHandler extends Handler {
             Log_OC.e(TAG, "Cannot cancel with NULL parameters");
             return;
         }
             Log_OC.e(TAG, "Cannot cancel with NULL parameters");
             return;
         }
+        Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                "Removing sync folder " + file.getRemotePath());
         Pair<SynchronizeFolderOperation, String> removeResult =
                 mPendingOperations.remove(account, file.getRemotePath());
         SynchronizeFolderOperation synchronization = removeResult.first;
         if (synchronization != null) {
         Pair<SynchronizeFolderOperation, String> removeResult =
                 mPendingOperations.remove(account, file.getRemotePath());
         SynchronizeFolderOperation synchronization = removeResult.first;
         if (synchronization != null) {
+            Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                    "Canceling returned sync of " + file.getRemotePath());
             synchronization.cancel();
         } else {
             synchronization.cancel();
         } else {
-            // TODO synchronize
+            // TODO synchronize?
             if (mCurrentSyncOperation != null && mCurrentAccount != null &&
             if (mCurrentSyncOperation != null && mCurrentAccount != null &&
-                    mCurrentSyncOperation.getFolderPath().startsWith(file.getRemotePath()) &&
+                    mCurrentSyncOperation.getRemotePath().startsWith(file.getRemotePath()) &&
                     account.name.equals(mCurrentAccount.name)) {
                     account.name.equals(mCurrentAccount.name)) {
+                Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Canceling current sync as descendant: " + mCurrentSyncOperation.getRemotePath());
                 mCurrentSyncOperation.cancel();
                 mCurrentSyncOperation.cancel();
+            } else {
+                Log_OC.v(   "NOW " + TAG + ", thread " + Thread.currentThread().getName(),
+                        "Nothing else in cancelation of " + file.getRemotePath());
             }
         }
 
             }
         }
 
index d980553..7e60776 100644 (file)
@@ -1262,7 +1262,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener {
      */
     private class DownloadFinishReceiver extends BroadcastReceiver {
 
      */
     private class DownloadFinishReceiver extends BroadcastReceiver {
 
-        int refreshCounter = 0;
+        //int refreshCounter = 0;
         @Override
         public void onReceive(Context context, Intent intent) {
             try {
         @Override
         public void onReceive(Context context, Intent intent) {
             try {
@@ -1273,7 +1273,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener {
                 if (sameAccount && isDescendant) {
                     String linkedToRemotePath = intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
                     if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
                 if (sameAccount && isDescendant) {
                     String linkedToRemotePath = intent.getStringExtra(FileDownloader.EXTRA_LINKED_TO_PATH);
                     if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
-                        Log_OC.v(TAG, "NOW: refresh #" + ++refreshCounter);
+                        //Log_OC.v(TAG, "refresh #" + ++refreshCounter);
                         refreshListOfFilesFragment();
                     }
                     refreshSecondFragment(
                         refreshListOfFilesFragment();
                     }
                     refreshSecondFragment(