X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/7ec25767ef40ed8ab4cfaa38f1191e07b4aa6f58..c2abbaaedb69dba35866a48b745b68f3519cbca1:/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 8b70d4a2..9933e360 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -26,10 +26,11 @@ import java.util.List; 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; @@ -136,13 +137,18 @@ public class FileDataStorageManager implements DataStorageManager { cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0); boolean sameRemotePath = fileExists(file.getRemotePath()); + boolean changesSizeOfAncestors = false; if (sameRemotePath || fileExists(file.getFileId()) ) { // for renamed files; no more delete and create + OCFile oldFile = null; if (sameRemotePath) { - OCFile oldFile = getFileByPath(file.getRemotePath()); + oldFile = getFileByPath(file.getRemotePath()); file.setFileId(oldFile.getFileId()); + } else { + oldFile = getFileById(file.getFileId()); } + changesSizeOfAncestors = (oldFile.getFileLength() != file.getFileLength()); overriden = true; if (getContentResolver() != null) { @@ -161,6 +167,7 @@ public class FileDataStorageManager implements DataStorageManager { } } } else { + changesSizeOfAncestors = true; Uri result_uri = null; if (getContentResolver() != null) { result_uri = getContentResolver().insert( @@ -179,13 +186,21 @@ public class FileDataStorageManager implements DataStorageManager { long new_id = Long.parseLong(result_uri.getPathSegments() .get(1)); file.setFileId(new_id); - } + } } - if (file.isDirectory() && file.needsUpdatingWhileSaving()) - for (OCFile f : getDirectoryContent(file)) - saveFile(f); - + if (file.isDirectory()) { + calculateFolderSize(file.getFileId()); + if (file.needsUpdatingWhileSaving()) { + for (OCFile f : getDirectoryContent(file)) + saveFile(f); + } + } + + if (changesSizeOfAncestors || file.isDirectory()) { + updateSizesToTheRoot(file.getParentId()); + } + return overriden; } @@ -220,6 +235,12 @@ public class FileDataStorageManager implements DataStorageManager { if (fileExists(file.getRemotePath())) { OCFile oldFile = getFileByPath(file.getRemotePath()); file.setFileId(oldFile.getFileId()); + + if (file.isDirectory()) { + cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, oldFile.getFileLength()); + file.setFileLength(oldFile.getFileLength()); + } + operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI). withValues(cv). withSelection( ProviderTableMeta._ID + "=?", @@ -230,9 +251,14 @@ public class FileDataStorageManager implements DataStorageManager { OCFile oldFile = getFileById(file.getFileId()); if (file.getStoragePath() == null && oldFile.getStoragePath() != null) file.setStoragePath(oldFile.getStoragePath()); - if (!file.isDirectory()); - cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath()); - + + if (!file.isDirectory()) + cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath()); + else { + cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, oldFile.getFileLength()); + file.setFileLength(oldFile.getFileLength()); + } + operations.add(ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI). withValues(cv). withSelection( ProviderTableMeta._ID + "=?", @@ -248,7 +274,7 @@ public class FileDataStorageManager implements DataStorageManager { ContentProviderResult[] results = null; try { if (getContentResolver() != null) { - results = getContentResolver().applyBatch(ProviderMeta.AUTHORITY_FILES, operations); + results = getContentResolver().applyBatch(MainApp.getAuthority(), operations); } else { results = getContentProvider().applyBatch(operations); @@ -303,46 +329,56 @@ public class FileDataStorageManager implements DataStorageManager { public ContentProviderClient getContentProvider() { return mContentProvider; } - + @Override public Vector getDirectoryContent(OCFile f) { - Vector ret = new Vector(); if (f != null && f.isDirectory() && f.getFileId() != -1) { + return getDirectoryContent(f.getFileId()); - Uri req_uri = Uri.withAppendedPath( - ProviderTableMeta.CONTENT_URI_DIR, - String.valueOf(f.getFileId())); - Cursor c = null; + } else { + return new Vector(); + } + } - if (getContentProvider() != null) { - try { - c = getContentProvider().query(req_uri, null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?", - new String[] { mAccount.name }, null); - } catch (RemoteException e) { - Log_OC.e(TAG, e.getMessage()); - return ret; - } - } else { - c = getContentResolver().query(req_uri, null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?", - new String[] { mAccount.name }, null); - } + private Vector getDirectoryContent(long parentId) { - if (c.moveToFirst()) { - do { - OCFile child = createFileInstance(c); - ret.add(child); - } while (c.moveToNext()); - } + Vector ret = new Vector(); - c.close(); + Uri req_uri = Uri.withAppendedPath( + ProviderTableMeta.CONTENT_URI_DIR, + String.valueOf(parentId)); + Cursor c = null; - Collections.sort(ret); + if (getContentProvider() != null) { + try { + c = getContentProvider().query(req_uri, null, + ProviderTableMeta.FILE_PARENT + "=?" , + new String[] { String.valueOf(parentId)}, null); + } catch (RemoteException e) { + Log_OC.e(TAG, e.getMessage()); + return ret; + } + } else { + c = getContentResolver().query(req_uri, null, + ProviderTableMeta.FILE_PARENT + "=?" , + new String[] { String.valueOf(parentId)}, null); + } + if (c.moveToFirst()) { + do { + OCFile child = createFileInstance(c); + ret.add(child); + } while (c.moveToNext()); } + + c.close(); + + Collections.sort(ret); + return ret; } + + private boolean fileExists(String cmp_key, String value) { Cursor c; @@ -466,7 +502,9 @@ public class FileDataStorageManager implements DataStorageManager { } } - updateSubtreeSize(file.getParentId()); + if (file.getFileLength() > 0) { + updateSizesToTheRoot(file.getParentId()); + } } @Override @@ -494,6 +532,10 @@ public class FileDataStorageManager implements DataStorageManager { if (removeDBData) { removeFile(dir, true); } + + if (dir.getFileLength() > 0) { + updateSizesToTheRoot(dir.getParentId()); + } } } @@ -515,16 +557,16 @@ public class FileDataStorageManager implements DataStorageManager { try { c = getContentProvider().query(ProviderTableMeta.CONTENT_URI, null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ?", - new String[] { mAccount.name, dir.getRemotePath() + "%" }, null); + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ? ", + new String[] { mAccount.name, dir.getRemotePath() + "%" }, ProviderTableMeta.FILE_PATH + " ASC "); } catch (RemoteException e) { Log_OC.e(TAG, e.getMessage()); } } else { c = getContentResolver().query(ProviderTableMeta.CONTENT_URI, null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ?", - new String[] { mAccount.name, dir.getRemotePath() + "%" }, null); + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + ProviderTableMeta.FILE_PATH + " LIKE ? ", + new String[] { mAccount.name, dir.getRemotePath() + "%" }, ProviderTableMeta.FILE_PATH + " ASC "); } /// 2. prepare a batch of update operations to change all the descendants @@ -552,7 +594,7 @@ public class FileDataStorageManager implements DataStorageManager { /// 3. apply updates in batch try { if (getContentResolver() != null) { - getContentResolver().applyBatch(ProviderMeta.AUTHORITY_FILES, operations); + getContentResolver().applyBatch(MainApp.getAuthority(), operations); } else { getContentProvider().applyBatch(operations); @@ -585,75 +627,42 @@ public class FileDataStorageManager implements DataStorageManager { return ret; } - @Override - public Vector getFilesbyParent(long parentId) { - - Vector ret = new Vector(); - - Uri req_uri = Uri.withAppendedPath( - ProviderTableMeta.CONTENT_URI_DIR, - String.valueOf(parentId)); - Cursor c = null; - - if (getContentProvider() != null) { - try { - c = getContentProvider().query(req_uri, null, - ProviderTableMeta.FILE_PARENT + "=?" , - new String[] { String.valueOf(parentId)}, null); - } catch (RemoteException e) { - Log_OC.e(TAG, e.getMessage()); - return ret; - } - } else { - c = getContentResolver().query(req_uri, null, - ProviderTableMeta.FILE_PARENT + "=?" , - new String[] { String.valueOf(parentId)}, null); - } - - if (c.moveToFirst()) { - do { - OCFile child = createFileInstance(c); - ret.add(child); - } while (c.moveToNext()); - } - - c.close(); - - Collections.sort(ret); - - return ret; - } - /** * Calculate and save the folderSize on DB * @param id */ @Override - public void saveFolderSize(long id) { + public void calculateFolderSize(long id) { long folderSize = 0; - Vector files = getFilesbyParent(id); - - Log_OC.d(TAG, "Folder " + String.valueOf(id) + "--- Number of Files = " + String.valueOf(files.size())); + Vector files = getDirectoryContent(id); for (OCFile f: files) { folderSize = folderSize + f.getFileLength(); - Log_OC.d(TAG, "Folder Size = " + String.valueOf(folderSize)); } - updatefolderSize(id, folderSize); + updateSize(id, folderSize); } /** - * Update the size value of a folder on DB + * Update the size value of an OCFile in DB */ - @Override - public int updatefolderSize(long id, long size) { + private int updateSize(long id, long size) { ContentValues cv = new ContentValues(); cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, size); - int result = getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, ProviderTableMeta._ID + "=?", - new String[] { String.valueOf(id) }); + int result = -1; + if (getContentResolver() != null) { + result = getContentResolver().update(ProviderTableMeta.CONTENT_URI, cv, ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(id) }); + } else { + try { + result = getContentProvider().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; } @@ -661,15 +670,14 @@ public class FileDataStorageManager implements DataStorageManager { * Update the size of a subtree of folder from a file to the root * @param parentId: parent of the file */ - private void updateSubtreeSize(long parentId) { + private void updateSizesToTheRoot(long parentId) { OCFile file; while (parentId != 0) { - Log_OC.d(TAG, "parent = " + parentId); // Update the size of the parent - saveFolderSize(parentId); + calculateFolderSize(parentId); // search the next parent file = getFileById(parentId);