diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java index 79c837c..e039764 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsService.java @@ -30,7 +30,7 @@ public interface NewsService extends RemoteService { boolean deleteFeed(String feedid); - Comment comment(String feedid, String text, String feedOwnerId); + Comment comment(String feedid, String text, String feedOwnerId, boolean isAppFeed); Comment editComment(Comment toEdit); diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java index 991c9a1..10f1939 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/NewsServiceAsync.java @@ -31,7 +31,7 @@ public interface NewsServiceAsync { void getUserSettings(AsyncCallback callback); void comment(String feedid, String text, String feedOwnerId, - AsyncCallback callback); + boolean isAppFeed, AsyncCallback callback); void getAllCommentsByFeed(String feedid, AsyncCallback> callback); diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/event/ShowNewUpdatesEvent.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/ShowNewUpdatesEvent.java new file mode 100644 index 0000000..acfd66a --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/ShowNewUpdatesEvent.java @@ -0,0 +1,21 @@ +package org.gcube.portlets.user.newsfeed.client.event; + +import com.google.gwt.event.shared.GwtEvent; + + + +public class ShowNewUpdatesEvent extends GwtEvent { + public static Type TYPE = new Type(); + + public ShowNewUpdatesEvent() { } + + @Override + public Type getAssociatedType() { + return TYPE; + } + + @Override + protected void dispatch(ShowNewUpdatesEventHandler handler) { + handler.onShowNewUpdatesClick(this); + } +} diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/event/ShowNewUpdatesEventHandler.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/ShowNewUpdatesEventHandler.java new file mode 100644 index 0000000..404215d --- /dev/null +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/event/ShowNewUpdatesEventHandler.java @@ -0,0 +1,7 @@ +package org.gcube.portlets.user.newsfeed.client.event; + +import com.google.gwt.event.shared.EventHandler; + +public interface ShowNewUpdatesEventHandler extends EventHandler { + void onShowNewUpdatesClick(ShowNewUpdatesEvent event); +} 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 047ab2c..056f5b8 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 @@ -27,6 +27,8 @@ import org.gcube.portlets.user.newsfeed.client.event.SeeCommentsEvent; import org.gcube.portlets.user.newsfeed.client.event.SeeCommentsEventHandler; import org.gcube.portlets.user.newsfeed.client.event.SeeLikesEvent; import org.gcube.portlets.user.newsfeed.client.event.SeeLikesEventHandler; +import org.gcube.portlets.user.newsfeed.client.event.ShowNewUpdatesEvent; +import org.gcube.portlets.user.newsfeed.client.event.ShowNewUpdatesEventHandler; import org.gcube.portlets.user.newsfeed.client.event.StopTimerEvent; import org.gcube.portlets.user.newsfeed.client.event.StopTimerEventHandler; import org.gcube.portlets.user.newsfeed.client.panels.dialog.LikesDialog; @@ -68,6 +70,8 @@ public class NewsFeedPanel extends Composite { private HorizontalPanel filterPanel = new HorizontalPanel(); private SimplePanel newUpdatesPanel = new SimplePanel(); private VerticalPanel newsPanel = new VerticalPanel(); + + private NewFeedsAvailable newsFeedAlert; private static final String warning = GWT.getModuleBaseURL() + "../images/warning_blue.png"; private static final String spacer = GWT.getModuleBaseURL() + "../images/feeds-spacer.gif"; @@ -97,6 +101,14 @@ public class NewsFeedPanel extends Composite { * events binder */ private void bind() { + + eventBus.addHandler(ShowNewUpdatesEvent.TYPE, new ShowNewUpdatesEventHandler() { + @Override + public void onShowNewUpdatesClick(ShowNewUpdatesEvent event) { + doShowCachedNewUpdates(); + } + }); + eventBus.addHandler(StopTimerEvent.TYPE, new StopTimerEventHandler() { @Override @@ -248,7 +260,7 @@ public class NewsFeedPanel extends Composite { Date myLastUpdateTime = allUpdates.get(0).getFeed().getTime(); //this is the last update in the View - tempCacheNewUpdates = new ArrayList(); //need to reset it everytime i check (in case someone deleted the updated in the meanwhile) + tempCacheNewUpdates = new ArrayList(); //need to clear it everytime i check (in case someone deleted the updated in the meanwhile) //check if there are new updates (enter the while) and put them in a temporary cache for displaying on user click @@ -263,8 +275,14 @@ public class NewsFeedPanel extends Composite { * if they differ you got to refresh the updates to show the new number */ if (currNewUpdatesNo < i) { - newUpdatesPanel.clear(); //remove the current show update button if present - newUpdatesPanel.add(new NewFeedsAvailable(i)); + //add the current "show new updates" alert panel if not present + if (newsFeedAlert == null) { + newsFeedAlert = new NewFeedsAvailable(i, eventBus); + newUpdatesPanel.add(newsFeedAlert); + } + else //update it otherwise + newsFeedAlert.updateNewUpdatesNo(i); + currNewUpdatesNo = i; } } @@ -275,6 +293,22 @@ public class NewsFeedPanel extends Composite { } + protected void doShowCachedNewUpdates() { + newUpdatesPanel.clear(); //remove the aler panel + for (EnhancedFeed feed : tempCacheNewUpdates) { + final TweetTemplate tt = new TweetTemplate(myUserInfo, feed, eventBus, true); + newsPanel.insert(tt, 0); //insert in the view + allUpdates.add(0, feed); //insert in the model + //timer for the transition + Timer t = new Timer() { + @Override + public void run() { + tt.setcontentAreaStyle("visible"); + } + }; + t.schedule(100); + } + } /** * All Updates @@ -530,7 +564,7 @@ public class NewsFeedPanel extends Composite { } private void doAddComment(final TweetTemplate owner, String text) { - newsService.comment(owner.getFeedKey(), text, owner.getMyFeedUserId(), new AsyncCallback() { + newsService.comment(owner.getFeedKey(), text, owner.getMyFeedUserId(), owner.isAppFeed(), new AsyncCallback() { @Override public void onFailure(Throwable caught) { Window.alert("Could not deliver this comment: " + caught.getMessage()); diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.java index a17fd23..e0d5214 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.java @@ -1,11 +1,18 @@ package org.gcube.portlets.user.newsfeed.client.templates; +import org.gcube.portlets.user.newsfeed.client.event.ShowNewUpdatesEvent; + import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; public class NewFeedsAvailable extends Composite { @@ -14,12 +21,19 @@ public class NewFeedsAvailable extends Composite { .create(NewFeedsAvailableUiBinder.class); interface NewFeedsAvailableUiBinder extends + UiBinder { } + + private HandlerManager eventBus; + @UiField HTML caption; + @UiField HTMLPanel panel; - public NewFeedsAvailable(int newUpdatesNo) { + + public NewFeedsAvailable(int newUpdatesNo, HandlerManager eventBus) { initWidget(uiBinder.createAndBindUi(this)); + this.eventBus = eventBus; if (newUpdatesNo > 0) { caption.setHTML(newUpdatesNo > 1 ? "See " + newUpdatesNo + " new Updates" : "See 1 new Update"); //create the fade transition effect @@ -33,4 +47,13 @@ public class NewFeedsAvailable extends Composite { } else throw new IllegalArgumentException("newUpdatesNo must be greater than 0"); } + + public void updateNewUpdatesNo(int newUpdatesNo) { + caption.setHTML(newUpdatesNo > 1 ? "See " + newUpdatesNo + " new Updates" : "See 1 new Update"); + } + + @UiHandler("caption") + void onClick(ClickEvent e) { + eventBus.fireEvent(new ShowNewUpdatesEvent()); + } } diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.ui.xml b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.ui.xml index 1d80784..743c429 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.ui.xml +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/NewFeedsAvailable.ui.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java index 5d73b01..45d17c1 100644 --- a/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java +++ b/src/main/java/org/gcube/portlets/user/newsfeed/client/templates/TweetTemplate.java @@ -70,6 +70,7 @@ public class TweetTemplate extends Composite { private int totalComments = 0; private HTML showAllComments = new HTML(); private boolean isAppFeed = false; + /** * tell if this tweet is belonging to the current user */ @@ -396,4 +397,8 @@ public class TweetTemplate extends Composite { public String getMyFeedText() { return myFeed.getFeed().getDescription(); } + + public boolean isAppFeed() { + return isAppFeed; + } } 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 13dd7c9..8146663 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 @@ -90,8 +90,8 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService String user = (String) this.getThreadLocalRequest().getSession().getAttribute(ScopeHelper.USERNAME_ATTRIBUTE); if (user == null) { _log.warn("USER IS NULL setting testing user and Running OUTSIDE PORTAL"); - //user = "test.user"; - user = "massimiliano.assante"; + user = "test.user"; + //user = "massimiliano.assante"; } else { withinPortal = true; @@ -243,28 +243,28 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService ArrayList toMerge = new ArrayList(); HashMap feedsMap = new HashMap(); - ArrayList OrganizationFeeds = (ArrayList) store.getRecentFeedsByVRE("/gcube/devsec/devVRE", 5); + ArrayList OrganizationFeeds = (ArrayList) store.getRecentFeedsByVRE("/gcube/devsec/devVRE", 15); for (Feed feed : OrganizationFeeds) { feedsMap.put(feed.getKey(), feed); } -// if (! onlyConnections) { -// //User Own Feeds -// ArrayList userFeeds = (ArrayList) store.getRecentFeedsByUser(userName, 10); -// for (Feed feed : userFeeds) -// feedsMap.put(feed.getKey(), feed); -// // //Portal Feeds -// ArrayList portalFeeds = (ArrayList) store.getAllPortalPrivacyLevelFeeds(); -// for (Feed feed : portalFeeds) -// feedsMap.put(feed.getKey(), feed); -// } -// //UserFriends Feeds -// ArrayList userFriendsIds = (ArrayList)store.getFriends(userName); -// for (String userid : userFriendsIds) { -// for (Feed feed : store.getRecentFeedsByUser(userid, 10)) { -// feedsMap.put(feed.getKey(), feed); -// } -// } + if (! onlyConnections) { + //User Own Feeds + ArrayList userFeeds = (ArrayList) store.getRecentFeedsByUser(userName, 10); + for (Feed feed : userFeeds) + feedsMap.put(feed.getKey(), feed); + // //Portal Feeds + ArrayList portalFeeds = (ArrayList) store.getAllPortalPrivacyLevelFeeds(); + for (Feed feed : portalFeeds) + feedsMap.put(feed.getKey(), feed); + } + //UserFriends Feeds + ArrayList userFriendsIds = (ArrayList)store.getFriends(userName); + for (String userid : userFriendsIds) { + for (Feed feed : store.getRecentFeedsByUser(userid, 10)) { + feedsMap.put(feed.getKey(), feed); + } + } for (String key: feedsMap.keySet()) { toMerge.add(feedsMap.get(key)); } @@ -331,7 +331,7 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService * @param feedOwnerId the username of the user who created the post that was commented */ @Override - public Comment comment(String feedid, String commentText, String feedOwnerId) { + public Comment comment(String feedid, String commentText, String feedOwnerId, boolean isAppFeed) { boolean commentCommitResult = false; _log.trace("Trying to add this comment " + commentText); UserInfo user = getUserSettings().getUserInfo(); @@ -345,11 +345,11 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService e.printStackTrace(); return null; } - //if the comment was correctly delivered notify users involved + //if the comment was correctly delivered && is not an app feed notify users involved if (commentCommitResult) { //if the user who commented this post is not the user who posted it notify the poster user (Feed owner) NotificationsManager nm = new ApplicationNotificationsManager(getASLSession()); - if (! user.getUsername().equals(feedOwnerId)) { + if (! user.getUsername().equals(feedOwnerId) && (!isAppFeed)) { boolean result = nm.notifyOwnCommentReply(feedOwnerId, feedid, escapeHtml(commentText)); _log.trace("Comment Notification to post owner added? " + result); } @@ -636,34 +636,34 @@ public class NewsServiceImpl extends RemoteServiceServlet implements NewsService * @return the refreshingTime in milliseconds */ private int getFeedsRefreshTimeInMillis() { - return 15000; - //TODO: -// Properties props = new Properties(); -// int toReturn = 0; -// int minutes = 0; -// String propertyfile = ""; -// try { -// propertyfile = this.getThreadLocalRequest().getContextPath()+"conf/settings.properties"; -// File propsFile = new File(propertyfile); -// FileInputStream fis = new FileInputStream(propsFile); -// props.load( fis); -// -// minutes = Integer.parseInt(props.getProperty("REFRESH_TIME")); -// toReturn = minutes*60*1000; -// } -// //catch exception in case properties file does not exist -// catch(IOException e) { -// toReturn = 300000; //5 minutes -// _log.error("settings.properties file not found under " + propertyfile +", returning 5 minutes"); -// return toReturn; -// } -// //catch exception in case the property value isNot a Number -// catch (ClassCastException ex) { -// toReturn = 300000; //5 minutes -// _log.error("REFRESH_TIME must be a number (in minutes) returning 5 minutes"); -// return toReturn; -// } -// _log.debug("Returning REFRESH_TIME in millis: " + toReturn + ", (" + minutes + " minutes)"); -// return toReturn; + //return 20000; //for testing + + Properties props = new Properties(); + int toReturn = 0; + int minutes = 0; + String propertyfile = ""; + try { + propertyfile = this.getThreadLocalRequest().getContextPath()+"conf/settings.properties"; + File propsFile = new File(propertyfile); + FileInputStream fis = new FileInputStream(propsFile); + props.load( fis); + + minutes = Integer.parseInt(props.getProperty("REFRESH_TIME")); + toReturn = minutes*60*1000; + } + //catch exception in case properties file does not exist + catch(IOException e) { + toReturn = 300000; //5 minutes + _log.error("settings.properties file not found under " + propertyfile +", returning 5 minutes"); + return toReturn; + } + //catch exception in case the property value isNot a Number + catch (ClassCastException ex) { + toReturn = 300000; //5 minutes + _log.error("REFRESH_TIME must be a number (in minutes) returning 5 minutes"); + return toReturn; + } + _log.debug("Returning REFRESH_TIME in millis: " + toReturn + ", (" + minutes + " minutes)"); + return toReturn; } }