From e6c1454458419ff0c47c64fac3d11ebc158cccc8 Mon Sep 17 00:00:00 2001 From: "David A. Velasco" Date: Thu, 20 Aug 2015 10:44:19 +0200 Subject: [PATCH] Persist conflicts in local database and show with an icon in the list of files --- res/drawable/conflict_file_indicator.png | Bin 0 -> 2643 bytes .../android/datamodel/FileDataStorageManager.java | 35 +++++++++++++- src/com/owncloud/android/datamodel/OCFile.java | 17 +++++-- src/com/owncloud/android/db/ProviderMeta.java | 5 +- .../android/operations/RefreshFolderOperation.java | 47 ++++++++++--------- .../operations/SynchronizeFileOperation.java | 8 +--- .../operations/SynchronizeFolderOperation.java | 51 +++++++++++---------- .../android/providers/FileContentProvider.java | 23 +++++++++- .../android/ui/adapter/FileListListAdapter.java | 4 ++ 9 files changed, 130 insertions(+), 60 deletions(-) create mode 100644 res/drawable/conflict_file_indicator.png diff --git a/res/drawable/conflict_file_indicator.png b/res/drawable/conflict_file_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..fd580caf2077b87e03f356506a54d3d4e981f58c GIT binary patch literal 2643 zcmcIm`8U)J7ypi7W)KyMvOXBHh9^>%u{{_JB3Y8GF^{!o#KSN{sO(1eH6|K8wo1r0 zktN$?q9SJOLiQmBdG-GC{sr&3pL;*&e$GAj-21~l=RUT!G~wYo&jkPg57N}g=9me; z9R@j$9lCCP#{_XVH!%W^ep_)%dHS)!8D#2+0RZ0jza5mJz$<(#La|8HUr+{&9V#nw z6E5L#EQzA8J75h1{r$ZHu*WF?7~b=8!+Lp2grKoL5++ELwWqQd^tfL=(n$Y$=-5hr zgkQ#pXm?w=lK-NxB&stbOTJ{-?&ENYqL8{o{~}IQS;|s6#^-GLb9}!M=Px&B3u}+e z&U!h%&UZnR(?(cZXNn+&O(AJc^x*}G>Suc4-@YxpLJV#_QLt&YYE<%xESe>?{G8Wa zXr%t!*IvkH>=j6zi*pnDA2w#XN8#Uf2_i^G;!F5;#wAl5m)>A2(=o|Kg0ys<*235T zfbbjIGN@IMJ~W`&5sl;8%~S7fYbhV;B8$wzZqvev_szx_{C8Bqo|d~fWQV~JUW#m{ zq(n;=r4{PX-aVkvTWD!gCT&l$WVhEYZm%e0WSV&wDS3ID)9})Vb~Gqas&p|LS&xw6Ll zq@HjMtVivPWx*~uYK0x7=)?|(Pe>iq&W&T-W{e4d0~hn^VBlgXdP0ZFMsr9nVOa$;*{UTYuI#+D32WpYPvTVSUg( zU5FPWA_-a+js53b*@3`T&WQakep1aT7hIY^E64@B%25XV+5U9gjgs(_0={*bvN?B6 zC!@^y&U-4TP$G@6znUOx+!jfW_T%LUDHyipOIEoLUf=B7D2l0-gou zp?wGy70k}>6T-Tz9+Mx@lm5lp1FT5nQwM_UEi6sQb8?iZ7VtOf_aGMl1^admLA`6& z!rZmDEU*i0P=U^Wx3cv32+LLG3?O72l#~QeI}ZyqxW4EALBv%@d{$(5Flyc%O*D^Y zMeMg8Cgq+-FI`8D!O<0%RqGQQ)mhkTlH$l`)@&NKaovC%5{Ps{zx29)a0I9bJBY@) z92UF@C|Db%=5n0Wg?V(d?(U5@ex&oRyC#OQf|(#9GIU8!NJG(uzs6OcIZRfYQwxmw zlMo+dqyh?6v-s!(p6ofj%kp(-I?F4b?7k6;77KS3^4y$vdJXGJd3bOTiUGG$)7axt zwX5oeH@;p`*o9*y>wuHyh0e~gATB@e8##eoK&VkAgsAmuZ$aU|8j#<@F${`fU%6!DV6+=`(anuyh$3trlP*iJ1u z;wPS$9=WnWT!dXjH}E`lstOOb8* zvdpX7l#|ZcRt=T*1<&UoP8P|3lRiA@Abj4HjHw!$?Zxq1!ww$ngiq%BPIGvdS*569 zTR{N{>AgI|v|)DJvR#jiOqK=7w|YCOgvCm()ek*Lq9CI3Eb98t7qe$~?yN+*AO^>q ztv()b35mZNEC)HfWj1vO51NQ1BuwRFCRdx>Hr$KO&ezU)Oq}AtJwWA6ZuWgj>Ho)x zVB-GyG8p!?NpKK>i0DA&!=Su?;-wKaUqU3seQDWBBuVRyMINNGGR9-aq}<`SbH(oN~cHu#5EMKkqrOK&}sb^WP9dX0OtCo`qD&>p? zXq5|(l{U!BYhyW-IphPm7iKRRrE%immz!&vlN0W2fb-H4NzRs(CUyAs=&9i|{Re|K zmdV33N&ivF%A2wgEHcATLfOua=3kF=bZmkTEcYf$-XZX(!^sVOkVg)+?OFLEZNjEE zGM`va-$o)BlaCXM#=l^kwD^#U&Pb9OGN?? zqPht;oNh*x%oE{3RGr9$WbBup1KCp@?M)#jpFU_2nh3Pjt9Z=y`NUNCq9U>_of)n# z4o|l^Wr{-C7(RF%ygW4LdF2YNSYNlw`r6c|o|mr<_amVjImCI>zhAaQtn@G<{S*%_nZ(Ra26VI`Fyw`X$1uBJjXX|4be=K4aoL}9N>rgrI e|3{)Y> { private boolean mIsDownloading; + private boolean mInConflict; + /** * Create new {@link OCFile} with given path. @@ -115,8 +117,9 @@ public class OCFile implements Parcelable, Comparable { mPublicLink = source.readString(); mPermissions = source.readString(); mRemoteId = source.readString(); - mNeedsUpdateThumbnail = source.readInt() == 0; - mIsDownloading = source.readInt() == 0; + mNeedsUpdateThumbnail = source.readInt() == 1; + mIsDownloading = source.readInt() == 1; + mInConflict = source.readInt() == 1; } @@ -142,6 +145,7 @@ public class OCFile implements Parcelable, Comparable { dest.writeString(mRemoteId); dest.writeInt(mNeedsUpdateThumbnail ? 1 : 0); dest.writeInt(mIsDownloading ? 1 : 0); + dest.writeInt(mInConflict ? 1 : 0); } /** @@ -357,6 +361,7 @@ public class OCFile implements Parcelable, Comparable { mRemoteId = null; mNeedsUpdateThumbnail = false; mIsDownloading = false; + mInConflict = false; } /** @@ -597,9 +602,11 @@ public class OCFile implements Parcelable, Comparable { this.mIsDownloading = isDownloading; } - public boolean isSynchronizing() { - // TODO real implementation - return false; + public boolean isInConflict() { + return mInConflict; } + public void setInConflict(boolean inConflict) { + mInConflict = inConflict; + } } diff --git a/src/com/owncloud/android/db/ProviderMeta.java b/src/com/owncloud/android/db/ProviderMeta.java index 25e8fbd1..7db74f05 100644 --- a/src/com/owncloud/android/db/ProviderMeta.java +++ b/src/com/owncloud/android/db/ProviderMeta.java @@ -31,7 +31,7 @@ import com.owncloud.android.MainApp; public class ProviderMeta { public static final String DB_NAME = "filelist"; - public static final int DB_VERSION = 10; + public static final int DB_VERSION = 11; private ProviderMeta() { } @@ -72,6 +72,7 @@ public class ProviderMeta { public static final String FILE_REMOTE_ID = "remote_id"; public static final String FILE_UPDATE_THUMBNAIL = "update_thumbnail"; public static final String FILE_IS_DOWNLOADING= "is_downloading"; + public static final String FILE_IN_CONFLICT = "in_conflict"; public static final String FILE_DEFAULT_SORT_ORDER = FILE_NAME + " collate nocase asc"; @@ -94,7 +95,7 @@ public class ProviderMeta { public static final String OCSHARES_DEFAULT_SORT_ORDER = OCSHARES_FILE_SOURCE + " collate nocase asc"; - + } } diff --git a/src/com/owncloud/android/operations/RefreshFolderOperation.java b/src/com/owncloud/android/operations/RefreshFolderOperation.java index f0ba3d51..cf5bccd6 100644 --- a/src/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/src/com/owncloud/android/operations/RefreshFolderOperation.java @@ -354,50 +354,55 @@ public class RefreshFolderOperation extends RemoteOperation { } // loop to update every child - OCFile remoteFile = null, localFile = null; + OCFile remoteFile = null, localFile = null, updatedFile = null; + RemoteFile r; for (int i=1; i mLocalFile.getLastSyncDateForData() ); - Log_OC.d(TAG, "TOKENs checked to SYNC " + mRemotePath ); - Log_OC.d(TAG, " server#modificationTimestamp " + mServerFile.getModificationTimestamp()); - Log_OC.d(TAG, " local#modificationTimestampAtLastSyncForData " + mServerFile.getModificationTimestampAtLastSyncForData()); - Log_OC.d(TAG, " local#modificationTimestamp " + mLocalFile.getLocalModificationTimestamp()); - Log_OC.d(TAG, " local#lastSyncDateForData " + mLocalFile.getLastSyncDateForData()); - /// decide action to perform depending upon changes //if (!mLocalFile.getEtag().isEmpty() && localChanged && serverChanged) { if (localChanged && serverChanged) { result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT); + getStorageManager().saveConflict(mLocalFile.getFileId(), true); } else if (localChanged) { if (mSyncFileContents && mAllowUploads) { @@ -257,6 +252,7 @@ public class SynchronizeFileOperation extends SyncOperation { mServerFile.setLastSyncDateForData(mLocalFile.getLastSyncDateForData()); mServerFile.setStoragePath(mLocalFile.getStoragePath()); mServerFile.setParentId(mLocalFile.getParentId()); + mServerFile.setEtag(mLocalFile.getEtag()); getStorageManager().saveFile(mServerFile); } diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index 82ce3132..05962324 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -302,47 +302,52 @@ public class SynchronizeFolderOperation extends SyncOperation { } // loop to synchronize every child - OCFile remoteFile = null, localFile = null; + OCFile remoteFile = null, localFile = null, updatedFile = null; + RemoteFile r; for (int i=1; i= 11) { + Log_OC.i("SQL", "Entering in the #11 ADD in onUpgrade"); + db.beginTransaction(); + try { + db .execSQL("ALTER TABLE " + ProviderTableMeta.FILE_TABLE_NAME + + " ADD COLUMN " + ProviderTableMeta.FILE_IN_CONFLICT + " INTEGER " + + " DEFAULT 0"); + upgraded = true; + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + } + if (!upgraded) + Log_OC.i("SQL", "OUT of the ADD in onUpgrade; oldVersion == " + oldVersion + + ", newVersion == " + newVersion); + } } diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index ecd17213..2672926f 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -291,6 +291,10 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { localStateView.setImageResource(R.drawable.uploading_file_indicator); localStateView.setVisibility(View.VISIBLE); + } else if (file.isInConflict()) { // conflict + localStateView.setImageResource(R.drawable.conflict_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else if (file.isDown()) { localStateView.setImageResource(R.drawable.local_file_indicator); localStateView.setVisibility(View.VISIBLE); -- 2.11.0