Merge branch 'develop' into refresh_folder_contents_when_browsed_into
authorDavid A. Velasco <dvelasco@solidgear.es>
Wed, 23 Oct 2013 15:35:07 +0000 (17:35 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Wed, 23 Oct 2013 15:35:07 +0000 (17:35 +0200)
15 files changed:
1  2 
res/values/strings.xml
src/com/owncloud/android/Uploader.java
src/com/owncloud/android/datamodel/FileDataStorageManager.java
src/com/owncloud/android/db/ProviderMeta.java
src/com/owncloud/android/files/services/FileDownloader.java
src/com/owncloud/android/files/services/FileUploader.java
src/com/owncloud/android/operations/RemoteOperation.java
src/com/owncloud/android/providers/FileContentProvider.java
src/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java
src/com/owncloud/android/syncadapter/FileSyncAdapter.java
src/com/owncloud/android/syncadapter/FileSyncService.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/fragment/FileDetailFragment.java
src/com/owncloud/android/ui/preview/PreviewImageActivity.java
src/eu/alefzero/webdav/WebdavClient.java

Simple merge
@@@ -241,21 -204,16 +241,24 @@@ public class FileDataStorageManager 
      }
  
  
 -    @Override
 -    public void saveFiles(List<OCFile> files) {
 +    /**
 +     * 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
 +     */
 +    public void saveFolder(OCFile folder, Collection<OCFile> updatedFiles, Collection<OCFile> filesToRemove) {
 +        
 +        Log_OC.d(TAG,  "Saving folder " + folder.getRemotePath() + " with " + updatedFiles.size() + " children and " + filesToRemove.size() + " files to remove");
  
 -        Iterator<OCFile> filesIt = files.iterator();
 -        ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(files.size());
 -        OCFile file = null;
 +        ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(updatedFiles.size());
  
 -        // prepare operations to perform
 -        while (filesIt.hasNext()) {
 -            file = filesIt.next();
 +        // prepare operations to insert or update files to save in the given folder
 +        for (OCFile file : updatedFiles) {
              ContentValues cv = new ContentValues();
              cv.put(ProviderTableMeta.FILE_MODIFIED, file.getModificationTimestamp());
              cv.put(ProviderTableMeta.FILE_MODIFIED_AT_LAST_SYNC_FOR_DATA, file.getModificationTimestampAtLastSyncForData());
              cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, file.getLastSyncDateForProperties());
              cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE_FOR_DATA, file.getLastSyncDateForData());
              cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0);
 +            cv.put(ProviderTableMeta.FILE_ETAG, file.getEtag());
  
 -            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 + "=?", 
 -                                new String[] { String.valueOf(file.getFileId()) })
 -                                .build());
 -
 -            } else if (fileExists(file.getFileId())) {
 -                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());
 -                else {
 -                    cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, oldFile.getFileLength());
 -                    file.setFileLength(oldFile.getFileLength());
 -                }
 -                
 +            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 + "=?", 
  
          // apply operations in batch
          ContentProviderResult[] results = null;
 +        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 = getContentProvider().applyBatch(operations);
 +                results = getContentProviderClient().applyBatch(operations);
              }
  
          } catch (OperationApplicationException e) {
                  }
              }
          }
 +        
 +        updateFolderSize(folder.getFileId());
 +        
 +    }
  
 -        for (OCFile aFile : files) {
 -            if (aFile.isDirectory() && aFile.needsUpdatingWhileSaving())
 -                saveFiles(getDirectoryContent(aFile));
 -        }
  
 +    /**
 +     * 
 +     * @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, null,
 +                        ProviderTableMeta._ID + "=?",
 +                        new String[] { String.valueOf(id) });
 +            } else {
 +                try {
 +                    getContentProviderClient().update(ProviderTableMeta.CONTENT_URI_DIR, null,
 +                        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 void setAccount(Account account) {
 -        mAccount = account;
 +    public void removeFile(OCFile file, boolean removeDBData, boolean removeLocalCopy) {
 +        if (file != null) {
 +            if (file.isFolder()) {
 +                removeFolder(file, removeDBData, removeLocalCopy);
 +                
 +            } else {
 +                if (removeDBData) {
 +                    //Uri file_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, ""+file.getFileId());
 +                    Uri file_uri = ContentUris.withAppendedId(ProviderTableMeta.CONTENT_URI_FILE, file.getFileId());
 +                    String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
 +                    String [] whereArgs = new String[]{mAccount.name, file.getRemotePath()};
 +                    if (getContentProviderClient() != null) {
 +                        try {
 +                            getContentProviderClient().delete(file_uri, where, whereArgs);
 +                        } catch (RemoteException e) {
 +                            e.printStackTrace();
 +                        }
 +                    } else {
 +                        getContentResolver().delete(file_uri, where, whereArgs);
 +                    }
 +                    updateFolderSize(file.getParentId());
 +                }
 +                if (removeLocalCopy && file.isDown()) {
 +                    boolean success = new File(file.getStoragePath()).delete();
 +                    if (!removeDBData && success) {
 +                        // maybe unnecessary, but should be checked TODO remove if unnecessary
 +                        file.setStoragePath(null);
 +                        saveFile(file);
 +                    }
 +                }
 +            }
 +        }
      }
 +    
  
 -    public Account getAccount() {
 -        return mAccount;
 +    public void removeFolder(OCFile folder, boolean removeDBData, boolean removeLocalContent) {
 +        if (folder != null && folder.isFolder()) {
 +            if (removeDBData &&  folder.getFileId() != -1) {
 +                removeFolderInDb(folder);
 +            }
 +            if (removeLocalContent) {
 +                File localFolder = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, folder));
 +                removeLocalFolder(localFolder);
 +            }
 +        }
      }
  
 -    public void setContentResolver(ContentResolver cr) {
 -        mContentResolver = cr;
 +    private void removeFolderInDb(OCFile folder) {
 +        Uri folder_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, ""+ folder.getFileId());   // URI for recursive deletion
 +        String where = ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?" + " AND " + ProviderTableMeta.FILE_PATH + "=?";
 +        String [] whereArgs = new String[]{mAccount.name, folder.getRemotePath()};
 +        if (getContentProviderClient() != null) {
 +            try {
 +                getContentProviderClient().delete(folder_uri, where, whereArgs);
 +            } catch (RemoteException e) {
 +                e.printStackTrace();
 +            }
 +        } else {
 +            getContentResolver().delete(folder_uri, where, whereArgs); 
 +        }
 +        updateFolderSize(folder.getParentId());
      }
  
 -    public ContentResolver getContentResolver() {
 -        return mContentResolver;
 +    private void removeLocalFolder(File folder) {
 +        if (folder.exists()) {
 +            File[] files = folder.listFiles();
 +            if (files != null) {
 +                for (File file : files) {
 +                    if (file.isDirectory()) {
 +                        removeLocalFolder(file);
 +                    } else {
 +                        file.delete();
 +                    }
 +                }
 +            }
 +            folder.delete();
 +        }
      }
  
 -    public void setContentProvider(ContentProviderClient cp) {
 -        mContentProvider = cp;
 -    }
 +    /**
 +     * Updates database for a folder that was moved to a different location.
 +     * 
 +     * TODO explore better (faster) implementations
 +     * TODO throw exceptions up !
 +     */
 +    public void moveFolder(OCFile folder, String newPath) {
 +        // TODO check newPath
  
 -    public ContentProviderClient getContentProvider() {
 -        return mContentProvider;
 -    }
 -    
 -    @Override
 -    public Vector<OCFile> getDirectoryContent(OCFile f) {
 -        if (f != null && f.isDirectory() && f.getFileId() != -1) {
 -            return getDirectoryContent(f.getFileId());
 +        if (folder != null && folder.isFolder() && folder.fileExists() && !OCFile.ROOT_PATH.equals(folder.getFileName())) {
 +            /// 1. get all the descendants of 'dir' in a single QUERY (including 'dir')
 +            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, folder.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, folder.getRemotePath() + "%"  }, ProviderTableMeta.FILE_PATH + " ASC ");
 +            }
 +
 +            /// 2. prepare a batch of update operations to change all the descendants
 +            ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(c.getCount());
 +            int lengthOfOldPath = folder.getRemotePath().length();
 +            String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name);
 +            int lengthOfOldStoragePath = defaultSavePath.length() + lengthOfOldPath;
 +            if (c.moveToFirst()) {
 +                do {
 +                    ContentValues cv = new ContentValues(); // don't take the constructor out of the loop and clear the object
 +                    OCFile child = createFileInstance(c);
 +                    cv.put(ProviderTableMeta.FILE_PATH, newPath + child.getRemotePath().substring(lengthOfOldPath));
 +                    if (child.getStoragePath() != null && child.getStoragePath().startsWith(defaultSavePath)) {
 +                        cv.put(ProviderTableMeta.FILE_STORAGE_PATH, defaultSavePath + newPath + child.getStoragePath().substring(lengthOfOldStoragePath));
 +                    }
 +                    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(ProviderMeta.AUTHORITY_FILES, operations);
++                    getContentResolver().applyBatch(MainApp.getAuthority(), operations);
 +
 +                } else {
 +                    getContentProviderClient().applyBatch(operations);
 +                }
 +
 +            } catch (OperationApplicationException e) {
 +                Log_OC.e(TAG, "Fail to update descendants of " + folder.getFileId() + " in database", e);
 +
 +            } catch (RemoteException e) {
 +                Log_OC.e(TAG, "Fail to update desendants of " + folder.getFileId() + " in database", e);
 +            }
  
 -        } else {
 -            return new Vector<OCFile>();
          }
      }
  
          return file;
      }
  
