X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/af62f9857d72b4df230797c4738d5f8752ac1785..cc39a76a90e6ecd572dbb249faae4e00b115832f:/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 d43de6a0..0ad985ee 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -26,10 +26,11 @@ 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 android.accounts.Account; import android.content.ContentProviderClient; import android.content.ContentProviderOperation; @@ -182,7 +183,6 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag()); boolean sameRemotePath = fileExists(file.getRemotePath()); - boolean changesSizeOfAncestors = false; if (sameRemotePath || fileExists(file.getFileId()) ) { // for renamed files; no more delete and create @@ -193,7 +193,6 @@ public class FileDataStorageManager { } else { oldFile = getFileById(file.getFileId()); } - changesSizeOfAncestors = (oldFile.getFileLength() != file.getFileLength()); overriden = true; if (getContentResolver() != null) { @@ -212,7 +211,6 @@ public class FileDataStorageManager { } } } else { - changesSizeOfAncestors = true; Uri result_uri = null; if (getContentResolver() != null) { result_uri = getContentResolver().insert( @@ -235,15 +233,9 @@ public class FileDataStorageManager { } if (file.isFolder()) { - calculateFolderSize(file.getFileId()); - if (file.needsUpdatingWhileSaving()) { - for (OCFile f : getFolderContent(file)) - saveFile(f); - } - } - - if (changesSizeOfAncestors || file.isFolder()) { - updateSizesToTheRoot(file.getParentId()); + updateFolderSize(file.getFileId()); + } else { + updateFolderSize(file.getParentId()); } return overriden; @@ -253,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 @@ -287,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,19 +318,16 @@ public class FileDataStorageManager { } } - // update metadata of folder --> TODO MOVE UPDATE OF SIZE TO CONTENTPROVIDER + // update metadata of folder ContentValues cv = new ContentValues(); 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, folder.getFileLength()); + 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()); cv.put(ProviderTableMeta.FILE_PATH, folder.getRemotePath()); - if (!folder.isFolder()) { - cv.put(ProviderTableMeta.FILE_STORAGE_PATH, folder.getStoragePath()); - } cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name); cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, folder.getLastSyncDateForProperties()); cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, folder.getLastSyncDateForData()); @@ -379,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); @@ -413,27 +378,40 @@ public class FileDataStorageManager { } } + updateFolderSize(folder.getFileId()); + } /** - * Calculate and save the folderSize on DB + * * @param id */ - public void calculateFolderSize(long id) { - long folderSize = 0; - - Vector files = getFolderContent(id); - - for (OCFile f: files) - { - folderSize = folderSize + f.getFileLength(); + 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); } - - updateSize(id, folderSize); } - + public void removeFile(OCFile file, boolean removeDBData, boolean removeLocalCopy) { if (file != null) { if (file.isFolder()) { @@ -454,9 +432,7 @@ public class FileDataStorageManager { } else { getContentResolver().delete(file_uri, where, whereArgs); } - if (file.getFileLength() > 0) { - updateSizesToTheRoot(file.getParentId()); // TODO move to content provider - } + updateFolderSize(file.getParentId()); } if (removeLocalCopy && file.isDown()) { boolean success = new File(file.getStoragePath()).delete(); @@ -496,9 +472,7 @@ public class FileDataStorageManager { } else { getContentResolver().delete(folder_uri, where, whereArgs); } - if (folder.getFileLength() > 0) { - updateSizesToTheRoot(folder.getParentId()); // TODO move to FileContentProvider - } + updateFolderSize(folder.getParentId()); } private void removeLocalFolder(File folder) { @@ -570,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); @@ -732,46 +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 - calculateFolderSize(parentId); - - // search the next parent - file = getFileById(parentId); - parentId = file.getParentId(); - - } - - } - }