From e16142e3b5700714c8a2d95782294ff2e754827f Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Sat, 19 Jul 2014 00:16:21 +0200 Subject: [PATCH] Add icons and logic for when a post gets deleted --- .../java/org/floens/chan/core/model/Post.java | 1 + .../chan/core/net/ChanReaderRequest.java | 91 ++++++++++++++++-- .../chan/core/net/JsonReaderRequest.java | 2 +- .../org/floens/chan/ui/view/PostView.java | 9 +- .../java/org/floens/chan/utils/IconCache.java | 16 +-- .../main/res/drawable-mdpi/closed_icon.png | Bin 394 -> 468 bytes .../main/res/drawable-mdpi/sticky_icon.png | Bin 587 -> 692 bytes .../src/main/res/drawable-mdpi/trash_icon.png | Bin 0 -> 348 bytes 8 files changed, 96 insertions(+), 23 deletions(-) create mode 100644 Clover/app/src/main/res/drawable-mdpi/trash_icon.png diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java index 11218985..7eaffa87 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Post.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Post.java @@ -77,6 +77,7 @@ public class Post { public String title = ""; public int fileSize; public int images = -1; + public boolean deleted = false; /** * This post replies to the these ids diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java b/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java index 4c6e6806..b140e99e 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java @@ -32,7 +32,9 @@ import org.floens.chan.core.model.Post; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class ChanReaderRequest extends JsonReaderRequest> { private Loadable loadable; @@ -82,25 +84,94 @@ public class ChanReaderRequest extends JsonReaderRequest> { throw new IllegalArgumentException("Unknown mode"); } - processPosts(list); - - return list; + List result = null; + try { + result = processPosts(list); + } catch (IOException e) { + setError(new ParseError(e)); + } + return result; } - private void processPosts(List posts) { + private List processPosts(List serverList) throws IOException { boolean anonymize = ChanPreferences.getAnonymize(); boolean anonymizeIds = ChanPreferences.getAnonymizeIds(); String name = ChanApplication.getInstance().getString(R.string.default_name); - for (Post post : posts) { - post.repliesFrom.clear(); + List totalList = new ArrayList<>(serverList.size()); + + if (cached.size() > 0) { + totalList.addAll(cached); + + // If there's a cached post but it's not in the list received from the server, mark it as deleted + boolean serverHas; + for (Post cache : cached) { + serverHas = false; + for (Post b : serverList) { + if (b.no == cache.no) { + serverHas = true; + break; + } + } + + if (!serverHas) + cache.deleted = true; + } + + // If there's a post in the list from the server, that's not in the cached list, add it. + boolean known; + for (Post post : serverList) { + known = false; + + for (Post cache : cached) { + if (cache.no == post.no) { + known = true; + break; + } + } + + // serverPost is not in finalList + if (!known) { + totalList.add(post); + } + } + } else { + totalList.addAll(serverList); + } + + Set invalidatedPosts = new HashSet<>(); + for (Post post : totalList) { + if (!post.deleted) { + post.repliesFrom.clear(); - for (Post other : posts) { - if (other.repliesTo.contains(post.no)) { - post.repliesFrom.add(other.no); + for (Post other : totalList) { + if (other.repliesTo.contains(post.no) && !other.deleted) { + post.repliesFrom.add(other.no); + } } + } else { + post.repliesTo.clear(); + + for (int no : post.repliesFrom) { + invalidatedPosts.add(no); + } + + post.repliesFrom.clear(); } + } + + for (int no : invalidatedPosts) { + for (Post post : totalList) { + if (post.no == no) { + if (!post.finish(loadable)) { + throw new IOException("Incorrect data about post received."); + } + break; + } + } + } + for (Post post : totalList) { post.isSavedReply = ChanApplication.getDatabaseManager().isSavedReply(post.board, post.no); if (anonymize) { @@ -113,6 +184,8 @@ public class ChanReaderRequest extends JsonReaderRequest> { post.id = ""; } } + + return totalList; } private List loadThread(JsonReader reader) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java b/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java index c0090205..0cc1e970 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java @@ -67,7 +67,7 @@ public abstract class JsonReaderRequest extends Request { e.printStackTrace(); } - if (read == null) { + if (read == null && error == null) { return Response.error(new VolleyError()); } else if (error != null) { return Response.error(error); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java index 7e5bc7ee..74fde222 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/PostView.java @@ -80,6 +80,7 @@ public class PostView extends LinearLayout implements View.OnClickListener { private LinearLayout iconsView; private ImageView stickyView; private ImageView closedView; + private ImageView deletedView; private NetworkImageView countryView; private ImageView optionsView; private View lastSeen; @@ -241,11 +242,13 @@ public class PostView extends LinearLayout implements View.OnClickListener { boolean showCountryFlag = isList() && !TextUtils.isEmpty(post.country); boolean showStickyIcon = isList() && post.sticky; boolean showClosedIcon = isList() && post.closed; + boolean showDeletedIcon = isList() && post.deleted; - iconsView.setVisibility((showCountryFlag || showStickyIcon || showClosedIcon) ? View.VISIBLE : View.GONE); + iconsView.setVisibility((showCountryFlag || showStickyIcon || showClosedIcon || showDeletedIcon) ? View.VISIBLE : View.GONE); stickyView.setVisibility(showStickyIcon ? View.VISIBLE : View.GONE); closedView.setVisibility(showClosedIcon ? View.VISIBLE : View.GONE); + deletedView.setVisibility(showDeletedIcon ? View.VISIBLE : View.GONE); if (showCountryFlag) { countryView.setVisibility(View.VISIBLE); countryView.setImageUrl(ChanUrls.getCountryFlagUrl(post.country), ChanApplication.getImageLoader()); @@ -422,6 +425,10 @@ public class PostView extends LinearLayout implements View.OnClickListener { closedView.setImageBitmap(IconCache.closedIcon); iconsView.addView(closedView, new LinearLayout.LayoutParams(iconWidth, iconHeight)); + deletedView = new ImageView(context); + deletedView.setImageBitmap(IconCache.trashIcon); + iconsView.addView(deletedView, new LinearLayout.LayoutParams(iconWidth, iconHeight)); + countryView = new NetworkImageView(context); countryView.setScaleType(ImageView.ScaleType.FIT_CENTER); iconsView.addView(countryView, new LinearLayout.LayoutParams(iconWidth, iconHeight)); diff --git a/Clover/app/src/main/java/org/floens/chan/utils/IconCache.java b/Clover/app/src/main/java/org/floens/chan/utils/IconCache.java index e6530d2a..57189ec0 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/IconCache.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/IconCache.java @@ -26,19 +26,11 @@ import org.floens.chan.R; public class IconCache { public static Bitmap stickyIcon; public static Bitmap closedIcon; + public static Bitmap trashIcon; - /** - * Load the icons in the cache. Lightweight icons only! Icons can be null! - * - * @param context - */ public static void createIcons(final Context context) { - new Thread(new Runnable() { - @Override - public void run() { - stickyIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.sticky_icon); - closedIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.closed_icon); - } - }).start(); + stickyIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.sticky_icon); + closedIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.closed_icon); + trashIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.trash_icon); } } diff --git a/Clover/app/src/main/res/drawable-mdpi/closed_icon.png b/Clover/app/src/main/res/drawable-mdpi/closed_icon.png index 565fc9384f2bd6c396106a3ab585b46c46d1010a..d9939afcfa26895d98eecb3422228d0cfb14a785 100644 GIT binary patch delta 441 zcmeBTzQU~78Q|y6%O%Cdz`(%k>ERLtq!mDzgAGU)S5KO}+vs zDpBGZQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPETjTMYvPqpPQjV@QPi+o_IThaDtZ zH-`iWEYz#wTK_=OrpY5yJSfYy@x`U3+=apgmoMacF6TCMTHqmev{mEi0*-?o?*v|+ z{x7CG_tvDOMQ5Ay4eKZW{Qo_{$k=URW$LW7Jsd&XYl%!N9+&&9co`3*94=5Kwp>q_*&LrMqMv){0kIijp{n#oas zq3^UPe}U{no9mW+%oci~whCrd8x^^Yxeq)xuldc?oOtMPanolDzw6xfjivuN*M%I) zRA-5H*AtN5TO{1jmQ!+#?^wpYnug}rRYj_)FFL&^G^5#1Bim9KR5)ZoyO7At| f-;iX~ldpNKYVj-nr8nLJ!=1s?)z4*}Q$iB}6aBE{ delta 366 zcmV-!0g?XH1BwG7iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyxe-6U{ z01m?e$8V@)0000QbVXQnQ*UN;cVTj608n9RZgehAMN}YmGcGkQF)>H;LN@>a0QpHo zK~y+TW1tCGxNzZrY#1tyAAl6TdGqG~(W6J`7PS_Bb=6m<O9Ny0Qkh2Q`rM$i=$86cK=f8qbCRjd9#d-e=WOQoOr4-x}m5E~?R@Zdo(Et+`- z(-4qCkpFK#c=i9n?N|R#-FWr?;3Wv&apvX!Rfk^upSAPF|K_bP{|n?D#clvdBS=x} znrC2KvgGmqhk diff --git a/Clover/app/src/main/res/drawable-mdpi/sticky_icon.png b/Clover/app/src/main/res/drawable-mdpi/sticky_icon.png index c6eabaf2c103b3b0ae8aeed94968b3e478d6f7d5..9fe9f8b2e43a86baa4b07950ae78ca470e8238cd 100644 GIT binary patch delta 666 zcmV;L0%iTn1hfSqiBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPae-d;6 z01|Wo-ewDvmn?Y_TqEF@56cC?(4&`)jI7LUNYkD zxA5iFi?9NRlxarp%&vg`_7@yG_YC;4`bBtweex6|fzc&UXMR9BYjK^K27bKu5nkZn z=}AVqv~O@KX$g&ghmq%&{XOHruhlNX3bb_TjKm)=z<|C8orydgAF}k_e_w>*8Ov_Z zBjC?ep1K!sNGVpzUe5!FPZb6iT%A|~DfR_ABA>y1?O)#HS8(=>0UuL7rG}Hb7jVfs zBiF}FNN0b-y;m!6mkT{y04e$j+6L#LxqA|t+_y{OW6DQZfvs(~7`c?rLm*|s#N2PV z@pKu^r%mXL8gTf^M{sy_f3P393H;grkMIJ;Y-t~1q`CJEND%`fPnO|C+yK|W2WYwY z9yYcnfIm}tgcm5rel*F5<7^h3!8wqJ^RTP$9qb6?V3TtQ`1R@|ynx)RF|xVvLy<=B zEEESy>O3?R*2wyugTSv>A7KSFO=H9~O*rXIK*NDJ*t=iAHsv*JaB!!9U#~vG3aF~e zh+!BIi^YI%|INBRQAQd%Mq%yt%fPoQkFWy4V33hqE(hUo82EPCtZ57}!apmIumV1x zkC99!1Af0B_;&pxynv!8jL5PKe0lXEwt&s{2Y1>&sc|D5S^xk507*qoM6N<$f@Lu= A`2YX_ delta 561 zcmV-10?z%k1iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyxe-6U{ z01m?e$8V@)0000QbVXQnQ*UN;cVTj608n9RZgehAMN}YmGcGkQF)>H;LN@>a0lG;< zK~y+TosjKIQvnpl_iqG!h`=uuvovB5mM^`nL5Vs1a79pth+Y}j2AgFOYfdEOwzfG) z+f|Egqzse?^1vU-&ih1;W@%4?J)Voae_m$B?V4@6BVqKhIv9 zpRP%>3@vP-e)`3&J8$xbToR{n4X-25Z4+JG#?m&MALMH5Bu&a1jo~#s;~NaV-QaS| zcy5r2CY9iHl1?>6T_{0qZ-S1ODf;J9l-foQLrg-1eV5xt2u>w=G_j5lfA~&~Zx!p~ zUE9MyFt?2T4X}tRPsa50oj-Z;ev9X6dtN0G{3}%TEK|}vNwIa{zovC`p!)O9m zL}y}Yho`SMxf|7~^K0Db{)Wk>V!YXx`R>!zgOs#?MDS_&W;Ur0YFIkIQt{vmC$EQc zdz!H_jOq3wX7>_ee}ao0f1f$;igU``n;SrES13%cT4Z1N6BOiSiqrM+3q9EZilU(F zIt}&^1y_O?o8NI(`oIZmBzstvWi(AA5C|L$A1m`yP&3TYb6uGMZnv9wJdW4vJv4Zv z$dftja5#v?VmO`7>}&o@k|ZID;{SyW2E%Wh@DHmTMo;Mg0000<2SrXqu0mjf+_3na diff --git a/Clover/app/src/main/res/drawable-mdpi/trash_icon.png b/Clover/app/src/main/res/drawable-mdpi/trash_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc26e66eee44bc33ec2db8852d1be222ace866d5 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=BdgAk26#O}+vsC{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QB zXPETjTMbanSx*