X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/df8e9fa2c3b42d75fe66d94efac19f214ffcf16c..aae90eb1aa42a11449e30330e3e23e1e9e5eebb6:/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 c8c0d24d..aaafb3a0 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -612,6 +612,126 @@ public class FileDataStorageManager { } + public void moveLocalFile(OCFile file, String targetPath, String targetParentPath) { + + if (file != null && file.fileExists() && !OCFile.ROOT_PATH.equals(file.getFileName())) { + + OCFile targetParent = getFileByPath(targetParentPath); + if (targetParent == null) { + // TODO panic + } + + /// 1. get all the descendants of the moved element in a single QUERY + Cursor c = null; + if (getContentProviderClient() != null) { + try { + c = getContentProviderClient().query( + ProviderTableMeta.CONTENT_URI, + null, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + " LIKE ? ", + new String[] { + mAccount.name, + file.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, + file.getRemotePath() + "%" + }, + ProviderTableMeta.FILE_PATH + " ASC " + ); + } + + /// 2. prepare a batch of update operations to change all the descendants + ArrayList operations = + new ArrayList(c.getCount()); + String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name); + if (c.moveToFirst()) { + int lengthOfOldPath = file.getRemotePath().length(); + int lengthOfOldStoragePath = defaultSavePath.length() + lengthOfOldPath; + do { + ContentValues cv = new ContentValues(); // keep construction in the loop + OCFile child = createFileInstance(c); + cv.put( + ProviderTableMeta.FILE_PATH, + targetPath + child.getRemotePath().substring(lengthOfOldPath) + ); + if (child.getStoragePath() != null && + child.getStoragePath().startsWith(defaultSavePath)) { + // update link to downloaded content - but local move is not done here! + cv.put( + ProviderTableMeta.FILE_STORAGE_PATH, + defaultSavePath + targetPath + + child.getStoragePath().substring(lengthOfOldStoragePath) + ); + } + if (child.getRemotePath().equals(file.getRemotePath())) { + cv.put( + ProviderTableMeta.FILE_PARENT, + targetParent.getFileId() + ); + } + operations.add( + ContentProviderOperation.newUpdate(ProviderTableMeta.CONTENT_URI). + withValues(cv). + withSelection( + ProviderTableMeta._ID + "=?", + new String[] { String.valueOf(child.getFileId()) } + ) + .build()); + + } while (c.moveToNext()); + } + c.close(); + + /// 3. apply updates in batch + try { + if (getContentResolver() != null) { + getContentResolver().applyBatch(MainApp.getAuthority(), operations); + + } else { + getContentProviderClient().applyBatch(operations); + } + + } catch (Exception e) { + Log_OC.e( + TAG, + "Fail to update " + file.getFileId() + " and descendants in database", + e + ); + } + + /// 4. move in local file system + String localPath = FileStorageUtils.getDefaultSavePathFor(mAccount.name, file); + File localFile = new File(localPath); + boolean renamed = false; + if (localFile.exists()) { + File targetFile = new File(defaultSavePath + targetPath); + File targetFolder = targetFile.getParentFile(); + if (!targetFolder.exists()) { + targetFolder.mkdirs(); + } + renamed = localFile.renameTo(targetFile); + } + Log_OC.d(TAG, "Local file RENAMED : " + renamed); + + } + + } + + private Vector getFolderContent(long parentId) { Vector ret = new Vector(); @@ -1302,4 +1422,5 @@ public class FileDataStorageManager { */ //} } + }