From fbc4cd017e9453094a63f92a87951caa31d8de71 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Thu, 11 Nov 2010 21:30:31 +0100 Subject: [PATCH] Mark new posts as new. --- .../java/net/pterodactylus/sone/core/Core.java | 60 +++++++++++++++++++++- .../pterodactylus/sone/template/PostAccessor.java | 2 + src/main/resources/static/css/sone.css | 5 ++ src/main/resources/templates/include/viewPost.html | 2 +- 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/pterodactylus/sone/core/Core.java b/src/main/java/net/pterodactylus/sone/core/Core.java index f8f8948..841f560 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -113,6 +113,13 @@ public class Core implements IdentityListener { /* synchronize access on {@link #newSones}. */ private Set knownSones = new HashSet(); + /** All new posts. */ + private Set newPosts = new HashSet(); + + /** All known posts. */ + /* synchronize access on {@link #newPosts}. */ + private Set knownPosts = new HashSet(); + /** All posts. */ private Map posts = new HashMap(); @@ -405,6 +412,23 @@ public class Core implements IdentityListener { } /** + * Returns whether the given post ID is new. After this method returns it is + * marked a known post ID. + * + * @param postId + * The post ID + * @return {@code true} if the post is considered to be new, {@code false} + * otherwise + */ + public boolean isNewPost(String postId) { + synchronized (newPosts) { + boolean isNew = !knownPosts.contains(postId) && newPosts.remove(postId); + knownPosts.add(postId); + return isNew; + } + } + + /** * Returns the reply with the given ID. * * @param replyId @@ -617,8 +641,13 @@ public class Core implements IdentityListener { for (Post post : storedSone.getPosts()) { posts.remove(post.getId()); } - for (Post post : sone.getPosts()) { - posts.put(post.getId(), post); + synchronized (newPosts) { + for (Post post : sone.getPosts()) { + if (!storedSone.getPosts().contains(post) && !knownSones.contains(post.getId())) { + newPosts.add(post.getId()); + } + posts.put(post.getId(), post); + } } } synchronized (replies) { @@ -784,6 +813,11 @@ public class Core implements IdentityListener { knownSones.add(friend); } } + synchronized (newPosts) { + for (Post post : posts) { + knownPosts.add(post.getId()); + } + } } /** @@ -1043,6 +1077,19 @@ public class Core implements IdentityListener { knownSones.add(knownSoneId); } } + + /* load known posts. */ + int postCounter = 0; + while (true) { + String knownPostId = configuration.getStringValue("KnownPosts/" + postCounter++ + "/ID").getValue(null); + if (knownPostId == null) { + break; + } + synchronized (newPosts) { + knownPosts.add(knownPostId); + } + } + } /** @@ -1064,6 +1111,15 @@ public class Core implements IdentityListener { configuration.getStringValue("KnownSone/" + soneCounter + "/ID").setValue(null); } + /* save known posts. */ + int postCounter = 0; + synchronized (newPosts) { + for (String knownPostId : knownPosts) { + configuration.getStringValue("KnownPosts/" + postCounter++ + "/ID").setValue(knownPostId); + } + configuration.getStringValue("KnownPosts/" + postCounter + "/ID").setValue(null); + } + } catch (ConfigurationException ce1) { logger.log(Level.SEVERE, "Could not store configuration!", ce1); } diff --git a/src/main/java/net/pterodactylus/sone/template/PostAccessor.java b/src/main/java/net/pterodactylus/sone/template/PostAccessor.java index 2c0b59e..574eb1c 100644 --- a/src/main/java/net/pterodactylus/sone/template/PostAccessor.java +++ b/src/main/java/net/pterodactylus/sone/template/PostAccessor.java @@ -60,6 +60,8 @@ public class PostAccessor extends ReflectionAccessor { } else if (member.equals("liked")) { Sone currentSone = (Sone) dataProvider.getData("currentSone"); return (currentSone != null) && (currentSone.isLikedPostId(post.getId())); + } else if (member.equals("new")) { + return core.isNewPost(post.getId()); } return super.get(dataProvider, object, member); } diff --git a/src/main/resources/static/css/sone.css b/src/main/resources/static/css/sone.css index c23047e..7682859 100644 --- a/src/main/resources/static/css/sone.css +++ b/src/main/resources/static/css/sone.css @@ -127,6 +127,11 @@ textarea { clear: both; } +#sone .post.new { + background-color: #ffffa0; + padding-left: 1ex; +} + #sone .post.last { padding: 1ex 0px; border-bottom: none; diff --git a/src/main/resources/templates/include/viewPost.html b/src/main/resources/templates/include/viewPost.html index 58b0786..f3d4696 100644 --- a/src/main/resources/templates/include/viewPost.html +++ b/src/main/resources/templates/include/viewPost.html @@ -1,4 +1,4 @@ -
+
Avatar Image
-- 2.7.4