-     /*
 -    @Override
 -    public void removeFile(OCFile file, boolean removeLocalCopy) {
 -        Uri file_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, ""+file.getFileId());
 -        if (getContentProvider() != null) {
 -            try {
 -                getContentProvider().delete(file_uri,
 -                        ProviderTableMeta.FILE_ACCOUNT_OWNER+"=?",
 -                        new String[]{mAccount.name});
 -            } catch (RemoteException e) {
 -                e.printStackTrace();
 -            }
 -        } else {
 -            getContentResolver().delete(file_uri,
 -                    ProviderTableMeta.FILE_ACCOUNT_OWNER+"=?",
 -                    new String[]{mAccount.name});
 -        }
 -        if (file.isDown() && removeLocalCopy) {
 -            new File(file.getStoragePath()).delete();
 -        }
 -        if (file.isDirectory() && removeLocalCopy) {
 -            File f = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file));
 -            if (f.exists() && f.isDirectory() && (f.list() == null || f.list().length == 0)) {
 -                f.delete();
 -            }
 -        }
 -        
 -        if (file.getFileLength() > 0) {
 -            updateSizesToTheRoot(file.getParentId());
 -        }
 -    }
 -
 -    @Override
 -    public void removeDirectory(OCFile dir, boolean removeDBData, boolean removeLocalContent) {
 -        // TODO consider possible failures
 -        if (dir != null && dir.isDirectory() && dir.getFileId() != -1) {
 -            Vector<OCFile> children = getDirectoryContent(dir);
 -            if (children.size() > 0) {
 -                OCFile child = null;
 -                for (int i=0; i<children.size(); i++) {
 -                    child = children.get(i);
 -                    if (child.isDirectory()) {
 -                        removeDirectory(child, removeDBData, removeLocalContent);
 -                    } else {
 -                        if (removeDBData) {
 -                            removeFile(child, removeLocalContent);
 -                        } else if (removeLocalContent) {
 -                            if (child.isDown()) {
 -                                new File(child.getStoragePath()).delete();
 -                            }
 -                        }
 -                    }
 -                }
 -            }
 -            if (removeDBData) {
 -                removeFile(dir, true);
 -            }
 -            
 -            if (dir.getFileLength() > 0) {
 -                updateSizesToTheRoot(dir.getParentId());
 -            }
 -        }
 -    }
 -
 -
 -    /**
 -     * Updates database for a folder that was moved to a different location.
 -     * 
 -     * TODO explore better (faster) implementations
 -     * TODO throw exceptions up !
 -     */
 -    @Override
 -    public void moveDirectory(OCFile dir, String newPath) {
 -        // TODO check newPath
 -
 -        if (dir != null && dir.isDirectory() && dir.fileExists() && !dir.getFileName().equals(OCFile.PATH_SEPARATOR)) {
 -            /// 1. get all the descendants of 'dir' in a single QUERY (including 'dir')
 -            Cursor c = null;
 -            if (getContentProvider() != null) {
 -                try {
 -                    c = getContentProvider().query(ProviderTableMeta.CONTENT_URI, 
 -                            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() + "%"  }, ProviderTableMeta.FILE_PATH + " ASC ");
 -            }
 -
 -            /// 2. prepare a batch of update operations to change all the descendants
 -            ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(c.getCount());
 -            int lengthOfOldPath = dir.getRemotePath().length();
 -            String defaultSavePath = FileStorageUtils.getSavePath(mAccount.name);
 -            int lengthOfOldStoragePath = defaultSavePath.length() + lengthOfOldPath;
 -            if (c.moveToFirst()) {
 -                do {
 -                    ContentValues cv = new ContentValues(); // don't take the constructor out of the loop and clear the object
 -                    OCFile child = createFileInstance(c);
 -                    cv.put(ProviderTableMeta.FILE_PATH, newPath + child.getRemotePath().substring(lengthOfOldPath));
 -                    if (child.getStoragePath() != null && child.getStoragePath().startsWith(defaultSavePath)) {
 -                        cv.put(ProviderTableMeta.FILE_STORAGE_PATH, defaultSavePath + newPath + child.getStoragePath().substring(lengthOfOldStoragePath));
 -                    }
 -                    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 {
 -                    getContentProvider().applyBatch(operations);
 -                }
 -
 -            } catch (OperationApplicationException e) {
 -                Log_OC.e(TAG, "Fail to update descendants of " + dir.getFileId() + " in database", e);
 -
 -            } catch (RemoteException e) {
 -                Log_OC.e(TAG, "Fail to update desendants of " + dir.getFileId() + " in database", e);
 -            }
 -
 -        }
 -    }
 -
 -    @Override
 -    public Vector<OCFile> getDirectoryImages(OCFile directory) {
 -        Vector<OCFile> ret = new Vector<OCFile>(); 
 -        if (directory != null) {
 -            // TODO better implementation, filtering in the access to database (if possible) instead of here 
 -            Vector<OCFile> tmp = getDirectoryContent(directory);
 -            OCFile current = null; 
 -            for (int i=0; i<tmp.size(); i++) {
 -                current = tmp.get(i);
 -                if (current.isImage()) {
 -                    ret.add(current);
 -                }
 -            }
 -        }
 -        return ret;
 -    }
 -
 -    /**
 -     * Calculate and save the folderSize on DB
 -     * @param id
 -     */
 -    @Override
 -    public void calculateFolderSize(long id) {
 -        long folderSize = 0;
 -        
 -        Vector<OCFile> files = getDirectoryContent(id);
 -        
 -        for (OCFile f: files)
 -        {
 -            folderSize = folderSize + f.getFileLength();
 -        }
 -        
 -        updateSize(id, folderSize);
 -    }
 -
 -    /**
--     * 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 + "=?", 
 -                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 updateSizesToTheRoot(long parentId) {
--        
--        OCFile file; 
--
-         while (parentId != FileDataStorageManager.ROOT_PARENT_ID) {
 -        while (parentId != 0) {
--            
--            // Update the size of the parent
-             updateFolderSize(parentId);
 -            calculateFolderSize(parentId);
--            
--            // search the next parent
--            file = getFileById(parentId);            
--            parentId = file.getParentId();
--            
--        }              
 -        
--    }
-     */
--    
  }
