Merge pull request #324 from owncloud/last_minute_release-1.5.2
[pub/Android/ownCloud.git] / src / com / owncloud / android / datamodel / FileDataStorageManager.java
index d43de6a..042709a 100644 (file)
@@ -25,10 +25,11 @@ import java.util.Collections;
 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 com.owncloud.android.utils.Log_OC;
+
 
 import android.accounts.Account;
 import android.content.ContentProviderClient;
@@ -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<OCFile> 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,11 +432,9 @@ 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()) {
+                if (removeLocalCopy && file.isDown() && file.getStoragePath() != null) {
                     boolean success = new File(file.getStoragePath()).delete();
                     if (!removeDBData && success) {
                         // maybe unnecessary, but should be checked TODO remove if unnecessary
@@ -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();
-            
-        }              
-        
-    }
-    
 }