X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/7399508e050d9a2bf5a44188b6abc46501b19357..b455705d4cad77b9c9df70a55e84eeecbc14ff45:/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 e6c35f7c..540e83d1 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -90,18 +90,10 @@ public class FileDataStorageManager { return mAccount; } - public void setContentResolver(ContentResolver cr) { - mContentResolver = cr; - } - public ContentResolver getContentResolver() { return mContentResolver; } - public void setContentProviderClient(ContentProviderClient cp) { - mContentProviderClient = cp; - } - public ContentProviderClient getContentProviderClient() { return mContentProviderClient; } @@ -190,7 +182,6 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, file.getFileLength()); cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, file.getMimetype()); cv.put(ProviderTableMeta.FILE_NAME, file.getFileName()); - //if (file.getParentId() != DataStorageManager.ROOT_PARENT_ID) cv.put(ProviderTableMeta.FILE_PARENT, file.getParentId()); cv.put(ProviderTableMeta.FILE_PATH, file.getRemotePath()); if (!file.isFolder()) @@ -206,12 +197,12 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_REMOTE_ID, file.getRemoteId()); cv.put(ProviderTableMeta.FILE_UPDATE_THUMBNAIL, file.needsUpdateThumbnail()); cv.put(ProviderTableMeta.FILE_IS_DOWNLOADING, file.isDownloading()); - cv.put(ProviderTableMeta.FILE_IN_CONFLICT, file.isInConflict()); + cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, file.getEtagInConflict()); boolean sameRemotePath = fileExists(file.getRemotePath()); if (sameRemotePath || fileExists(file.getFileId())) { // for renamed files; no more delete and create - OCFile oldFile = null; + OCFile oldFile; if (sameRemotePath) { oldFile = getFileByPath(file.getRemotePath()); file.setFileId(oldFile.getFileId()); @@ -257,12 +248,6 @@ public class FileDataStorageManager { } } -// if (file.isFolder()) { -// updateFolderSize(file.getFileId()); -// } else { -// updateFolderSize(file.getParentId()); -// } - return overriden; } @@ -316,7 +301,7 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_REMOTE_ID, file.getRemoteId()); cv.put(ProviderTableMeta.FILE_UPDATE_THUMBNAIL, file.needsUpdateThumbnail()); cv.put(ProviderTableMeta.FILE_IS_DOWNLOADING, file.isDownloading()); - cv.put(ProviderTableMeta.FILE_IN_CONFLICT, file.isInConflict()); + cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, file.getEtagInConflict()); boolean existsByPath = fileExists(file.getRemotePath()); if (existsByPath || fileExists(file.getFileId())) { @@ -341,7 +326,6 @@ public class FileDataStorageManager { for (OCFile file : filesToRemove) { if (file.getParentId() == folder.getFileId()) { whereArgs = new String[]{mAccount.name, file.getRemotePath()}; - //Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, "" + file.getFileId()); if (file.isFolder()) { operations.add(ContentProviderOperation.newDelete( ContentUris.withAppendedId( @@ -438,43 +422,9 @@ public class FileDataStorageManager { } } - //updateFolderSize(folder.getFileId()); - } -// /** -// * -// * @param id -// */ -// 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); -// } -// } - - public boolean removeFile(OCFile file, boolean removeDBData, boolean removeLocalCopy) { boolean success = true; if (file != null) { @@ -509,7 +459,7 @@ public class FileDataStorageManager { // maybe unnecessary, but should be checked TODO remove if unnecessary file.setStoragePath(null); saveFile(file); - saveConflict(file, false); + saveConflict(file, null); } } } @@ -947,46 +897,12 @@ public class FileDataStorageManager { c.getColumnIndex(ProviderTableMeta.FILE_UPDATE_THUMBNAIL)) == 1 ? true : false); file.setDownloading(c.getInt( c.getColumnIndex(ProviderTableMeta.FILE_IS_DOWNLOADING)) == 1 ? true : false); - file.setInConflict(c.getInt( - c.getColumnIndex(ProviderTableMeta.FILE_IN_CONFLICT)) == 1 ? true : false); + file.setEtagInConflict(c.getString(c.getColumnIndex(ProviderTableMeta.FILE_ETAG_IN_CONFLICT))); } return file; } - /** - * Returns if the file/folder is shared by link or not - * - * @param path Path of the file/folder - * @return - */ - public boolean isShareByLink(String path) { - Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path); - OCFile file = null; - if (c.moveToFirst()) { - file = createFileInstance(c); - } - c.close(); - return file.isShareByLink(); - } - - /** - * Returns the public link of the file/folder - * - * @param path Path of the file/folder - * @return - */ - public String getPublicLink(String path) { - Cursor c = getCursorForValue(ProviderTableMeta.FILE_STORAGE_PATH, path); - OCFile file = null; - if (c.moveToFirst()) { - file = createFileInstance(c); - } - c.close(); - return file.getPublicLink(); - } - - // Methods for Shares public boolean saveShare(OCShare share) { boolean overriden = false; @@ -1317,10 +1233,7 @@ public class FileDataStorageManager { ProviderTableMeta.FILE_IS_DOWNLOADING, file.isDownloading() ? 1 : 0 ); - cv.put( - ProviderTableMeta.FILE_IN_CONFLICT, - file.isInConflict() ? 1 : 0 - ); + cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, file.getEtagInConflict()); boolean existsByPath = fileExists(file.getRemotePath()); if (existsByPath || fileExists(file.getFileId())) { @@ -1501,44 +1414,6 @@ public class FileDataStorageManager { } } return preparedOperations; - - /* - if (operations.size() > 0) { - try { - if (getContentResolver() != null) { - getContentResolver().applyBatch(MainApp.getAuthority(), operations); - - } else { - getContentProviderClient().applyBatch(operations); - } - - } catch (OperationApplicationException e) { - Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); - - } catch (RemoteException e) { - Log_OC.e(TAG, "Exception in batch of operations " + e.getMessage()); - } - } - */ - - /* - if (getContentResolver() != null) { - - getContentResolver().delete(ProviderTableMeta.CONTENT_URI_SHARE, - where, - whereArgs); - } else { - try { - getContentProviderClient().delete( ProviderTableMeta.CONTENT_URI_SHARE, - where, - whereArgs); - - } catch (RemoteException e) { - Log_OC.e(TAG, "Exception deleting shares in a folder " + e.getMessage()); - } - } - */ - //} } public void triggerMediaScan(String path) { @@ -1589,12 +1464,12 @@ public class FileDataStorageManager { } - public void saveConflict(OCFile file, boolean inConflict) { + public void saveConflict(OCFile file, String etagInConflict) { if (!file.isDown()) { - inConflict = false; + etagInConflict = null; } ContentValues cv = new ContentValues(); - cv.put(ProviderTableMeta.FILE_IN_CONFLICT, inConflict); + cv.put(ProviderTableMeta.FILE_ETAG_IN_CONFLICT, etagInConflict); int updated = 0; if (getContentResolver() != null) { updated = getContentResolver().update( @@ -1619,7 +1494,7 @@ public class FileDataStorageManager { Log_OC.d(TAG, "Number of files updated with CONFLICT: " + updated); if (updated > 0) { - if (inConflict) { + if (etagInConflict != null) { /// set conflict in all ancestor folders long parentId = file.getParentId(); @@ -1660,12 +1535,67 @@ public class FileDataStorageManager { } // else file is ROOT folder, no parent to set in conflict } else { - /// TODO update conflict in ancestor folders + /// update conflict in ancestor folders // (not directly unset; maybe there are more conflicts below them) + String parentPath = file.getRemotePath(); + if (parentPath.endsWith(OCFile.PATH_SEPARATOR)) { + parentPath = parentPath.substring(0, parentPath.length() - 1); + } + parentPath = parentPath.substring(0, parentPath.lastIndexOf(OCFile.PATH_SEPARATOR) + 1); + + Log_OC.d(TAG, "checking parents to remove conflict; STARTING with " + parentPath); + while (parentPath.length() > 0) { + + String where = + ProviderTableMeta.FILE_ETAG_IN_CONFLICT + " IS NOT NULL AND " + + ProviderTableMeta.FILE_CONTENT_TYPE + " != 'DIR' AND " + + ProviderTableMeta.FILE_ACCOUNT_OWNER + " = ? AND " + + ProviderTableMeta.FILE_PATH + " LIKE ?"; + Cursor descendentsInConflict = getContentResolver().query( + ProviderTableMeta.CONTENT_URI_FILE, + new String[]{ProviderTableMeta._ID}, + where, + new String[]{mAccount.name, parentPath + "%"}, + null + ); + if (descendentsInConflict == null || descendentsInConflict.getCount() == 0) { + Log_OC.d(TAG, "NO MORE conflicts in " + parentPath); + if (getContentResolver() != null) { + updated = getContentResolver().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + "=?", + new String[]{mAccount.name, parentPath} + ); + } else { + try { + updated = getContentProviderClient().update( + ProviderTableMeta.CONTENT_URI_FILE, + cv, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + "=?" + , new String[]{mAccount.name, parentPath} + ); + } catch (RemoteException e) { + Log_OC.e(TAG, "Failed saving conflict in database " + e.getMessage()); + } + } + + } else { + Log_OC.d(TAG, "STILL " + descendentsInConflict.getCount() + " in " + parentPath); + } + + if (descendentsInConflict != null) { + descendentsInConflict.close(); + } + + parentPath = parentPath.substring(0, parentPath.length() - 1); // trim last / + parentPath = parentPath.substring(0, parentPath.lastIndexOf(OCFile.PATH_SEPARATOR) + 1); + Log_OC.d(TAG, "checking parents to remove conflict; NEXT " + parentPath); + } } } - Log_OC.d(TAG, "Number of parents updated with CONFLICT: " + updated); - } }