X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/9060663f66a4c518bd428d4d68e035b64e24c26c..d38a69abc1ba78df70fee65fc2434fc80b6be93b:/src/com/owncloud/android/datamodel/FileDataStorageManager.java diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index 7e5e935a..042709a1 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -25,10 +25,11 @@ import java.util.Collections; import java.util.Iterator; import java.util.Vector; -import com.owncloud.android.Log_OC; -import com.owncloud.android.db.ProviderMeta; +import com.owncloud.android.MainApp; import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; import com.owncloud.android.utils.FileStorageUtils; +import com.owncloud.android.utils.Log_OC; + import android.accounts.Account; import android.content.ContentProviderClient; @@ -233,10 +234,8 @@ public class FileDataStorageManager { if (file.isFolder()) { updateFolderSize(file.getFileId()); - if (file.needsUpdatingWhileSaving()) { - for (OCFile f : getFolderContent(file)) - saveFile(f); - } + } else { + updateFolderSize(file.getParentId()); } return overriden; @@ -246,6 +245,9 @@ public class FileDataStorageManager { /** * Inserts or updates the list of files contained in a given folder. * + * CALLER IS THE RESPONSIBLE FOR GRANTING RIGHT UPDATE OF INFORMATION, NOT THIS METHOD. + * HERE ONLY DATA CONSISTENCY SHOULD BE GRANTED + * * @param folder * @param files * @param removeNotUpdated @@ -255,7 +257,6 @@ public class FileDataStorageManager { Log_OC.d(TAG, "Saving folder " + folder.getRemotePath() + " with " + updatedFiles.size() + " children and " + filesToRemove.size() + " files to remove"); ArrayList operations = new ArrayList(updatedFiles.size()); - long folderSize = 0; // prepare operations to insert or update files to save in the given folder for (OCFile file : updatedFiles) { @@ -264,7 +265,6 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, file.getModificationTimestampAtLastSyncForData()); cv.put(ProviderTableMeta.FILE_CREATION, file.getCreationTimestamp()); cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength()); - folderSize += file.getFileLength(); cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype()); cv.put(ProviderTableMeta.FILE_NAME, file.getFileName()); //cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId()); @@ -282,33 +282,6 @@ public class FileDataStorageManager { boolean existsByPath = fileExists(file.getRemotePath()); if (existsByPath || fileExists(file.getFileId())) { // updating an existing file - - /* CALLER IS THE RESPONSIBLE FOR GRANTING RIGHT UPDATE OF INFORMATION, NOT THIS METHOD. - * - * HERE ONLY DATA CONSISTENCY SHOULD BE GRANTED - */ - /* - OCFile oldFile = null; - if (existsByPath) { - // grant same id - oldFile = getFileByPath(file.getRemotePath()); - file.setFileId(oldFile.getFileId()); - } else { - oldFile = getFileById(file.getFileId()); - } - - if (file.isFolder()) { - // folders keep size information, since it's calculated - file.setFileLength(oldFile.getFileLength()); - cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, oldFile.getFileLength()); - - } else if (file.getStoragePath() == null && oldFile.getStoragePath() != null) { - // regular files keep access to local contents, although it's lost in the new OCFile - file.setStoragePath(oldFile.getStoragePath()); - cv.put(ProviderTableMeta.FILE_STORAGE_PATH, oldFile.getStoragePath()); - } - */ - operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI). withValues(cv). withSelection( ProviderTableMeta._ID + "=?", @@ -350,7 +323,7 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_MODIFIED, folder.getModificationTimestamp()); cv.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, folder.getModificationTimestampAtLastSyncForData()); cv.put(ProviderTableMeta.FILE_CREATION, folder.getCreationTimestamp()); - cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, folderSize); + cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, 0); // FileContentProvider calculates the right size cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, folder.getMimetype()); cv.put(ProviderTableMeta.FILE_NAME, folder.getFileName()); cv.put(ProviderTableMeta.FILE_PARENT, folder.getParentId()); @@ -371,7 +344,7 @@ public class FileDataStorageManager { Log_OC.d(TAG, "Sending " + operations.size() + " operations to FileContentProvider"); try { if (getContentResolver() != null) { - results = getContentResolver().applyBatch(ProviderMeta.AUTHORITY_FILES, operations); + results = getContentResolver().applyBatch(MainApp.getAuthority(), operations); } else { results = getContentProviderClient().applyBatch(operations); @@ -405,6 +378,8 @@ public class FileDataStorageManager { } } + updateFolderSize(folder.getFileId()); + } @@ -412,20 +387,27 @@ public class FileDataStorageManager { * * @param id */ - public void updateFolderSize(long id) { - if (getContentResolver() != null) { - getContentResolver().update(ProviderTableMeta.CONTENT_URI_DIR, null, - ProviderTableMeta._ID + "=?", - new String[] { String.valueOf(id) }); - } else { - try { - getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_DIR, null, - ProviderTableMeta._ID + "=?", - new String[] { String.valueOf(id) }); - - } catch (RemoteException e) { - Log_OC.e(TAG, "Exception in update of folder size through compatibility patch " + e.getMessage()); + private void updateFolderSize(long id) { + if (id > FileDataStorageManager.ROOT_PARENT_ID) { + Log_OC.d(TAG, "Updating size of " + id); + if (getContentResolver() != null) { + getContentResolver().update(ProviderTableMeta.CONTENT_URI_DIR, + new ContentValues(), // won't be used, but cannot be null; crashes in KLP + ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(id) }); + } else { + try { + getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_DIR, + new ContentValues(), // won't be used, but cannot be null; crashes in KLP + ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(id) }); + + } catch (RemoteException e) { + Log_OC.e(TAG, "Exception in update of folder size through compatibility patch " + e.getMessage()); + } } + } else { + Log_OC.e(TAG, "not updating size for folder " + id); } } @@ -450,8 +432,9 @@ public class FileDataStorageManager { } else { getContentResolver().delete(file_uri, where, whereArgs); } + updateFolderSize(file.getParentId()); } - if (removeLocalCopy && file.isDown()) { + if (removeLocalCopy && file.isDown() && file.getStoragePath() != null) { boolean success = new File(file.getStoragePath()).delete(); if (!removeDBData && success) { // maybe unnecessary, but should be checked TODO remove if unnecessary @@ -489,6 +472,7 @@ public class FileDataStorageManager { } else { getContentResolver().delete(folder_uri, where, whereArgs); } + updateFolderSize(folder.getParentId()); } private void removeLocalFolder(File folder) { @@ -560,7 +544,7 @@ public class FileDataStorageManager { /// 3. apply updates in batch try { if (getContentResolver() != null) { - getContentResolver().applyBatch(ProviderMeta.AUTHORITY_FILES, operations); + getContentResolver().applyBatch(MainApp.getAuthority(), operations); } else { getContentProviderClient().applyBatch(operations); @@ -722,47 +706,4 @@ public class FileDataStorageManager { return file; } - /* - * Update the size value of an OCFile in DB - * - private int updateSize(long id, long size) { - ContentValues cv = new ContentValues(); - cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, size); - int result = -1; - if (getContentResolver() != null) { - result = getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, ProviderTableMeta._ID + "=?", - new String[] { String.valueOf(id) }); - } else { - try { - result = getContentProviderClient().update(ProviderTableMeta.CONTENT_URI, cv, ProviderTableMeta._ID + "=?", - new String[] { String.valueOf(id) }); - } catch (RemoteException e) { - Log_OC.e(TAG,"Fail to update size column into database " + e.getMessage()); - } - } - return result; - } - */ - - /* - * Update the size of a subtree of folder from a file to the root - * @param parentId: parent of the file - * - private void updateSizesToTheRoot(long parentId) { - - OCFile file; - - while (parentId != FileDataStorageManager.ROOT_PARENT_ID) { - - // Update the size of the parent - updateFolderSize(parentId); - - // search the next parent - file = getFileById(parentId); - parentId = file.getParentId(); - - } - } - */ - }