import java.util.List;
import java.util.Vector;
-import com.owncloud.android.DisplayUtils;
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;
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) {
}
}
} else {
+ changesSizeOfAncestors = true;
Uri result_uri = null;
if (getContentResolver() != null) {
result_uri = getContentResolver().insert(
}
}
- 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);
+ }
+ }
- Log_OC.d(TAG, ".........file Time= " + DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));
- updateSubtreeSize(file.getParentId());
+ if (changesSizeOfAncestors || file.isDirectory()) {
+ updateSizesToTheRoot(file.getParentId());
+ }
return overriden;
}
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 + "=?",
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 + "=?",
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);
public ContentProviderClient getContentProvider() {
return mContentProvider;
}
-
+
@Override
public Vector<OCFile> getDirectoryContent(OCFile f) {
- Vector<OCFile> ret = new Vector<OCFile>();
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<OCFile>();
+ }
+ }
- 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<OCFile> getDirectoryContent(long parentId) {
- if (c.moveToFirst()) {
- do {
- OCFile child = createFileInstance(c);
- ret.add(child);
- } while (c.moveToNext());
- }
+ Vector<OCFile> ret = new Vector<OCFile>();
- 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;
}
}
- updateSubtreeSize(file.getParentId());
+ if (file.getFileLength() > 0) {
+ updateSizesToTheRoot(file.getParentId());
+ }
}
@Override
removeFile(dir, true);
}
- updateSubtreeSize(dir.getParentId());
+ if (dir.getFileLength() > 0) {
+ updateSizesToTheRoot(dir.getParentId());
+ }
}
}
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
/// 3. apply updates in batch
try {
if (getContentResolver() != null) {
- getContentResolver().applyBatch(ProviderMeta.AUTHORITY_FILES, operations);
+ getContentResolver().applyBatch(MainApp.getAuthority(), operations);
} else {
getContentProvider().applyBatch(operations);
return ret;
}
- @Override
- public Vector<OCFile> getFilesbyParent(long parentId) {
-
- Vector<OCFile> ret = new Vector<OCFile>();
-
- 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<OCFile> files = getFilesbyParent(id);
+ Vector<OCFile> files = getDirectoryContent(id);
for (OCFile f: files)
{
folderSize = folderSize + f.getFileLength();
}
- 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;
}
* 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);