Improve Controller code duplication

multisite
Floens 10 years ago
parent b7766723c5
commit 17dc135820
  1. 35
      Clover/app/src/main/java/org/floens/chan/controller/Controller.java
  2. 12
      Clover/app/src/main/java/org/floens/chan/controller/ControllerLogic.java
  3. 85
      Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java
  4. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java
  5. 4
      Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java
  6. 4
      Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java

@ -25,8 +25,11 @@ import android.view.ViewGroup;
import org.floens.chan.ui.activity.BoardActivity; import org.floens.chan.ui.activity.BoardActivity;
import org.floens.chan.ui.toolbar.NavigationItem; import org.floens.chan.ui.toolbar.NavigationItem;
import org.floens.chan.utils.Logger;
public abstract class Controller { public abstract class Controller {
private static final boolean LOG_STATES = false;
public Context context; public Context context;
public View view; public View view;
@ -36,8 +39,14 @@ public abstract class Controller {
public Controller previousSiblingController; public Controller previousSiblingController;
public NavigationController navigationController; public NavigationController navigationController;
// Controller (for presenting) members /**
* Controller that this controller is presented by.
*/
public Controller presentingController; public Controller presentingController;
/**
* Controller that this controller is presenting.
*/
public Controller presentedController; public Controller presentedController;
public boolean alive = false; public boolean alive = false;
@ -48,20 +57,28 @@ public abstract class Controller {
public void onCreate() { public void onCreate() {
alive = true; alive = true;
// Logger.test(getClass().getSimpleName() + " onCreate"); if (LOG_STATES) {
Logger.test(getClass().getSimpleName() + " onCreate");
}
} }
public void onShow() { public void onShow() {
// Logger.test(getClass().getSimpleName() + " onShow"); if (LOG_STATES) {
Logger.test(getClass().getSimpleName() + " onShow");
}
} }
public void onHide() { public void onHide() {
// Logger.test(getClass().getSimpleName() + " onHide"); if (LOG_STATES) {
Logger.test(getClass().getSimpleName() + " onHide");
}
} }
public void onDestroy() { public void onDestroy() {
alive = false; alive = false;
// Logger.test(getClass().getSimpleName() + " onDestroy"); if (LOG_STATES) {
Logger.test(getClass().getSimpleName() + " onDestroy");
}
} }
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
@ -88,9 +105,9 @@ public abstract class Controller {
ControllerLogic.finishTransition(transition); ControllerLogic.finishTransition(transition);
} }
}); });
ControllerLogic.startTransition(null, controller, false, true, contentView, transition); ControllerLogic.startTransition(null, controller, true, contentView, transition);
} else { } else {
ControllerLogic.transition(null, controller, false, true, contentView); ControllerLogic.transition(null, controller, true, contentView);
} }
((BoardActivity) context).addController(controller); ((BoardActivity) context).addController(controller);
} }
@ -110,9 +127,9 @@ public abstract class Controller {
ControllerLogic.finishTransition(transition); ControllerLogic.finishTransition(transition);
} }
}); });
ControllerLogic.startTransition(this, null, true, false, contentView, transition); ControllerLogic.startTransition(this, null, false, contentView, transition);
} else { } else {
ControllerLogic.transition(this, null, true, false, contentView); ControllerLogic.transition(this, null, false, contentView);
} }
((BoardActivity) context).removeController(this); ((BoardActivity) context).removeController(this);
presentingController.presentedController = null; presentingController.presentedController = null;

