From: masensio Date: Wed, 25 Sep 2013 16:38:17 +0000 (+0200) Subject: OC-1230: app doesn't show the folders structure correct for a while. Improve Sync... X-Git-Tag: oc-android-1.5.5~155^2~36 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/aaf8043d0c1fa25bb041990d98d28ab9b194f6ce?hp=--cc OC-1230: app doesn't show the folders structure correct for a while. Improve Sync Proccess --- aaf8043d0c1fa25bb041990d98d28ab9b194f6ce diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index 4825b7bb..eaeaf985 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -126,7 +126,7 @@ public class FileDataStorageManager implements DataStorageManager { cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength()); cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype()); cv.put(ProviderTableMeta.FILE_NAME, file.getFileName()); - if (file.getParentId() != 0) + if (file.getParentId() != DataStorageManager.ROOT_PARENT_ID) cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId()); cv.put(ProviderTableMeta.FILE_PATH, file.getRemotePath()); if (!file.isDirectory()) @@ -223,7 +223,7 @@ public class FileDataStorageManager implements DataStorageManager { cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength()); cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype()); cv.put(ProviderTableMeta.FILE_NAME, file.getFileName()); - if (file.getParentId() != 0) + if (file.getParentId() != DataStorageManager.ROOT_PARENT_ID) cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId()); cv.put(ProviderTableMeta.FILE_PATH, file.getRemotePath()); if (!file.isDirectory()) @@ -678,7 +678,7 @@ public class FileDataStorageManager implements DataStorageManager { OCFile file; - while (parentId != 0) { + while (parentId != DataStorageManager.ROOT_PARENT_ID) { Log_OC.d(TAG, "parent = " + parentId); // Update the size of the parent diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index e4d5a7c2..fba1d886 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -63,6 +63,9 @@ public class SynchronizeFolderOperation extends RemoteOperation { /** Id of the folder to synchronize in the local database */ private long mParentId; + + /** Boolean to indicate if is mandatory to update the folder */ + private boolean mEnforceMetadataUpdate; /** Access to the local database */ private DataStorageManager mStorageManager; @@ -85,13 +88,15 @@ public class SynchronizeFolderOperation extends RemoteOperation { public SynchronizeFolderOperation( String remotePath, long currentSyncTime, - long parentId, + long parentId, + boolean enforceMetadataUpdate, DataStorageManager dataStorageManager, Account account, Context context ) { mRemotePath = remotePath; mCurrentSyncTime = currentSyncTime; mParentId = parentId; + mEnforceMetadataUpdate = enforceMetadataUpdate; mStorageManager = dataStorageManager; mAccount = account; mContext = context; @@ -135,7 +140,7 @@ public class SynchronizeFolderOperation extends RemoteOperation { mConflictsFound = 0; mForgottenLocalFiles.clear(); boolean fileChanged = false; - boolean dirChanged = true; + boolean dirChanged = false; // code before in FileSyncAdapter.fetchData PropFindMethod query = null; @@ -150,134 +155,126 @@ public class SynchronizeFolderOperation extends RemoteOperation { if (isMultiStatus(status)) { MultiStatus resp = query.getResponseBodyAsMultiStatus(); - // synchronize properties of the parent folder, if necessary - if (mParentId == DataStorageManager.ROOT_PARENT_ID) { - dirChanged = false; - WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath()); - - // Properties of server folder - OCFile parent = fillOCFile(we); - // Properties of local folder - OCFile localParent = mStorageManager.getFileById(1); - if (localParent == null || !(parent.getEtag().equalsIgnoreCase(localParent.getEtag()))) { - mStorageManager.saveFile(parent); - mParentId = parent.getFileId(); - dirChanged = true; + // synchronize properties of the parent folder, if necessary + WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath()); + + // Properties of server folder + OCFile parent = fillOCFile(we); + // Properties of local folder + OCFile localParent = mStorageManager.getFileByPath(mRemotePath); + if (localParent == null || !(parent.getEtag().equalsIgnoreCase(localParent.getEtag())) || mEnforceMetadataUpdate) { + if (localParent != null) { + parent.setParentId(localParent.getParentId()); } - } - else if (! mRemotePath.equalsIgnoreCase(OCFile.PATH_SEPARATOR)){ - dirChanged = false; - WebdavEntry we = new WebdavEntry(resp.getResponses()[0], client.getBaseUri().getPath()); - - // Properties of server folder - OCFile parent = fillOCFile(we); - // Properties of local folder - OCFile localParent = mStorageManager.getFileByPath(mRemotePath); - if (localParent == null || !(parent.getEtag().equalsIgnoreCase(localParent.getEtag()))) { - dirChanged = true; - } + mStorageManager.saveFile(parent); + if (mParentId == DataStorageManager.ROOT_PARENT_ID) + mParentId = parent.getFileId(); + dirChanged = true; } if (dirChanged) { - // 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) { - /// 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 - fileChanged = false; - if (oldFile != null) { - if (!file.getEtag().equalsIgnoreCase(oldFile.getEtag())) { - fileChanged = true; - } - } else - fileChanged= true; - - if (fileChanged){ - if (file.isDirectory()) - file.setEtag(""); - 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()); + // 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) { + /// new OCFile instance with the data from the server + 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 + fileChanged = false; + if (oldFile != null) { + if (!file.getEtag().equalsIgnoreCase(oldFile.getEtag())) { + fileChanged = true; + } + } else + fileChanged= true; + + + 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()); + if (file.isDirectory()) + file.setEtag(oldFile.getEtag()); + } else + if (file.isDirectory()) + file.setEtag(""); + + /// 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); - } + /// 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); + 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 - RemoteOperationResult contentsResult = null; - for (SynchronizeFileOperation op: filesToSyncContents) {//int i=0; i < filesToSyncContents.size(); 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.e(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage(), contentsResult.getException()); + // 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 + RemoteOperationResult contentsResult = null; + for (SynchronizeFileOperation op: filesToSyncContents) { + contentsResult = op.execute(client); // returns without waiting for upload or download finishes + if (!contentsResult.isSuccess()) { + if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) { + mConflictsFound++; } else { - Log_OC.e(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage()); + mFailsInFavouritesFound++; + if (contentsResult.getException() != null) { + Log_OC.e(TAG, "Error while synchronizing favourites : " + contentsResult.getLogMessage(), contentsResult.getException()); + } else { + Log_OC.e(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 (OCFile fileChild: mChildren) { - 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); + // removal of obsolete files + mChildren = mStorageManager.getDirectoryContent(mStorageManager.getFileById(mParentId)); + String currentSavePath = FileStorageUtils.getSavePath(mAccount.name); + for (OCFile fileChild: mChildren) { + 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 { - client.exhaustResponse(query.getResponseBodyAsStream()); - } + } else { + client.exhaustResponse(query.getResponseBodyAsStream()); + } } - + // prepare result object if (!dirChanged) { result = new RemoteOperationResult(ResultCode.OK_NO_CHANGES_ON_DIR); diff --git a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java index 49f88f97..cb793631 100644 --- a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -194,10 +194,13 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { if (mFailedResultsCounter > MAX_FAILED_RESULTS || isFinisher(mLastFailedResult)) return; + boolean enforceMetadataUpdate = (parentId == DataStorageManager.ROOT_PARENT_ID); + // perform folder synchronization SynchronizeFolderOperation synchFolderOp = new SynchronizeFolderOperation( remotePath, mCurrentSyncTime, parentId, + enforceMetadataUpdate, getStorageManager(), getAccount(), getContext() diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 9fb31519..5359264b 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -146,6 +146,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa private OCFile mWaitingToPreview; private Handler mHandler; + + private boolean mSyncInProgress = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -597,21 +599,23 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa @Override public void onBackPressed() { - OCFileListFragment listOfFiles = getListOfFilesFragment(); - if (mDualPane || getSecondFragment() == null) { - if (listOfFiles != null) { // should never be null, indeed - if (mDirectories.getCount() <= 1) { - finish(); - return; + if (!mSyncInProgress) { + OCFileListFragment listOfFiles = getListOfFilesFragment(); + if (mDualPane || getSecondFragment() == null) { + if (listOfFiles != null) { // should never be null, indeed + if (mDirectories.getCount() <= 1) { + finish(); + return; + } + popDirname(); + listOfFiles.onBrowseUp(); } - popDirname(); - listOfFiles.onBrowseUp(); } + if (listOfFiles != null) { // should never be null, indeed + setFile(listOfFiles.getCurrentFile()); + } + cleanSecondFragment(); } - if (listOfFiles != null) { // should never be null, indeed - setFile(listOfFiles.getCurrentFile()); - } - cleanSecondFragment(); } @Override @@ -979,8 +983,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa // Sync Folder startSyncFolderOperation(directory.getRemotePath(), directory.getFileId()); -// // Update folder size on DB -// getStorageManager().calculateFolderSize(directory.getParentId()); } @@ -1070,6 +1072,11 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } + private void updateDisplayHomeAtSync(){ + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(!mSyncInProgress && getCurrentDir().getParentId() != DataStorageManager.ROOT_PARENT_ID); + } + /** * {@inheritDoc} */ @@ -1207,6 +1214,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa OCFileListFragment list = getListOfFilesFragment(); enableDisableViewGroup(list.getListView(), true); + mSyncInProgress = false; + updateDisplayHomeAtSync(); setSupportProgressBarIndeterminateVisibility(false); if (result.isSuccess()) { @@ -1431,11 +1440,14 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa OCFileListFragment list = getListOfFilesFragment(); enableDisableViewGroup(list.getListView(), false); + mSyncInProgress = true; + updateDisplayHomeAtSync(); // perform folder synchronization RemoteOperation synchFolderOp = new SynchronizeFolderOperation( remotePath, currentSyncTime, parentId, + false, getStorageManager(), getAccount(), getApplicationContext()