From: masensio Date: Mon, 9 Sep 2013 12:42:06 +0000 (+0200) Subject: OC-1194: Adapt Sync Process using etag X-Git-Tag: oc-android-1.5.5~155^2~44 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/e0b1e23e45ddf2a6a0f347639e7c19036dbfeeec?ds=sidebyside OC-1194: Adapt Sync Process using etag --- diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index fae21a84..aa7adf67 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -23,6 +23,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -34,6 +35,7 @@ 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; @@ -58,6 +60,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; @@ -149,12 +156,20 @@ public class SynchronizeFolderOperation extends RemoteOperation { // 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); - mStorageManager.saveFile(parent); - mParentId = parent.getFileId(); + // Properties of local folder + OCFile localParent = mStorageManager.getFileById(1); + if (parent.getEtag() != localParent.getEtag()) { + mStorageManager.saveFile(parent); + mParentId = parent.getFileId(); + } } + // read contents in folder + List filesOnServer = new ArrayList (); // Contains the lists of files on server List updatedFiles = new Vector(resp.getResponses().length - 1); List filesToSyncContents = new Vector(); for (int i = 1; i < resp.getResponses().length; ++i) { @@ -162,45 +177,58 @@ public class SynchronizeFolderOperation extends RemoteOperation { 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; if (oldFile != null) { - file.setKeepInSync(oldFile.keepInSync()); - file.setLastSyncDateForData(oldFile.getLastSyncDateForData()); - file.setModificationTimestampAtLastSyncForData(oldFile.getModificationTimestampAtLastSyncForData()); // must be kept unchanged when the file contents are not updated - checkAndFixForeignStoragePath(oldFile); - file.setStoragePath(oldFile.getStoragePath()); - } + if (!file.getEtag().equalsIgnoreCase(oldFile.getEtag())) { + fileChanged = true; + } + } else + fileChanged= true; - /// scan default location if local copy of file is not linked in OCFile instance - if (file.getStoragePath() == null && !file.isDirectory()) { - File f = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file)); - if (f.exists()) { - file.setStoragePath(f.getAbsolutePath()); - file.setLastSyncDateForData(f.lastModified()); + if (fileChanged){ + if (oldFile != null) { + file.setKeepInSync(oldFile.keepInSync()); + file.setLastSyncDateForData(oldFile.getLastSyncDateForData()); + file.setModificationTimestampAtLastSyncForData(oldFile.getModificationTimestampAtLastSyncForData()); // must be kept unchanged when the file contents are not updated + checkAndFixForeignStoragePath(oldFile); + file.setStoragePath(oldFile.getStoragePath()); } + /// scan default location if local copy of file is not linked in OCFile instance + if (file.getStoragePath() == null && !file.isDirectory()) { + File f = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file)); + if (f.exists()) { + file.setStoragePath(f.getAbsolutePath()); + file.setLastSyncDateForData(f.lastModified()); + } + } + + /// prepare content synchronization for kept-in-sync files + if (file.keepInSync()) { + SynchronizeFileOperation operation = new SynchronizeFileOperation( oldFile, + file, + mStorageManager, + mAccount, + true, + false, + mContext + ); + filesToSyncContents.add(operation); + } + + updatedFiles.add(file); } - - /// prepare content synchronization for kept-in-sync files - if (file.keepInSync()) { - SynchronizeFileOperation operation = new SynchronizeFileOperation( oldFile, - file, - mStorageManager, - mAccount, - true, - false, - mContext - ); - filesToSyncContents.add(operation); - } - - 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; @@ -228,8 +256,9 @@ public class SynchronizeFolderOperation extends RemoteOperation { String currentSavePath = FileStorageUtils.getSavePath(mAccount.name); for (int i=0; i < mChildren.size(); ) { file = mChildren.get(i); - if (file.getLastSyncDateForProperties() != mCurrentSyncTime) { - Log_OC.d(TAG, "removing file: " + file); + //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 { diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index c6c8ecfc..17af92b9 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -1177,7 +1177,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa setSupportProgressBarIndeterminateVisibility(false); if (result.isSuccess()) { DataStorageManager storageManager = getStorageManager(); - OCFile parentDir = storageManager.getFileById(operation.getParentId()); + OCFile parentDir = storageManager.getFileByPath(operation.getRemotePath()); refreshListOfFilesFragment(parentDir); } else { diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index b6d30ed2..d79c5d14 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -145,7 +145,7 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName if (mFile != null) { listDirectory(mFile); - mContainerActivity.startSyncFolderOperation(mFile.getRemotePath(), mFile.getParentId()); + mContainerActivity.startSyncFolderOperation(mFile.getRemotePath(), mFile.getFileId()); } } diff --git a/src/eu/alefzero/webdav/WebdavEntry.java b/src/eu/alefzero/webdav/WebdavEntry.java index 29264a48..665a850c 100644 --- a/src/eu/alefzero/webdav/WebdavEntry.java +++ b/src/eu/alefzero/webdav/WebdavEntry.java @@ -42,8 +42,10 @@ public class WebdavEntry { DavPropertySet propSet = ms.getProperties(status); @SuppressWarnings("rawtypes") DavProperty prop = propSet.get(DavPropertyName.DISPLAYNAME); - if (prop != null) + if (prop != null) { mName = (String) prop.getName().toString(); + mName = mName.substring(1, mName.length()-1); + } else { String[] tmp = mPath.split("/"); if (tmp.length > 0) @@ -89,8 +91,10 @@ public class WebdavEntry { } prop = propSet.get(DavPropertyName.GETETAG); - if (prop != null) + if (prop != null) { mEtag = (String) prop.getValue(); + mEtag = mEtag.substring(1, mEtag.length()-1); + } } else { Log_OC.e("WebdavEntry",