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

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

@ -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<Controller> controllerList = new ArrayList<>();
private ControllerTransition controllerTransition;
private boolean blockingInput = false;
protected List<Controller> 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);
}
if (!pushing) {
controllerList.remove(from);
}
}
if (to != null) {
updateToolbarCollapse(to, controllerTransition != null);
if (pushing) {
controllerPushed(to);
} else {
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() {
@ -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() {

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

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

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

Loading…
Cancel
Save