OC-1230
authormasensio <masensio@solidgear.es>
Wed, 11 Sep 2013 07:08:21 +0000 (09:08 +0200)
committermasensio <masensio@solidgear.es>
Wed, 11 Sep 2013 07:08:21 +0000 (09:08 +0200)
src/com/owncloud/android/operations/RemoteOperationResult.java
src/com/owncloud/android/operations/SynchronizeFolderOperation.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

index 60cdcb2..6b50f91 100644 (file)
@@ -59,6 +59,7 @@ public class RemoteOperationResult implements Serializable {
         OK,
         OK_SSL,
         OK_NO_SSL,
+        OK_NO_CHANGES_ON_DIR,
         UNHANDLED_HTTP_CODE,
         UNAUTHORIZED,        
         FILE_NOT_FOUND, 
@@ -94,7 +95,7 @@ public class RemoteOperationResult implements Serializable {
 
     public RemoteOperationResult(ResultCode code) {
         mCode = code;
-        mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL);
+        mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || code == ResultCode.OK_NO_SSL || code == ResultCode.OK_NO_CHANGES_ON_DIR);
     }
 
     public RemoteOperationResult(boolean success, int httpCode) {
index aa7adf6..2bf4ee0 100644 (file)
@@ -35,8 +35,6 @@ import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
 
 import android.accounts.Account;
 import android.content.Context;
-import android.os.storage.StorageManager;
-
 import com.owncloud.android.Log_OC;
 import com.owncloud.android.datamodel.DataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
@@ -60,21 +58,11 @@ public class SynchronizeFolderOperation extends RemoteOperation {
     /** Remote folder to synchronize */
     private String mRemotePath;
     
-    public String getRemotePath() {
-        return mRemotePath;
-    }
-
-
     /** Timestamp for the synchronization in progress */
     private long mCurrentSyncTime;
     
     /** Id of the folder to synchronize in the local database */
     private long mParentId;
-    
-    public long getParentId() {
-        return mParentId;
-    }
-
 
     /** Access to the local database */
     private DataStorageManager mStorageManager;
@@ -132,31 +120,39 @@ public class SynchronizeFolderOperation extends RemoteOperation {
         return mChildren;
     }
     
-    
+    public String getRemotePath() {
+        return mRemotePath;
+    }
+
+    public long getParentId() {
+        return mParentId;
+    }
+
     @Override
     protected RemoteOperationResult run(WebdavClient client) {
         RemoteOperationResult result = null;
         mFailsInFavouritesFound = 0;
         mConflictsFound = 0;
         mForgottenLocalFiles.clear();
-        
+        boolean fileChanged = false;
+
         // code before in FileSyncAdapter.fetchData
         PropFindMethod query = null;
         try {
             Log_OC.d(TAG, "Synchronizing " + mAccount.name + ", fetching files in " + mRemotePath);
-            
+
             // remote request 
             query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath));
             int status = client.executeMethod(query);
-            
+
             // check and process response   - /// TODO take into account all the possible status per child-resource
             if (isMultiStatus(status)) { 
                 MultiStatus resp = query.getResponseBodyAsMultiStatus();
-            
+
                 // synchronize properties of the parent folder, if necessary
                 if (mParentId == DataStorageManager.ROOT_PARENT_ID) {
                     WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath());
-                    
+
                     // Properties of server folder
                     OCFile parent = fillOCFile(we);
                     // Properties of local folder
@@ -166,8 +162,8 @@ public class SynchronizeFolderOperation extends RemoteOperation {
                         mParentId = parent.getFileId();
                     }
                 }
-                
-                
+
+
                 // read contents in folder
                 List<String> filesOnServer = new ArrayList<String> (); // Contains the lists of files on server
                 List<OCFile> updatedFiles = new Vector<OCFile>(resp.getResponses().length - 1);
@@ -176,23 +172,23 @@ public class SynchronizeFolderOperation extends RemoteOperation {
                     /// new OCFile instance with the data from the server
                     WebdavEntry we = new WebdavEntry(resp.getResponses()[i], client.getBaseUri().getPath());
                     OCFile file = fillOCFile(we);
-                    
+
                     filesOnServer.add(file.getRemotePath()); // Registry the file in the list
-                    
+
                     /// set data about local state, keeping unchanged former data if existing
                     file.setLastSyncDateForProperties(mCurrentSyncTime);
                     OCFile oldFile = mStorageManager.getFileByPath(file.getRemotePath());
-                   
+
                     // Check if it is needed to synchronize the folder
-                    boolean fileChanged = false;
+                    fileChanged = false;
                     if (oldFile != null) {
                         if (!file.getEtag().equalsIgnoreCase(oldFile.getEtag())) {
-                           fileChanged = true; 
+                            fileChanged = true; 
                         }                        
                     } else
                         fileChanged= true;
 
-                    if (fileChanged){
+                    if (fileChanged){               
                         if (oldFile != null) { 
                             file.setKeepInSync(oldFile.keepInSync());
                             file.setLastSyncDateForData(oldFile.getLastSyncDateForData());
@@ -223,46 +219,49 @@ public class SynchronizeFolderOperation extends RemoteOperation {
                         }
 
                         updatedFiles.add(file);
-                    }
-                }
+                        //}
+                        //}
 
-                // save updated contents in local database; all at once, trying to get a best performance in database update (not a big deal, indeed)
-                mStorageManager.saveFiles(updatedFiles);
-
-                // request for the synchronization of files AFTER saving last properties
-                SynchronizeFileOperation op = null;
-                RemoteOperationResult contentsResult = null;
-                for (int i=0; i < filesToSyncContents.size(); i++) {
-                    op = filesToSyncContents.get(i);
-                    contentsResult = op.execute(client);   // returns without waiting for upload or download finishes
-                    if (!contentsResult.isSuccess()) {
-                        if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
-                            mConflictsFound++;
-                        } else {
-                            mFailsInFavouritesFound++;
-                            if (contentsResult.getException() != null) {
-                                Log_OC.d(TAG, "Error while synchronizing favourites : " +  contentsResult.getLogMessage(), contentsResult.getException());
-                            } else {
-                                Log_OC.d(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage());
-                            }
+                        // save updated contents in local database; all at once, trying to get a best performance in database update (not a big deal, indeed)
+                        mStorageManager.saveFiles(updatedFiles);
+
+                        // request for the synchronization of files AFTER saving last properties
+                        //SynchronizeFileOperation op = null;
+                        RemoteOperationResult contentsResult = null;
+                        for (SynchronizeFileOperation op: filesToSyncContents) {//int i=0; i < filesToSyncContents.size(); i++) {
+                            //op = filesToSyncContents.get(i);
+                            contentsResult = op.execute(client);   // returns without waiting for upload or download finishes
+                            if (!contentsResult.isSuccess()) {
+                                if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
+                                    mConflictsFound++;
+                                } else {
+                                    mFailsInFavouritesFound++;
+                                    if (contentsResult.getException() != null) {
+                                        Log_OC.d(TAG, "Error while synchronizing favourites : " +  contentsResult.getLogMessage(), contentsResult.getException());
+                                    } else {
+                                        Log_OC.d(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage());
+                                    }
+                                }
+                            }   // won't let these fails break the synchronization process
                         }
-                    }   // won't let these fails break the synchronization process
-                }
 
-                    
-                // removal of obsolete files
-                mChildren = mStorageManager.getDirectoryContent(mStorageManager.getFileById(mParentId));
-                OCFile file;
-                String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
-                for (int i=0; i < mChildren.size(); ) {
-                    file = mChildren.get(i);
-                    //if (file.getLastSyncDateForProperties() != mCurrentSyncTime) {
-                    if (!filesOnServer.contains(file.getRemotePath())) {
-                        Log_OC.d(TAG, "removing file: " + file.getFileName());
-                        mStorageManager.removeFile(file, (file.isDown() && file.getStoragePath().startsWith(currentSavePath)));
-                        mChildren.remove(i);
-                    } else {
-                        i++;
+
+                        // removal of obsolete files
+                        mChildren = mStorageManager.getDirectoryContent(mStorageManager.getFileById(mParentId));
+                        //OCFile file;
+                        String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
+                        for (OCFile fileChild: mChildren) {
+                            //file = mChildren.get(i);
+                            //if (file.getLastSyncDateForProperties() != mCurrentSyncTime) {
+                            if (!filesOnServer.contains(fileChild.getRemotePath())) {
+                                Log_OC.d(TAG, "removing file: " + fileChild.getFileName());
+                                mStorageManager.removeFile(fileChild, (fileChild.isDown() && fileChild.getStoragePath().startsWith(currentSavePath)));
+                                mChildren.remove(fileChild); //.remove(i);
+                            }
+                            //                    } else {
+                            //                        i++;
+                            //                    }
+                        }
                     }
                 }
                 
@@ -271,7 +270,10 @@ public class SynchronizeFolderOperation extends RemoteOperation {
             }
             
             // prepare result object
-            if (isMultiStatus(status)) {
+            if (!fileChanged) {
+                result = new RemoteOperationResult(ResultCode.OK_NO_CHANGES_ON_DIR);
+                
+            } else if (isMultiStatus(status)) {
                 if (mConflictsFound > 0  || mFailsInFavouritesFound > 0) { 
                     result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);   // should be different result, but will do the job
                             
@@ -326,7 +328,7 @@ public class SynchronizeFolderOperation extends RemoteOperation {
      * 
      * If the copy fails, the link to the local file is nullified. The account of forgotten files is kept in 
      * {@link #mForgottenLocalFiles}
-     * 
+     *) 
      * @param file      File to check and fix.
      */
     private void checkAndFixForeignStoragePath(OCFile file) {
index 17af92b..26b1df5 100644 (file)
@@ -949,8 +949,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
         
         // Sync Folder
         startSyncFolderOperation(directory.getRemotePath(), directory.getFileId());
-        // Update folder size on DB
-        getStorageManager().calculateFolderSize(directory.getParentId());
+//        // Update folder size on DB
+//        getStorageManager().calculateFolderSize(directory.getParentId());
         
     }
 
@@ -1174,12 +1174,22 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
      * @param result        Result of the synchronization.
      */
     private void onSynchronizeFolderOperationFinish(SynchronizeFolderOperation operation, RemoteOperationResult result) {
+        
+        OCFileListFragment list = getListOfFilesFragment();
+        enableDisableViewGroup(list.getListView(), true);
+        
         setSupportProgressBarIndeterminateVisibility(false);
         if (result.isSuccess()) {
-            DataStorageManager storageManager = getStorageManager();
-            OCFile parentDir = storageManager.getFileByPath(operation.getRemotePath());
-            
-            refreshListOfFilesFragment(parentDir);
+            if (result.getCode() != ResultCode.OK_NO_CHANGES_ON_DIR) {
+                DataStorageManager storageManager = getStorageManager();
+                OCFile parentDir = storageManager.getFileByPath(operation.getRemotePath());
+
+                // Update folder size on DB
+                getStorageManager().calculateFolderSize(parentDir.getFileId());
+
+                // Refrest List
+                refreshListOfFilesFragment(parentDir);
+            }
         } else {
             try {
                 Toast msg = Toast.makeText(FileDisplayActivity.this, R.string.sync_file_fail_msg, Toast.LENGTH_LONG); 
@@ -1387,7 +1397,10 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
     
     public void startSyncFolderOperation(String remotePath, long parentId) {
         long currentSyncTime = System.currentTimeMillis(); 
-        setSupportProgressBarIndeterminateVisibility(true);
+        
+        OCFileListFragment list = getListOfFilesFragment();
+        enableDisableViewGroup(list.getListView(), false);
+        
        // perform folder synchronization
         RemoteOperation synchFolderOp = new SynchronizeFolderOperation(  remotePath, 
                                                                                     currentSyncTime, 
@@ -1398,6 +1411,19 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
                                                                                   );
         synchFolderOp.execute(getAccount(), this, this, mHandler, this);
         
+        setSupportProgressBarIndeterminateVisibility(true);
     }
 
+    
+    public void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {
+        int childCount = viewGroup.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+          View view = viewGroup.getChildAt(i);
+          view.setEnabled(enabled);
+          view.setClickable(!enabled);
+          if (view instanceof ViewGroup) {
+            enableDisableViewGroup((ViewGroup) view, enabled);
+          }
+        }
+      }
 }
index d79c5d1..45c9abd 100644 (file)
@@ -136,8 +136,8 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName
                 parentDir = storageManager.getFileById(mFile.getParentId());
             }
             
-            // Update folder size on DB
-            storageManager.calculateFolderSize(mFile.getFileId());
+//            // Update folder size on DB
+//            storageManager.calculateFolderSize(mFile.getFileId());
             
             mFile = parentDir;           
         }