@ -45,9 +45,9 @@ public class ControllerLogic {
AndroidUtils.removeFromParentView(controller.view); 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 (to != null) {
if (createTo) { if (pushing) {
to.onCreate(); to.onCreate();
} }
@ -59,19 +59,19 @@ public class ControllerLogic {
from.onHide(); from.onHide();
detach(from); detach(from);
if (destroyFrom) { if (!pushing) {
from.onDestroy(); from.onDestroy();
} }
} }
} }
public static void startTransition(Controller from, Controller to, boolean destroyFrom, boolean createTo, ViewGroup toView, ControllerTransition transition) { public static void startTransition(Controller from, Controller to, boolean pushing, ViewGroup toView, ControllerTransition transition) {
transition.destroyFrom = destroyFrom; transition.destroyFrom = !pushing;
transition.from = from; transition.from = from;
transition.to = to; transition.to = to;
if (to != null) { if (to != null) {
if (createTo) { if (pushing) {
to.onCreate(); to.onCreate();
} }

@ -26,13 +26,13 @@ import org.floens.chan.ui.toolbar.Toolbar;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public abstract class NavigationController extends Controller implements ControllerTransition.Callback, Toolbar.ToolbarCallback { public abstract class NavigationController extends Controller implements Toolbar.ToolbarCallback, ControllerTransition.Callback {
public Toolbar toolbar; protected Toolbar toolbar;
public FrameLayout container; protected FrameLayout container;
private List<Controller> controllerList = new ArrayList<>(); protected List<Controller> controllerList = new ArrayList<>();
private ControllerTransition controllerTransition; protected ControllerTransition controllerTransition;
private boolean blockingInput = false; protected boolean blockingInput = false;
public NavigationController(Context context) { public NavigationController(Context context) {
super(context); super(context);
@ -58,31 +58,13 @@ public abstract class NavigationController extends Controller implements Control
public boolean pushController(final Controller to, ControllerTransition controllerTransition) { public boolean pushController(final Controller to, ControllerTransition controllerTransition) {
if (blockingInput) return false; 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; final Controller from = controllerList.size() > 0 ? controllerList.get(controllerList.size() - 1) : null;
to.navigationController = this; to.navigationController = this;
to.previousSiblingController = from; to.previousSiblingController = from;
controllerList.add(to); controllerList.add(to);
if (controllerTransition != null) { transition(from, to, true, controllerTransition);
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);
return true; return true;
} }
@ -101,44 +83,65 @@ public abstract class NavigationController extends Controller implements Control
public boolean popController(ControllerTransition controllerTransition) { public boolean popController(ControllerTransition controllerTransition) {
if (blockingInput) return false; 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) { 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"); 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) { if (controllerTransition != null) {
blockingInput = true; blockingInput = true;
this.controllerTransition = controllerTransition; this.controllerTransition = controllerTransition;
controllerTransition.setCallback(this); controllerTransition.setCallback(this);
ControllerLogic.startTransition(from, to, pushing, container, controllerTransition);
ControllerLogic.startTransition(from, to, true, false, container, controllerTransition);
if (to != null) { if (to != null) {
toolbar.setNavigationItem(true, false, to.navigationItem); toolbar.setNavigationItem(true, false, to.navigationItem);
} }
} else { } else {
ControllerLogic.transition(from, to, true, false, container); ControllerLogic.transition(from, to, pushing, container);
if (to != null) { if (to != null) {
toolbar.setNavigationItem(false, false, to.navigationItem); toolbar.setNavigationItem(false, false, to.navigationItem);
} }
if (!pushing) {
controllerList.remove(from); controllerList.remove(from);
} }
}
if (to != null) { if (to != null) {
updateToolbarCollapse(to, controllerTransition != null); updateToolbarCollapse(to, controllerTransition != null);
if (pushing) {
controllerPushed(to);
} else {
controllerPopped(to); controllerPopped(to);
} }
}
}
return true; @Override
public void onControllerTransitionCompleted(ControllerTransition transition) {
ControllerLogic.finishTransition(transition);
if (transition.destroyFrom) {
controllerList.remove(transition.from);
} }
protected void controllerPopped(Controller controller) { controllerTransition = null;
blockingInput = false;
} }
public Controller getTop() { public Controller getTop() {
@ -156,16 +159,8 @@ public abstract class NavigationController extends Controller implements Control
return controllerList; return controllerList;
} }
@Override public Toolbar getToolbar() {
public void onControllerTransitionCompleted(ControllerTransition transition) { return toolbar;
ControllerLogic.finishTransition(transition);
if (transition.destroyFrom) {
controllerList.remove(transition.from);
}
this.controllerTransition = null;
blockingInput = false;
} }
public boolean onBack() { public boolean onBack() {

@ -199,7 +199,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
if (menu == navigationItem.middleMenu) { if (menu == navigationItem.middleMenu) {
if (item instanceof FloatingMenuItemBoard) { if (item instanceof FloatingMenuItemBoard) {
loadBoard(((FloatingMenuItemBoard) item).board); loadBoard(((FloatingMenuItemBoard) item).board);
navigationController.toolbar.updateNavigation(); navigationController.getToolbar().updateNavigation();
} else { } else {
navigationController.pushController(new BoardEditController(context)); navigationController.pushController(new BoardEditController(context));
menu.dismiss(); menu.dismiss();

@ -73,7 +73,7 @@ public abstract class ThreadController extends Controller implements ThreadLayou
swipeRefreshLayout.addView(threadLayout); swipeRefreshLayout.addView(threadLayout);
swipeRefreshLayout.setOnRefreshListener(this); swipeRefreshLayout.setOnRefreshListener(this);
int toolbarHeight = navigationController.toolbar.getToolbarHeight(); int toolbarHeight = navigationController.getToolbar().getToolbarHeight();
swipeRefreshLayout.setProgressViewOffset(false, toolbarHeight - dp(40), toolbarHeight + dp(64 - 40)); swipeRefreshLayout.setProgressViewOffset(false, toolbarHeight - dp(40), toolbarHeight + dp(64 - 40));
view = swipeRefreshLayout; view = swipeRefreshLayout;
@ -186,7 +186,7 @@ public abstract class ThreadController extends Controller implements ThreadLayou
@Override @Override
public Toolbar getToolbar() { public Toolbar getToolbar() {
return navigationController.toolbar; return navigationController.getToolbar();
} }
@Override @Override

@ -174,6 +174,10 @@ public class AndroidUtils {
return drawable; return drawable;
} }
public static boolean isTablet(Context context) {
return context.getResources().getBoolean(R.bool.is_tablet);
}
public static int getDimen(Context context, int dimen) { public static int getDimen(Context context, int dimen) {
return context.getResources().getDimensionPixelSize(dimen); return context.getResources().getDimensionPixelSize(dimen);
} }

Loading…
Cancel
Save