From 4356eafc2f97306b39ebe67175a61ec26078e335 Mon Sep 17 00:00:00 2001 From: Floens Date: Fri, 12 Jan 2018 18:21:31 +0100 Subject: [PATCH] show toolbar when coming back from the other controller show the toolbar when coming back from the other controller in the threadslidecontroller. it should show again if the other controller made it hide if the search or reply is open, or if it was scrolled to the top. --- .../chan/ui/controller/ThreadController.java | 13 +++++++- .../ui/controller/ThreadSlideController.java | 20 +++++++++++++ .../floens/chan/ui/layout/ThreadLayout.java | 6 ++++ .../chan/ui/layout/ThreadListLayout.java | 24 ++++++++++++++- .../org/floens/chan/ui/toolbar/Toolbar.java | 30 ++++++++++++++----- 5 files changed, 84 insertions(+), 9 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java index 97795366..c11e01b8 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java @@ -49,7 +49,13 @@ import de.greenrobot.event.EventBus; import static org.floens.chan.utils.AndroidUtils.dp; -public abstract class ThreadController extends Controller implements ThreadLayout.ThreadLayoutCallback, ImageViewerController.ImageViewerCallback, SwipeRefreshLayout.OnRefreshListener, ToolbarNavigationController.ToolbarSearchCallback, NfcAdapter.CreateNdefMessageCallback { +public abstract class ThreadController extends Controller implements + ThreadLayout.ThreadLayoutCallback, + ImageViewerController.ImageViewerCallback, + SwipeRefreshLayout.OnRefreshListener, + ToolbarNavigationController.ToolbarSearchCallback, + NfcAdapter.CreateNdefMessageCallback, + ThreadSlideController.SlideChangeListener { private static final String TAG = "ThreadController"; protected ThreadLayout threadLayout; @@ -260,4 +266,9 @@ public abstract class ThreadController extends Controller implements ThreadLayou filter.pattern = tripcode; filtersController.showFilterDialog(filter); } + + @Override + public void onSlideChanged() { + threadLayout.gainedFocus(); + } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadSlideController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadSlideController.java index eb222320..cd85ca20 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadSlideController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadSlideController.java @@ -260,6 +260,22 @@ public class ThreadSlideController extends Controller implements DoubleNavigatio private void slideStateChanged(boolean leftOpen) { setParentNavigationItem(leftOpen); + + notifySlideChanged(leftOpen ? leftController : rightController); + } + + private void notifySlideChanged(Controller controller) { + if (controller == null) { + return; + } + + if (controller instanceof SlideChangeListener) { + ((SlideChangeListener) controller).onSlideChanged(); + } + + for (Controller childController : controller.childControllers) { + notifySlideChanged(childController); + } } private void setParentNavigationItem(boolean left) { @@ -284,4 +300,8 @@ public class ThreadSlideController extends Controller implements DoubleNavigatio toolbar.setNavigationItem(false, true, navigation); } } + + public interface SlideChangeListener { + void onSlideChanged(); + } } 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 26fc68ff..7d174616 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 @@ -195,6 +195,12 @@ public class ThreadLayout extends CoordinatorLayout implements presenter.requestData(); } + public void gainedFocus() { + if (visible == Visible.THREAD) { + threadListLayout.gainedFocus(); + } + } + public void setPostViewMode(ChanSettings.PostViewMode postViewMode) { threadListLayout.setPostViewMode(postViewMode); } 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 6c17055b..fc5d7a30 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 @@ -263,6 +263,10 @@ public class ThreadListLayout extends FrameLayout implements ReplyLayout.ReplyLa return false; } + public void gainedFocus() { + showToolbarIfNeeded(); + } + public void openReply(boolean open) { if (showingThread != null && replyOpen != open) { this.replyOpen = open; @@ -532,7 +536,25 @@ public class ThreadListLayout extends FrameLayout implements ReplyLayout.ReplyLa toolbar.attachRecyclerViewScrollStateListener(recyclerView); } else { toolbar.detachRecyclerViewScrollStateListener(recyclerView); - toolbar.setCollapse(Toolbar.TOOLBAR_COLLAPSE_SHOW, true); + toolbar.collapseShow(true); + } + } + } + + private void showToolbarIfNeeded() { + if (threadListLayoutCallback.shouldToolbarCollapse()) { + // Of coming back to focus from a dual controller, like the threadlistcontroller, + // check if we should show the toolbar again (after the other controller made it hide). + // It should show if the search or reply is open, or if the thread was scrolled at the + // top showing an empty space. + + Toolbar toolbar = threadListLayoutCallback.getToolbar(); + if (searchOpen || replyOpen) { + // force toolbar to show + toolbar.collapseShow(true); + } else { + // check if it should show if it was scrolled at the top + toolbar.checkToolbarCollapseState(recyclerView); } } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java index 987b5400..7059f2a7 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java @@ -67,13 +67,7 @@ public class Toolbar extends LinearLayout implements View.OnClickListener { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { - View positionZero = recyclerView.getLayoutManager().findViewByPosition(0); - boolean allowHide = positionZero == null || positionZero.getTop() < 0; - if (allowHide || lastScrollDeltaOffset <= 0) { - setCollapse(lastScrollDeltaOffset <= 0 ? TOOLBAR_COLLAPSE_SHOW : TOOLBAR_COLLAPSE_HIDE, true); - } else { - setCollapse(TOOLBAR_COLLAPSE_SHOW, true); - } + processRecyclerViewScroll(recyclerView); } } }; @@ -134,6 +128,14 @@ public class Toolbar extends LinearLayout implements View.OnClickListener { setCollapse(offset, animated); } + public void collapseShow(boolean animated) { + setCollapse(Toolbar.TOOLBAR_COLLAPSE_SHOW, animated); + } + + public void collapseHide(boolean animated) { + setCollapse(Toolbar.TOOLBAR_COLLAPSE_HIDE, animated); + } + public void setCollapse(int offset, boolean animated) { scrollOffset += offset; scrollOffset = Math.max(0, Math.min(getHeight(), scrollOffset)); @@ -163,6 +165,20 @@ public class Toolbar extends LinearLayout implements View.OnClickListener { recyclerView.removeOnScrollListener(recyclerViewOnScrollListener); } + public void checkToolbarCollapseState(RecyclerView recyclerView) { + processRecyclerViewScroll(recyclerView); + } + + private void processRecyclerViewScroll(RecyclerView recyclerView) { + View positionZero = recyclerView.getLayoutManager().findViewByPosition(0); + boolean allowHide = positionZero == null || positionZero.getTop() < 0; + if (allowHide || lastScrollDeltaOffset <= 0) { + setCollapse(lastScrollDeltaOffset <= 0 ? TOOLBAR_COLLAPSE_SHOW : TOOLBAR_COLLAPSE_HIDE, true); + } else { + setCollapse(TOOLBAR_COLLAPSE_SHOW, true); + } + } + // public void updateNavigation() { // closeSearchInternal(); // setNavigationItem(false, false, toItem);