Merge branch 'download_folder' into download_folder_cancel_downloads
authorjabarros <jabarros@solidgear.es>
Tue, 16 Dec 2014 14:04:39 +0000 (15:04 +0100)
committerjabarros <jabarros@solidgear.es>
Tue, 16 Dec 2014 14:04:39 +0000 (15:04 +0100)
1  2 
src/com/owncloud/android/services/OperationsService.java

@@@ -26,7 -26,6 +26,7 @@@ import java.util.concurrent.ConcurrentM
  import com.owncloud.android.MainApp;
  import com.owncloud.android.R;
  import com.owncloud.android.datamodel.FileDataStorageManager;
 +import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.files.services.FileDownloader;
  import com.owncloud.android.lib.common.OwnCloudAccount;
  import com.owncloud.android.lib.common.OwnCloudClient;
@@@ -52,6 -51,7 +52,7 @@@ import com.owncloud.android.operations.
  import com.owncloud.android.operations.SynchronizeFileOperation;
  import com.owncloud.android.operations.SynchronizeFolderOperation;
  import com.owncloud.android.operations.UnshareLinkOperation;
+ import com.owncloud.android.utils.FileStorageUtils;
  
  import android.accounts.Account;
  import android.accounts.AccountsException;
@@@ -84,8 -84,7 +85,8 @@@ public class OperationsService extends 
      public static final String EXTRA_SYNC_FILE_CONTENTS = "SYNC_FILE_CONTENTS";
      public static final String EXTRA_RESULT = "RESULT";
      public static final String EXTRA_NEW_PARENT_PATH = "NEW_PARENT_PATH";
 -    
 +    public static final String EXTRA_FILE = "FILE";
 +
      // TODO review if ALL OF THEM are necessary
      public static final String EXTRA_SUCCESS_IF_ABSENT = "SUCCESS_IF_ABSENT";
      public static final String EXTRA_USERNAME = "USERNAME";
              Pair<Target, RemoteOperation> itemToQueue = newOperation(intent);
              if (itemToQueue != null) {
                  mSyncFolderHandler.add(account, remotePath, (SynchronizeFolderOperation)itemToQueue.second);
+                 sendBroadcastNewSyncFolder(account, remotePath);
                  Message msg = mSyncFolderHandler.obtainMessage();
                  msg.arg1 = startId;
                  msg.obj = itemSyncKey;
                  mSyncFolderHandler.sendMessage(msg);
              }
          } else if (ACTION_CANCEL_SYNC_FOLDER.equals(intent.getAction())) {
 -            if (!intent.hasExtra(EXTRA_ACCOUNT) || !intent.hasExtra(EXTRA_REMOTE_PATH)) {
 +            if (!intent.hasExtra(EXTRA_ACCOUNT) || !intent.hasExtra(EXTRA_FILE)) {
                  Log_OC.e(TAG, "Not enough information provided in intent");
                  return START_NOT_STICKY;
              }
              Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
 -            String remotePath = intent.getStringExtra(EXTRA_REMOTE_PATH);
 +            OCFile file = intent.getParcelableExtra(EXTRA_FILE);
  
              // Cancel operation
 -            mSyncFolderHandler.cancel(account,remotePath);
 +            mSyncFolderHandler.cancel(account,file);
          } 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" );
                  //Log_OC.wtf(TAG, "Not finished yet");
              }
          }
+         
+         
+         /**
+          * Returns True when the file described by 'file' in the ownCloud account 'account' is downloading or waiting to download.
+          * 
+          * If 'file' is a directory, returns 'true' if some of its descendant files is downloading or waiting to download. 
+          * 
+          * @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);
+         }
  
      }
  
              mService = service;
          }
  
+         
+         public boolean isSynchronizing(Account account, String remotePath) {
+             if (account == null || remotePath == null) return false;
+             String targetKey = buildRemoteName(account, remotePath);
+             synchronized (mPendingOperations) {
+                 return (mPendingOperations.containsKey(targetKey));
+             }
+         }
+         
          @Override
          public void handleMessage(Message msg) {
              Pair<Account, String> itemSyncKey = (Pair<Account, String>) msg.obj;
           * Cancels a pending or current sync operation.
           *
           * @param account       Owncloud account where the remote file is stored.
 -         * @param remotePath    A remote file path
 +         * @param file          File
           */
 -        public void cancel(Account account, String remotePath) {
 +        public void cancel(Account account, OCFile file) {
              SynchronizeFolderOperation syncOperation = null;
              synchronized (mPendingOperations) {
 -                syncOperation = mPendingOperations.remove(buildRemoteName(account, remotePath));
 +                syncOperation = mPendingOperations.remove(buildRemoteName(account, file.getRemotePath()));
              }
              if (syncOperation != null) {
                  syncOperation.cancel();
              }
 +
 +            Intent intent = new Intent( MainApp.getAppContext(), FileDownloader.class);
 +            intent.setAction(FileDownloader.ACTION_CANCEL_FILE_DOWNLOAD);
 +            intent.putExtra(FileDownloader.EXTRA_ACCOUNT, account);
 +            intent.putExtra(FileDownloader.EXTRA_FILE, file);
 +            MainApp.getAppContext().startService(intent);
 +
          }
  
          /**