Эх сурвалжийг харах

Moved recursive fetch to notify end-of-syncrhonization of a folder BEFORE its children are synchronized

David A. Velasco 12 жил өмнө
parent
commit
d6ccd4c960

+ 36 - 27
src/com/owncloud/android/syncadapter/FileSyncAdapter.java

@@ -184,6 +184,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
 
     private void fetchData(String uri, SyncResult syncResult, long parentId) {
         PropFindMethod query = null;
+        Vector<OCFile> children = null;
         try {
             Log.d(TAG, "fetching " + uri);
             
@@ -213,9 +214,6 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
                         Intent intent = new Intent(this.getContext(), FileDownloader.class);
                         intent.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount());
                         intent.putExtra(FileDownloader.EXTRA_FILE, file);
-                        /*intent.putExtra(FileDownloader.EXTRA_FILE_PATH, file.getRemotePath());
-                        intent.putExtra(FileDownloader.EXTRA_REMOTE_PATH, file.getRemotePath());
-                        intent.putExtra(FileDownloader.EXTRA_FILE_SIZE, file.getFileLength());*/
                         file.setKeepInSync(true);
                         getContext().startService(intent);
                     }
@@ -224,8 +222,6 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
                 
                     // Log.v(TAG, "adding file: " + file);
                     updatedFiles.add(file);
-                    if (parentId == 0)
-                        parentId = file.getFileId();
                 }
                 /*  Commented code for ugly performance tests
                 long saveDelay = System.currentTimeMillis();
@@ -237,39 +233,21 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
                  */
             
                 // removal of obsolete files
-                Vector<OCFile> files = getStorageManager().getDirectoryContent(
+                 children = getStorageManager().getDirectoryContent(
                         getStorageManager().getFileById(parentId));
                 OCFile file;
                 String currentSavePath = FileDownloader.getSavePath(getAccount().name);
-                for (int i=0; i < files.size(); ) {
-                    file = files.get(i);
+                for (int i=0; i < children.size(); ) {
+                    file = children.get(i);
                     if (file.getLastSyncDate() != mCurrentSyncTime) {
                         Log.v(TAG, "removing file: " + file);
                         getStorageManager().removeFile(file, (file.isDown() && file.getStoragePath().startsWith(currentSavePath)));
-                        files.remove(i);
+                        children.remove(i);
                     } else {
                         i++;
                     }
                 }
             
-                // recursive fetch
-                for (int i=0; i < files.size() && !mCancellation; i++) {
-                    OCFile newFile = files.get(i);
-                    if (newFile.getMimetype().equals("DIR")) {
-                        fetchData(getUri().toString() + WebdavUtils.encodePath(newFile.getRemotePath()), syncResult, newFile.getFileId());
-                    }
-                }
-                if (mCancellation) Log.d(TAG, "Leaving " + uri + " because cancelation request");
-                
-                /*  Commented code for ugly performance tests
-                mResponseDelays[mDelaysIndex] = responseDelay;
-                mSaveDelays[mDelaysIndex] = saveDelay;
-                mDelaysCount++;
-                mDelaysIndex++;
-                if (mDelaysIndex >= MAX_DELAYS)
-                    mDelaysIndex = 0;
-                 */
-
             } else {
                 syncResult.stats.numAuthExceptions++;
             }
@@ -293,8 +271,39 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
             // synchronized folder -> notice to UI
             sendStickyBroadcast(true, getStorageManager().getFileById(parentId).getRemotePath());
         }
+        
+        
+        fetchChildren(children, syncResult);
+        if (mCancellation) Log.d(TAG, "Leaving " + uri + " because cancelation request");
+        
+        
+        /*  Commented code for ugly performance tests
+        mResponseDelays[mDelaysIndex] = responseDelay;
+        mSaveDelays[mDelaysIndex] = saveDelay;
+        mDelaysCount++;
+        mDelaysIndex++;
+        if (mDelaysIndex >= MAX_DELAYS)
+            mDelaysIndex = 0;
+         */
+        
+    }
+
+    /**
+     * Synchronize data of folders in the list of received files
+     * 
+     * @param files         Files to recursively fetch 
+     * @param syncResult    Updated object to provide results to the Synchronization Manager
+     */
+    private void fetchChildren(Vector<OCFile> files, SyncResult syncResult) {
+        for (int i=0; i < files.size() && !mCancellation; i++) {
+            OCFile newFile = files.get(i);
+            if (newFile.getMimetype().equals("DIR")) {
+                fetchData(getUri().toString() + WebdavUtils.encodePath(newFile.getRemotePath()), syncResult, newFile.getFileId());
+            }
+        }
     }
 
+    
     private OCFile fillOCFile(WebdavEntry we) {
         OCFile file = new OCFile(we.decodedPath());
         file.setCreationTimestamp(we.createTimestamp());