From 17705278ab213a13b55256b810e1e6a06497afa8 Mon Sep 17 00:00:00 2001 From: Floens Date: Mon, 29 Jun 2015 20:50:49 +0200 Subject: [PATCH] Add "n new posts" snackbar --- .../chan/core/presenter/ThreadPresenter.java | 20 +++++++++++++ .../floens/chan/ui/layout/ThreadLayout.java | 28 ++++++++++++++++++- .../chan/ui/layout/ThreadListLayout.java | 18 +++++++++++- Clover/app/src/main/res/values/strings.xml | 8 ++++-- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index 208afae3..ed0e7bd5 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -81,6 +81,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt private String searchQuery; private PostFilter.Order order = PostFilter.Order.BUMP; private boolean historyAdded = false; + private int notificationPostCount = -1; public ThreadPresenter(ThreadPresenterCallback threadPresenterCallback) { this.threadPresenterCallback = threadPresenterCallback; @@ -115,6 +116,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt chanLoader = null; loadable = null; historyAdded = false; + notificationPostCount = -1; threadPresenterCallback.showLoading(); } @@ -216,6 +218,20 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt } } + if (loadable.isThreadMode()) { + int postsSize = result.posts.size(); + if (notificationPostCount < 0) { + notificationPostCount = postsSize; + } else { + if (postsSize > notificationPostCount) { + int more = postsSize - notificationPostCount; + notificationPostCount = postsSize; + + threadPresenterCallback.showNewPostsNotification(true, more); + } + } + } + chanLoader.setAutoLoadMore(isWatching()); showPosts(); @@ -251,6 +267,8 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt pin.onBottomPostViewed(); watchManager.updatePin(pin); } + + threadPresenterCallback.showNewPostsNotification(false, -1); } public void scrollTo(int position, boolean smooth) { @@ -626,5 +644,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt void hideDeleting(String message); void hideThread(Post post); + + void showNewPostsNotification(boolean show, int more); } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index f8e1b2b7..59daf19a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -46,6 +46,7 @@ import com.android.volley.VolleyError; import org.floens.chan.Chan; import org.floens.chan.R; import org.floens.chan.controller.Controller; +import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Post; @@ -54,7 +55,6 @@ import org.floens.chan.core.model.PostLinkable; import org.floens.chan.core.model.ThreadHide; import org.floens.chan.core.presenter.ThreadPresenter; import org.floens.chan.core.settings.ChanSettings; -import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.ui.adapter.PostFilter; import org.floens.chan.ui.cell.PostCellInterface; import org.floens.chan.ui.helper.PostPopupHelper; @@ -97,6 +97,7 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T private ProgressDialog deletingDialog; private boolean refreshedFromSwipe; private boolean showingReplyButton = false; + private Snackbar newPostsNotification; public ThreadLayout(Context context) { super(context); @@ -379,6 +380,30 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T fixSnackbarText(getContext(), snackbar); } + @Override + public void showNewPostsNotification(boolean show, int more) { + if (show) { + if (!threadListLayout.scrolledToBottom()) { + String text = getContext().getString(R.string.thread_new_posts, + more, getContext().getResources().getQuantityString(R.plurals.posts, more, more)); + + newPostsNotification = Snackbar.make(this, text, Snackbar.LENGTH_LONG); + newPostsNotification.setAction(R.string.thread_new_posts_goto, new OnClickListener() { + @Override + public void onClick(View v) { + presenter.scrollTo(-1, false); + } + }).show(); + fixSnackbarText(getContext(), newPostsNotification); + } + } else { + if (newPostsNotification != null) { + newPostsNotification.dismiss(); + newPostsNotification = null; + } + } + } + public ThumbnailView getThumbnail(PostImage postImage) { if (postPopupHelper.isOpen()) { return postPopupHelper.getThumbnail(postImage); @@ -414,6 +439,7 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T postPopupHelper.popAll(); showSearch(false); showReplyButton(false); + newPostsNotification = null; break; } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java index e4c102f8..d9774254 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java @@ -248,7 +248,7 @@ public class ThreadListLayout extends LinearLayout implements ReplyLayout.ReplyL if (query != null) { int size = postAdapter.getDisplaySize(); searchStatus.setText(getContext().getString(R.string.search_results, - getContext().getResources().getQuantityString(R.plurals.posts, size, size), query)); + size, getContext().getResources().getQuantityString(R.plurals.posts, size, size), query)); } } @@ -274,6 +274,22 @@ public class ThreadListLayout extends LinearLayout implements ReplyLayout.ReplyL return true; } + public boolean scrolledToBottom() { + switch (postViewMode) { + case LIST: + if (((LinearLayoutManager) layoutManager).findLastVisibleItemPosition() == postAdapter.getItemCount() - 1) { + return true; + } + break; + case CARD: + if (((GridLayoutManager) layoutManager).findLastVisibleItemPosition() == postAdapter.getItemCount() - 1) { + return true; + } + break; + } + return false; + } + public void cleanup() { /*if (ChanBuild.DEVELOPER_MODE) { Pin pin = ChanApplication.getWatchManager().findPinByLoadable(showingThread.loadable); diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index aeba43b1..59870d99 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -33,8 +33,8 @@ along with this program. If not, see . - %d post - %d posts + post + posts @@ -71,7 +71,7 @@ along with this program. If not, see . Oldest Search - Found %1$s for "%2$s" + Found %1$d %2$s for "%3$s" Search subjects, comments, names and filenames Open link? @@ -103,6 +103,8 @@ along with this program. If not, see . Retry Archived Closed + %1$d new %2$s + View Board editor Add, remove and reorder your boards here.\nThe topmost board will be loaded automatically.