From: masensio Date: Wed, 11 Sep 2013 07:08:21 +0000 (+0200) Subject: OC-1230 X-Git-Tag: oc-android-1.5.5~155^2~43 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/776c6f1ffd2efe961fc4dff58b3314325608bed2 OC-1230 --- diff --git a/src/com/owncloud/android/operations/RemoteOperationResult.java b/src/com/owncloud/android/operations/RemoteOperationResult.java index 60cdcb2b..6b50f915 100644 --- a/src/com/owncloud/android/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/operations/RemoteOperationResult.java @@ -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) { diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index aa7adf67..2bf4ee08 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -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 filesOnServer = new ArrayList (); // Contains the lists of files on server List updatedFiles = new Vector(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) { diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 17af92b9..26b1df52 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -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); + } + } + } } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index d79c5d14..45c9abd4 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -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; }