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);