From 17dc135820873acba7d3dffa6e741635fcdc8e02 Mon Sep 17 00:00:00 2001 From: Floens Date: Tue, 4 Aug 2015 20:04:13 +0200 Subject: [PATCH] Improve Controller code duplication --- .../floens/chan/controller/Controller.java | 35 +++++-- .../chan/controller/ControllerLogic.java | 12 +-- .../chan/controller/NavigationController.java | 91 +++++++++---------- .../chan/ui/controller/BrowseController.java | 2 +- .../chan/ui/controller/ThreadController.java | 4 +- .../org/floens/chan/utils/AndroidUtils.java | 4 + 6 files changed, 82 insertions(+), 66 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java index 3b9d3f12..3abdf6bf 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java @@ -25,8 +25,11 @@ import android.view.ViewGroup; import org.floens.chan.ui.activity.BoardActivity; import org.floens.chan.ui.toolbar.NavigationItem; +import org.floens.chan.utils.Logger; public abstract class Controller { + private static final boolean LOG_STATES = false; + public Context context; public View view; @@ -36,8 +39,14 @@ public abstract class Controller { public Controller previousSiblingController; public NavigationController navigationController; - // Controller (for presenting) members + /** + * Controller that this controller is presented by. + */ public Controller presentingController; + + /** + * Controller that this controller is presenting. + */ public Controller presentedController; public boolean alive = false; @@ -48,20 +57,28 @@ public abstract class Controller { public void onCreate() { alive = true; -// Logger.test(getClass().getSimpleName() + " onCreate"); + if (LOG_STATES) { + Logger.test(getClass().getSimpleName() + " onCreate"); + } } public void onShow() { -// Logger.test(getClass().getSimpleName() + " onShow"); + if (LOG_STATES) { + Logger.test(getClass().getSimpleName() + " onShow"); + } } public void onHide() { -// Logger.test(getClass().getSimpleName() + " onHide"); + if (LOG_STATES) { + Logger.test(getClass().getSimpleName() + " onHide"); + } } public void onDestroy() { alive = false; -// Logger.test(getClass().getSimpleName() + " onDestroy"); + if (LOG_STATES) { + Logger.test(getClass().getSimpleName() + " onDestroy"); + } } public void onConfigurationChanged(Configuration newConfig) { @@ -88,9 +105,9 @@ public abstract class Controller { ControllerLogic.finishTransition(transition); } }); - ControllerLogic.startTransition(null, controller, false, true, contentView, transition); + ControllerLogic.startTransition(null, controller, true, contentView, transition); } else { - ControllerLogic.transition(null, controller, false, true, contentView); + ControllerLogic.transition(null, controller, true, contentView); } ((BoardActivity) context).addController(controller); } @@ -110,9 +127,9 @@ public abstract class Controller { ControllerLogic.finishTransition(transition); } }); - ControllerLogic.startTransition(this, null, true, false, contentView, transition); + ControllerLogic.startTransition(this, null, false, contentView, transition); } else { - ControllerLogic.transition(this, null, true, false, contentView); + ControllerLogic.transition(this, null, false, contentView); } ((BoardActivity) context).removeController(this); presentingController.presentedController = null; diff --git a/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java b/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java index 02f8847d..0937b78a 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java @@ -45,9 +45,9 @@ public class ControllerLogic { AndroidUtils.removeFromParentView(controller.view); } - public static void transition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView) { + public static void transition(Controller from, Controller to, boolean pushing, ViewGroup toView) { if (to != null) { - if (createTo) { + if (pushing) { to.onCreate(); } @@ -59,19 +59,19 @@ public class ControllerLogic { from.onHide(); detach(from); - if (destroyFrom) { + if (!pushing) { from.onDestroy(); } } } - public static void startTransition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView, ControllerTransition transition) { - transition.destroyFrom = destroyFrom; + public static void startTransition(Controller from, Controller to, boolean pushing, ViewGroup toView, ControllerTransition transition) { + transition.destroyFrom = !pushing; transition.from = from; transition.to = to; if (to != null) { - if (createTo) { + if (pushing) { to.onCreate(); } diff --git a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java index 9b6a75e5..a9819752 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java @@ -26,13 +26,13 @@ import org.floens.chan.ui.toolbar.Toolbar; import java.util.ArrayList; import java.util.List; -public abstract class NavigationController extends Controller implements ControllerTransition.Callback, Toolbar.ToolbarCallback { - public Toolbar toolbar; - public FrameLayout container; +public abstract class NavigationController extends Controller implements Toolbar.ToolbarCallback, ControllerTransition.Callback { + protected Toolbar toolbar; + protected FrameLayout container; - private List controllerList = new ArrayList<>(); - private ControllerTransition controllerTransition; - private boolean blockingInput = false; + protected List controllerList = new ArrayList<>(); + protected ControllerTransition controllerTransition; + protected boolean blockingInput = false; public NavigationController(Context context) { super(context); @@ -58,31 +58,13 @@ public abstract class NavigationController extends Controller implements Control public boolean pushController(final Controller to, ControllerTransition controllerTransition) { if (blockingInput) return false; - if (this.controllerTransition != null) { - throw new IllegalArgumentException("Cannot push controller while a transition is in progress."); - } - final Controller from = controllerList.size() > 0 ? controllerList.get(controllerList.size() - 1) : null; to.navigationController = this; to.previousSiblingController = from; controllerList.add(to); - if (controllerTransition != null) { - blockingInput = true; - this.controllerTransition = controllerTransition; - controllerTransition.setCallback(this); - - ControllerLogic.startTransition(from, to, false, true, container, controllerTransition); - toolbar.setNavigationItem(true, true, to.navigationItem); - } else { - ControllerLogic.transition(from, to, false, true, container); - toolbar.setNavigationItem(false, true, to.navigationItem); - } - - updateToolbarCollapse(to, controllerTransition != null); - - controllerPushed(to); + transition(from, to, true, controllerTransition); return true; } @@ -101,44 +83,65 @@ public abstract class NavigationController extends Controller implements Control public boolean popController(ControllerTransition controllerTransition) { if (blockingInput) return false; + final Controller from = controllerList.get(controllerList.size() - 1); + final Controller to = controllerList.size() > 1 ? controllerList.get(controllerList.size() - 2) : null; + + transition(from, to, false, controllerTransition); + + return true; + } + + protected void controllerPopped(Controller controller) { + } + + public void transition(Controller from, Controller to, boolean pushing, ControllerTransition controllerTransition) { if (this.controllerTransition != null) { - throw new IllegalArgumentException("Cannot pop controller while a transition is in progress."); + throw new IllegalArgumentException("Cannot transition while another transition is in progress."); } - if (controllerList.size() == 0) { + if (!pushing && controllerList.size() == 0) { throw new IllegalArgumentException("Cannot pop with no controllers left"); } - final Controller from = controllerList.get(controllerList.size() - 1); - final Controller to = controllerList.size() > 1 ? controllerList.get(controllerList.size() - 2) : null; - if (controllerTransition != null) { blockingInput = true; this.controllerTransition = controllerTransition; controllerTransition.setCallback(this); - - ControllerLogic.startTransition(from, to, true, false, container, controllerTransition); + ControllerLogic.startTransition(from, to, pushing, container, controllerTransition); if (to != null) { toolbar.setNavigationItem(true, false, to.navigationItem); } } else { - ControllerLogic.transition(from, to, true, false, container); + ControllerLogic.transition(from, to, pushing, container); if (to != null) { toolbar.setNavigationItem(false, false, to.navigationItem); } - controllerList.remove(from); + if (!pushing) { + controllerList.remove(from); + } } if (to != null) { updateToolbarCollapse(to, controllerTransition != null); - controllerPopped(to); + if (pushing) { + controllerPushed(to); + } else { + controllerPopped(to); + } } - - return true; } - protected void controllerPopped(Controller controller) { + @Override + public void onControllerTransitionCompleted(ControllerTransition transition) { + ControllerLogic.finishTransition(transition); + + if (transition.destroyFrom) { + controllerList.remove(transition.from); + } + + controllerTransition = null; + blockingInput = false; } public Controller getTop() { @@ -156,16 +159,8 @@ public abstract class NavigationController extends Controller implements Control return controllerList; } - @Override - public void onControllerTransitionCompleted(ControllerTransition transition) { - ControllerLogic.finishTransition(transition); - - if (transition.destroyFrom) { - controllerList.remove(transition.from); - } - - this.controllerTransition = null; - blockingInput = false; + public Toolbar getToolbar() { + return toolbar; } public boolean onBack() { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java index 34466d5c..4363e162 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java @@ -199,7 +199,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte if (menu == navigationItem.middleMenu) { if (item instanceof FloatingMenuItemBoard) { loadBoard(((FloatingMenuItemBoard) item).board); - navigationController.toolbar.updateNavigation(); + navigationController.getToolbar().updateNavigation(); } else { navigationController.pushController(new BoardEditController(context)); menu.dismiss(); 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 030ae2ea..6cfaec4b 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 @@ -73,7 +73,7 @@ public abstract class ThreadController extends Controller implements ThreadLayou swipeRefreshLayout.addView(threadLayout); swipeRefreshLayout.setOnRefreshListener(this); - int toolbarHeight = navigationController.toolbar.getToolbarHeight(); + int toolbarHeight = navigationController.getToolbar().getToolbarHeight(); swipeRefreshLayout.setProgressViewOffset(false, toolbarHeight - dp(40), toolbarHeight + dp(64 - 40)); view = swipeRefreshLayout; @@ -186,7 +186,7 @@ public abstract class ThreadController extends Controller implements ThreadLayou @Override public Toolbar getToolbar() { - return navigationController.toolbar; + return navigationController.getToolbar(); } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java index 79d3b3bb..f5d7a1ce 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java @@ -174,6 +174,10 @@ public class AndroidUtils { return drawable; } + public static boolean isTablet(Context context) { + return context.getResources().getBoolean(R.bool.is_tablet); + } + public static int getDimen(Context context, int dimen) { return context.getResources().getDimensionPixelSize(dimen); }