From 1ebc89d0b405f54cd275b8e2bd4e7bde6cfb121d Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Sat, 12 Apr 2014 17:13:17 +0000 Subject: [PATCH] added avatar replacement image if user has no avatar git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portlets/user/news-feed@94797 82a268e6-3cf1-43bd-a215-b396298e98cf --- distro/changelog.xml | 1 + .../newsfeed/client/panels/NewsFeedPanel.java | 6 ++ .../newsfeed/client/ui/AvatarReplacement.java | 67 +++++++++++++++++++ .../client/ui/AvatarReplacement.ui.xml | 23 +++++++ .../newsfeed/client/ui/TweetTemplate.java | 38 ++++++++--- .../newsfeed/client/ui/TweetTemplate.ui.xml | 5 +- .../user/newsfeed/server/NewsServiceImpl.java | 4 +- 7 files changed, 132 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.java create mode 100644 src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.ui.xml diff --git a/distro/changelog.xml b/distro/changelog.xml index 1a3ede4..cbea452 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -6,6 +6,7 @@ Added possibility to unlike alread liked posts Added possibility to mention users in comments Added default comment inputbox at the bottom of feed comments, if any + Added avatar replacement if user has no avatar Fixed double notifications for post owner who commented his post Fixed double notifications for post owner who liked his post diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java index e97cbc3..72f7bac 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/panels/NewsFeedPanel.java @@ -55,6 +55,7 @@ import org.gcube.portlets.widgets.userselection.shared.ItemSelectableBean; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; +import java.util.HashMap; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.shared.HandlerManager; @@ -101,6 +102,11 @@ public class NewsFeedPanel extends Composite { private static final String warning = GWT.getModuleBaseURL() + "../images/warning_blue.png"; private static final String spacer = GWT.getModuleBaseURL() + "../images/feeds-spacer.gif"; public static final String loading = GWT.getModuleBaseURL() + "../images/feeds-loader.gif"; + /** + * since we want to maintain the color assigned to an avatar replacement through all the session + * this hashmap maintain the assigned users color, chosen reandomly at the beginning + */ + public static final HashMap avatarReplacementAssignedColors = new HashMap(); public static final String GET_OID_PARAMETER = "oid"; diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.java new file mode 100644 index 0000000..94db3cd --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.java @@ -0,0 +1,67 @@ +package org.gcube.portlets.user.newsfeed.client.ui; + +import org.gcube.portlets.user.newsfeed.client.panels.NewsFeedPanel; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Random; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.Widget; + +public class AvatarReplacement extends Composite { + + private static NoAvatarUiBinder uiBinder = GWT + .create(NoAvatarUiBinder.class); + + interface NoAvatarUiBinder extends UiBinder { + } + + @UiField HTML avatarBox; + /** + * the random colors + */ + private String[] randomColors = { + "#8e8e93", + "#ff2d55", + "#ff3b30", + "#ff9500", + "#ffcc00", + "#4cd964", + "#5ac8fa", + "#34aadc", + "#007aff", + "#5856d6" + }; + + + public AvatarReplacement() { + initWidget(uiBinder.createAndBindUi(this)); + } + + public void setInitials(String username, String firstName, String lastName) { + pickRandomColor(username); + String first = "A"; + if (firstName != null && firstName.trim().length() > 0) + first = firstName.trim().substring(0, 1); + String second = "Z"; + if (lastName != null && lastName.trim().length() > 0) + second = lastName.trim().substring(0, 1); + avatarBox.setText(first+second); + } + /** + * randomize of does not find it, else color is maintained through all the session + * @param username + */ + private void pickRandomColor(String username) { + if (! NewsFeedPanel.avatarReplacementAssignedColors.containsKey(username)) { + String randomColor = randomColors[Random.nextInt(randomColors.length)]; + avatarBox.getElement().getStyle().setBackgroundColor(randomColor); + NewsFeedPanel.avatarReplacementAssignedColors.put(username, randomColor); + } else + avatarBox.getElement().getStyle().setBackgroundColor(NewsFeedPanel.avatarReplacementAssignedColors.get(username)); + } + + +} diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.ui.xml b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.ui.xml new file mode 100644 index 0000000..7cc4c7e --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/AvatarReplacement.ui.xml @@ -0,0 +1,23 @@ + + + + .avatar-frame { + border: 1px solid #E6E6E6; + padding: 2px; + } + .avatar-replacement { + display: table-cell; + text-align: center; + vertical-align: middle; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-weight: 300; + font-size: 22px; + padding: 0; + color: #FFF; + } + + + + + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.java index eb7b95a..f920ede 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.java @@ -90,6 +90,8 @@ public class TweetTemplate extends Composite { @UiField Image avatarImage; @UiField + AvatarReplacement avatarReplacement; + @UiField HTMLPanel mainHTML; @UiField HTML likesNo; @@ -140,7 +142,7 @@ public class TweetTemplate extends Composite { openImage.setTitle("Open this feed separately"); //show if the user has already liked this or not setFavoritedUI(myFeed.isLiked()); - + commentArea.setHTML("" + NewsFeedPanel.COMMENT_LABEL + ""); String feedText = feed.getDescription(); @@ -149,24 +151,45 @@ public class TweetTemplate extends Composite { feedText = feedText.substring(0, MAX_SHOWTEXT_LENGTH) + "..."; seeMore.setHTML(" See More "); } - + + avatarImage.setUrl(feed.getThumbnailURL()); + avatarImage.setPixelSize(50, 50); + //replace the < & and > feedText = feedText.replaceAll("<","<").replaceAll(">",">"); feedText = feedText.replaceAll("&","&"); - + if (! isAppFeed) { messageArea.setHTML("" + NewsFeedPanel.MESSAGE_LABEL + ""); contentArea.setHTML(""+feed.getFullName()+" " + feedText); - + //show the vreid iff the info is present if (showTimelineSource && feed.getVreid() != null && feed.getVreid().compareTo("") != 0) { this.vreSource.setVisible(true); String vreName = feed.getVreid().substring(feed.getVreid().lastIndexOf("/")+1); vreSource.setHTML("[" +vreName + "]"); } + //check if the user has his own avatar + if (feed.getThumbnailURL().endsWith("img_id=0") || !feed.getThumbnailURL().contains("?")) { //it means no avatar is set + avatarImage.setVisible(false); + String f = "A"; + String s = "Z"; + if (feed.getFullName() != null) { + String[] parts = feed.getFullName().split("\\s"); + if (parts.length > 0) { + f = parts[0].toUpperCase(); + s = parts[parts.length-1].toUpperCase(); + } else { + f = feed.getFullName().substring(0,1); + s = feed.getFullName().substring(1,2); + } + } + avatarReplacement.setInitials(feed.getEntityId(), f, s); + avatarReplacement.setVisible(true); + } } else { // messageSeparator.setVisible(false); @@ -184,8 +207,7 @@ public class TweetTemplate extends Composite { } } - avatarImage.setUrl(feed.getThumbnailURL()); - avatarImage.setPixelSize(50, 50); + try { String formattedTime = DateTimeFormat.getFormat("MMMM dd, h:mm a").format(feed.getTime()); timeArea.setHTML(formattedTime); @@ -287,8 +309,8 @@ public class TweetTemplate extends Composite { likeArea.setHTML("" + NewsFeedPanel.LIKE_LABEL + ""); } } - - + + @UiHandler("likeArea") void onLikeClick(ClickEvent e) { diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.ui.xml b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.ui.xml index 94ed5db..259ca64 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.ui.xml +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/ui/TweetTemplate.ui.xml @@ -1,12 +1,13 @@ + xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:m="urn:import:org.gcube.portlets.user.newsfeed.client.ui">
+ ui:field="avatarImage" width="60" height="60"/> +
diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java b/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java index 7eb83b4..553f0c1 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/server/NewsServiceImpl.java @@ -103,7 +103,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService if (user == null) { _log.warn("USER IS NULL setting testing user and Running OUTSIDE PORTAL"); user = getDevelopmentUser(); - SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube/devsec/devVRE"); + SessionManager.getInstance().getASLSession(sessionID, user).setScope("/gcube/devNext/NextNext"); } else { withinPortal = true; @@ -116,7 +116,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService */ public String getDevelopmentUser() { String user = "test.user"; - //user = "massimiliano.assante"; +// user = "massimiliano.assante"; return user; } /**