Added conflict icon to folders containing files with conflicts
[pub/Android/ownCloud.git] / src / com / owncloud / android / datamodel / FileDataStorageManager.java
index ce3510d..2c513c4 100644 (file)
@@ -24,8 +24,10 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.Vector;
 
 import android.accounts.Account;
@@ -1586,27 +1588,80 @@ public class FileDataStorageManager {
 
     }
 
-    public void saveConflict(long fileId, boolean inConflict) {
+    public void saveConflict(OCFile file, boolean inConflict) {
         ContentValues cv = new ContentValues();
         cv.put(ProviderTableMeta.FILE_IN_CONFLICT, inConflict);
+        int updated = 0;
         if (getContentResolver() != null) {
-            getContentResolver().update(
+            updated = getContentResolver().update(
                     ProviderTableMeta.CONTENT_URI_FILE,
                     cv,
                     ProviderTableMeta._ID + "=?",
-                    new String[] { String.valueOf(fileId)}
+                    new String[] { String.valueOf(file.getFileId())}
             );
         } else {
             try {
-                getContentProviderClient().update(
+                updated = getContentProviderClient().update(
                         ProviderTableMeta.CONTENT_URI_FILE,
                         cv,
                         ProviderTableMeta._ID + "=?",
-                        new String[]{String.valueOf(fileId)}
+                        new String[]{String.valueOf(file.getFileId())}
                 );
             } catch (RemoteException e) {
                 Log_OC.e(TAG, "Failed saving conflict in database " + e.getMessage());
             }
         }
+
+        Log_OC.d(TAG, "Number of files updated with CONFLICT: " + updated);
+
+        if (updated > 0) {
+            if (inConflict) {
+                /// set conflict in all ancestor folders
+
+                long parentId = file.getParentId();
+                Set<String> ancestorIds = new HashSet<String>();
+                while (parentId != FileDataStorageManager.ROOT_PARENT_ID) {
+                    ancestorIds.add(Long.toString(parentId));
+                    parentId = getFileById(parentId).getParentId();
+                }
+
+                if (ancestorIds.size() > 0) {
+                    StringBuffer whereBuffer = new StringBuffer();
+                    whereBuffer.append(ProviderTableMeta._ID).append(" IN (");
+                    for (int i = 0; i < ancestorIds.size() - 1; i++) {
+                        whereBuffer.append("?,");
+                    }
+                    whereBuffer.append("?");
+                    whereBuffer.append(")");
+
+                    if (getContentResolver() != null) {
+                        updated = getContentResolver().update(
+                                ProviderTableMeta.CONTENT_URI_FILE,
+                                cv,
+                                whereBuffer.toString(),
+                                ancestorIds.toArray(new String[]{})
+                        );
+                    } else {
+                        try {
+                            updated = getContentProviderClient().update(
+                                    ProviderTableMeta.CONTENT_URI_FILE,
+                                    cv,
+                                    whereBuffer.toString(),
+                                    ancestorIds.toArray(new String[]{})
+                            );
+                        } catch (RemoteException e) {
+                            Log_OC.e(TAG, "Failed saving conflict in database " + e.getMessage());
+                        }
+                    }
+                } // else file is ROOT folder, no parent to set in conflict
+
+            } else {
+                /// TODO update conflict in ancestor folders
+                // (not directly unset; maybe there are more conflicts below them)
+            }
+        }
+
+        Log_OC.d(TAG, "Number of parents updated with CONFLICT: " + updated);
+
     }
 }