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.
refactor-toolbar
Floens 8 years ago
parent 61b0798027
commit 4356eafc2f
  1. 13
      Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java
  2. 20
      Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadSlideController.java
  3. 6
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java
  4. 24
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java
  5. 30
      Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.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();
}
}

@ -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();
}
}

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

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

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

Loading…
Cancel
Save