Added conflict icon to folders containing files with conflicts
authorDavid A. Velasco <dvelasco@solidgear.es>
Fri, 21 Aug 2015 08:36:42 +0000 (10:36 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Fri, 25 Sep 2015 13:13:47 +0000 (15:13 +0200)
src/com/owncloud/android/datamodel/FileDataStorageManager.java
src/com/owncloud/android/operations/SynchronizeFileOperation.java
src/com/owncloud/android/ui/adapter/FileListListAdapter.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);
+
     }
 }
index 045f9b2..1998181 100644 (file)
@@ -222,7 +222,7 @@ public class SynchronizeFileOperation extends SyncOperation {
                 //if (!mLocalFile.getEtag().isEmpty() && localChanged && serverChanged) {
                 if (localChanged && serverChanged) {
                     result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);
-                    getStorageManager().saveConflict(mLocalFile.getFileId(), true);
+                    getStorageManager().saveConflict(mLocalFile, true);
 
                 } else if (localChanged) {
                     if (mSyncFileContents && mAllowUploads) {
index 2672926..5a68c5b 100644 (file)
@@ -254,23 +254,7 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
 \r
                     localStateView.setVisibility(View.INVISIBLE);   // default first\r
 \r
-                    if (file.isFolder()) {\r
-                        if (    //synchronizing\r
-                                (opsBinder != null &&\r
-                                        opsBinder.isSynchronizing(mAccount, file.getRemotePath())) ||\r
-                                // downloading\r
-                                (downloaderBinder != null &&\r
-                                        downloaderBinder.isDownloading(mAccount, file)) ||\r
-                                // uploading\r
-                                (uploaderBinder != null &&\r
-                                        uploaderBinder.isUploading(mAccount, file))\r
-                                ) {\r
-\r
-                            localStateView.setImageResource(R.drawable.synchronizing_file_indicator);\r
-                            localStateView.setVisibility(View.VISIBLE);\r
-                        }\r
-\r
-                    } else if ( //synchronizing\r
+                    if ( //synchronizing\r
                                 opsBinder != null &&\r
                                 opsBinder.isSynchronizing(mAccount, file.getRemotePath())\r
                             ) {\r
@@ -281,14 +265,22 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter {
                                 downloaderBinder != null &&\r
                                 downloaderBinder.isDownloading(mAccount, file)\r
                             ) {\r
-                        localStateView.setImageResource(R.drawable.downloading_file_indicator);\r
+                        localStateView.setImageResource(\r
+                                file.isFolder() ?\r
+                                        R.drawable.synchronizing_file_indicator :\r
+                                        R.drawable.downloading_file_indicator\r
+                        );\r
                         localStateView.setVisibility(View.VISIBLE);\r
 \r
-                    } else if (//uploading\r
+                    } else if ( //uploading\r
                                 uploaderBinder != null &&\r
                                 uploaderBinder.isUploading(mAccount, file)\r
                             ) {\r
-                        localStateView.setImageResource(R.drawable.uploading_file_indicator);\r
+                        localStateView.setImageResource(\r
+                                file.isFolder() ?\r
+                                        R.drawable.synchronizing_file_indicator :\r
+                                        R.drawable.uploading_file_indicator\r
+                        );\r
                         localStateView.setVisibility(View.VISIBLE);\r
 \r
                     } else if (file.isInConflict()) {   // conflict\r