@@@ -28,10 -30,12 +30,12 @@@ import android.provider.BaseColumns
   */\r
  public class ProviderMeta {\r
  \r
-     public static final String AUTHORITY_FILES = "org.owncloud";\r
-     public static final String DB_FILE = "owncloud.db";\r
+     /* These constants are now in MainApp\r
+         public static final String AUTHORITY_FILES = "org.owncloud";\r
+         public static final String DB_FILE = "owncloud.db";\r
+     */\r
      public static final String DB_NAME = "filelist";\r
 -    public static final int DB_VERSION = 4;\r
 +    public static final int DB_VERSION = 5;\r
  \r
      private ProviderMeta() {\r
      }\r
@@@ -22,7 -21,7 +22,8 @@@ import java.util.ArrayList
  import java.util.HashMap;
  
  import com.owncloud.android.Log_OC;
+ import com.owncloud.android.R;
 +import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.db.ProviderMeta;
  import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
  
@@@ -91,37 -84,20 +92,27 @@@ public class FileContentProvider extend
      private static final int SINGLE_FILE = 1;
      private static final int DIRECTORY = 2;
      private static final int ROOT_DIRECTORY = 3;
-     private static final UriMatcher mUriMatcher;
 -    
 -    private UriMatcher mUriMatcher;
 -//    static {
 -//        mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 -//        mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, null, ROOT_DIRECTORY);
 -//        mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE);
 -//        mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE);
 -//        mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY);
 -//    }
  
-     public static final String METHOD_UPDATE_FOLDER_SIZE = "updateFolderSize";
++    private UriMatcher mUriMatcher;
      
-     static {
-         mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-         mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, null, ROOT_DIRECTORY);
-         mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/", SINGLE_FILE);
-         mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "file/#", SINGLE_FILE);
-         mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/", DIRECTORY);
-         mUriMatcher.addURI(ProviderMeta.AUTHORITY_FILES, "dir/#", DIRECTORY);
-     }
      @Override
      public int delete(Uri uri, String where, String[] whereArgs) {
 +        //Log_OC.d(TAG, "Deleting " + uri + " at provider " + this);
 +        int count = 0;
          SQLiteDatabase db = mDbHelper.getWritableDatabase();
 +        db.beginTransaction();
 +        try {
 +            count = delete(db, uri, where, whereArgs);
 +            db.setTransactionSuccessful();
 +        } finally {
 +            db.endTransaction();
 +        }
 +        getContext().getContentResolver().notifyChange(uri, null);
 +        return count;
 +    }
 +    
 +    
 +    private int delete(SQLiteDatabase db, Uri uri, String where, String[] whereArgs) {
          int count = 0;
          switch (mUriMatcher.match(uri)) {
          case SINGLE_FILE:
      @Override
      public boolean onCreate() {
          mDbHelper = new DataBaseHelper(getContext());
+         
+         String authority = getContext().getResources().getString(R.string.authority);
+         mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+         mUriMatcher.addURI(authority, null, ROOT_DIRECTORY);
+         mUriMatcher.addURI(authority, "file/", SINGLE_FILE);
+         mUriMatcher.addURI(authority, "file/#", SINGLE_FILE);
++        mUriMatcher.addURI(authority, "dir/", DIRECTORY);
+         mUriMatcher.addURI(authority, "dir/#", DIRECTORY);
+         
          return true;
      }
  
  package com.owncloud.android.syncadapter;\r
  \r
  import java.io.IOException;\r
- //import java.net.UnknownHostException;\r
- //import java.util.Date;\r
 -import java.util.Date;\r
  \r
  import org.apache.http.HttpRequest;\r
  import org.apache.http.HttpResponse;\r
  import org.apache.http.client.ClientProtocolException;\r
- //import org.apache.http.conn.ConnectionKeepAliveStrategy;\r
- //import org.apache.http.protocol.HttpContext;\r
 -import org.apache.http.conn.ConnectionKeepAliveStrategy;\r
 -import org.apache.http.protocol.HttpContext;\r
  \r
  import com.owncloud.android.authentication.AccountUtils;\r
  import com.owncloud.android.authentication.AccountUtils.AccountNotFoundException;\r
@@@ -57,8 -54,8 +53,7 @@@ public abstract class AbstractOwnCloudS
      private AccountManager accountManager;\r
      private Account account;\r
      private ContentProviderClient contentProvider;\r
-     //private Date lastUpdated;\r
 -    private Date lastUpdated;\r
 -    private DataStorageManager mStoreManager;\r
 +    private FileDataStorageManager mStoreManager;\r
  \r
      private WebdavClient mClient = null;\r
  \r
      protected WebdavClient getClient() {\r
          return mClient;\r
      }\r
-         /*\r
-          * BasicHttpContext httpContext = new BasicHttpContext(); BasicScheme\r
-          * basicAuth = new BasicScheme();\r
-          * httpContext.setAttribute("preemptive-auth", basicAuth);\r
-          * \r
-          * HttpResponse response = getClient().execute(mHost, query,\r
-          * httpContext);\r
-          */\r
 +    \r
 +    \r
 +    /* method called by ContactSyncAdapter, that is never used */\r
 +    protected HttpResponse fireRawRequest(HttpRequest query)\r
 +            throws ClientProtocolException, OperationCanceledException,\r
 +            AuthenticatorException, IOException {\r
-     /* methods never used  below */\r
-     /*\r
-     public Date getLastUpdated() {\r
-         return lastUpdated;\r
-     }\r
\r
-     public void setLastUpdated(Date lastUpdated) {\r
-         this.lastUpdated = lastUpdated;\r
-     }\r
\r
-     protected ConnectionKeepAliveStrategy getKeepAliveStrategy() {\r
-         return new ConnectionKeepAliveStrategy() {\r
-             public long getKeepAliveDuration(HttpResponse response,\r
-                     HttpContext context) {\r
-                 // Change keep alive straategy basing on response: ie\r
-                 // forbidden/not found/etc\r
-                 // should have keep alive 0\r
-                 // default return: 5s\r
-                 int statusCode = response.getStatusLine().getStatusCode();\r
\r
-                 // HTTP 400, 500 Errors as well as HTTP 118 - Connection timed\r
-                 // out\r
-                 if ((statusCode >= 400 && statusCode <= 418)\r
-                         || (statusCode >= 421 && statusCode <= 426)\r
-                         || (statusCode >= 500 && statusCode <= 510)\r
-                         || statusCode == 118) {\r
-                     return 0;\r
-                 }\r
\r
-                 return 5 * 1000;\r
-             }\r
-         };\r
-     }\r
-      */\r
 +        return null;\r
 +    }\r
 +\r
  }
@@@ -27,9 -27,10 +27,9 @@@ import java.util.Map
  import org.apache.jackrabbit.webdav.DavException;
  
  import com.owncloud.android.Log_OC;
+ import com.owncloud.android.MainApp;
  import com.owncloud.android.R;
- import com.owncloud.android.authentication.AccountAuthenticator;
  import com.owncloud.android.authentication.AuthenticatorActivity;
 -import com.owncloud.android.datamodel.DataStorageManager;
  import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.operations.RemoteOperationResult;
@@@ -259,17 -216,17 +259,17 @@@ public class FileSyncAdapter extends Ab
              if (synchFolderOp.getForgottenLocalFiles().size() > 0) {
                  mForgottenLocalFiles.putAll(synchFolderOp.getForgottenLocalFiles());
              }
 -            // synchronize children folders 
 -            List<OCFile> children = synchFolderOp.getChildren();
 -            fetchChildren(children);    // beware of the 'hidden' recursion here!
 -            
 -            sendStickyBroadcast(true, remotePath, null);
 +            if (result.isSuccess()) {
 +                // synchronize children folders 
 +                List<OCFile> children = synchFolderOp.getChildren();
 +                fetchChildren(folder, children, synchFolderOp.getRemoteFolderChanged());    // beware of the 'hidden' recursion here!
 +            }
              
          } else {
 +            // in failures, the statistics for the global result are updated
              if (result.getCode() == RemoteOperationResult.ResultCode.UNAUTHORIZED ||
 -                   // (result.isTemporalRedirection() && result.isIdPRedirection() &&
                      ( result.isIdPRedirection() && 
-                             AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(getClient().getAuthTokenType()))) {
+                             MainApp.getAuthTokenTypeSamlSessionCookie().equals(getClient().getAuthTokenType()))) {
                  mSyncResult.stats.numAuthExceptions++;
                  
              } else if (result.getException() instanceof DavException) {
@@@ -58,8 -58,9 +58,8 @@@ import com.actionbarsherlock.view.MenuI
  import com.actionbarsherlock.view.MenuItem;
  import com.actionbarsherlock.view.Window;
  import com.owncloud.android.Log_OC;
+ import com.owncloud.android.MainApp;
  import com.owncloud.android.R;
- import com.owncloud.android.authentication.AccountAuthenticator;
 -import com.owncloud.android.datamodel.DataStorageManager;
  import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.files.services.FileDownloader;
@@@ -86,7 -86,7 +86,6 @@@ import com.owncloud.android.ui.fragment
  import com.owncloud.android.ui.fragment.FileFragment;
  import com.owncloud.android.ui.fragment.OCFileListFragment;
  import com.owncloud.android.ui.preview.PreviewImageActivity;
--import com.owncloud.android.ui.preview.PreviewImageFragment;
  import com.owncloud.android.ui.preview.PreviewMediaFragment;
  import com.owncloud.android.ui.preview.PreviewVideoActivity;
  
@@@ -140,7 -139,8 +139,9 @@@ OCFileListFragment.ContainerActivity, F
      private OCFile mWaitingToPreview;
      private Handler mHandler;
      
 +    private boolean mSyncInProgress = false;
+     private String mDownloadAddedMessage;
+     private String mDownloadFinishMessage;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          // Action bar setup
          mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);
          getSupportActionBar().setHomeButtonEnabled(true);       // mandatory since Android ICS, according to the official documentation
 -        setSupportProgressBarIndeterminateVisibility(false);    // always AFTER setContentView(...) ; to work around bug in its implementation
 +        setSupportProgressBarIndeterminateVisibility(mSyncInProgress);    // always AFTER setContentView(...) ; to work around bug in its implementation        
          
+         
+         
          Log_OC.d(TAG, "onCreate() end");
      }