From 430c0963bd397f14bd6e20b065bdf9ad0ad2ef81 Mon Sep 17 00:00:00 2001 From: Floens Date: Tue, 17 Nov 2015 18:56:09 +0100 Subject: [PATCH] Keep controllers attached but hide them, instead of removing the view Previously when a controller because hidden, it was removed from the view hierachy, and reattached when shown again. Now the views are only detached from the view hierachy when the whole controller gets destroyed, and the view visibility is changed on onHide and onShow. This was done for performance reasons. Reattaching a controller takes too much time and is noticable when trying to swipe a controller away. --- .../floens/chan/controller/Controller.java | 60 ++++++++++++------- .../chan/controller/NavigationController.java | 6 +- .../chan/ui/controller/DrawerController.java | 2 +- .../chan/ui/controller/PopupController.java | 2 +- .../controller/SplitNavigationController.java | 8 +-- 5 files changed, 45 insertions(+), 33 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 da4519fd..e29e4c26 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 @@ -21,6 +21,7 @@ import android.content.Context; import android.content.res.Configuration; import android.view.KeyEvent; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import org.floens.chan.controller.transition.FadeInTransition; @@ -82,6 +83,8 @@ public abstract class Controller { Logger.test(getClass().getSimpleName() + " onShow"); } + view.setVisibility(View.VISIBLE); + for (Controller controller : childControllers) { if (!controller.shown) { controller.onShow(); @@ -95,6 +98,8 @@ public abstract class Controller { Logger.test(getClass().getSimpleName() + " onHide"); } + view.setVisibility(View.GONE); + for (Controller controller : childControllers) { if (controller.shown) { controller.onHide(); @@ -111,6 +116,10 @@ public abstract class Controller { while (childControllers.size() > 0) { removeChildController(childControllers.get(0)); } + + if (AndroidUtils.removeFromParentView(view)) { + Logger.test(getClass().getSimpleName() + " view removed onDestroy"); + } } public void addChildController(Controller controller) { @@ -125,29 +134,22 @@ public abstract class Controller { return childControllers.remove(controller); } - public void attach(ViewGroup parentView, boolean over) { - ViewGroup.LayoutParams params = view.getLayoutParams(); - - if (params == null) { - params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - } else { - params.width = ViewGroup.LayoutParams.MATCH_PARENT; - params.height = ViewGroup.LayoutParams.MATCH_PARENT; + public void attachToParentView(ViewGroup parentView, boolean over) { + if (view.getParent() != null) { + if (LOG_STATES) { + Logger.test(getClass().getSimpleName() + " view removed"); + } + AndroidUtils.removeFromParentView(view); } - view.setLayoutParams(params); - - if (over) { - parentView.addView(view, view.getLayoutParams()); - } else { - parentView.addView(view, 0, view.getLayoutParams()); + if (parentView != null) { + if (LOG_STATES) { + Logger.test(getClass().getSimpleName() + " view attached"); + } + attachToView(parentView, over); } } - public void detach() { - AndroidUtils.removeFromParentView(view); - } - public void onConfigurationChanged(Configuration newConfig) { for (Controller controller : childControllers) { controller.onConfigurationChanged(newConfig); @@ -186,7 +188,7 @@ public abstract class Controller { controller.presentingByController = this; controller.onCreate(); - controller.attach(contentView, true); + controller.attachToView(contentView, true); controller.onShow(); if (animated) { @@ -223,7 +225,6 @@ public abstract class Controller { private void finishPresenting() { onHide(); - detach(); onDestroy(); } @@ -238,4 +239,23 @@ public abstract class Controller { public ViewGroup inflateRes(int resId) { return (ViewGroup) LayoutInflater.from(context).inflate(resId, null); } + + private void attachToView(ViewGroup parentView, boolean over) { + ViewGroup.LayoutParams params = view.getLayoutParams(); + + if (params == null) { + params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + } else { + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.MATCH_PARENT; + } + + view.setLayoutParams(params); + + if (over) { + parentView.addView(view, view.getLayoutParams()); + } else { + parentView.addView(view, 0, view.getLayoutParams()); + } + } } 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 ae6d3eda..d207743f 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 @@ -89,7 +89,6 @@ public abstract class NavigationController extends Controller { throw new IllegalArgumentException("Cannot transition while another transition is in progress."); } - to.attach(container, false); to.onShow(); return true; @@ -101,11 +100,9 @@ public abstract class NavigationController extends Controller { public void endSwipeTransition(final Controller from, final Controller to, boolean finish) { if (finish) { from.onHide(); - from.detach(); removeChildController(from); } else { to.onHide(); - to.detach(); } controllerTransition = null; @@ -126,7 +123,7 @@ public abstract class NavigationController extends Controller { } if (to != null) { - to.attach(container, pushing); + to.attachToParentView(container, pushing); to.onShow(); } @@ -158,7 +155,6 @@ public abstract class NavigationController extends Controller { private void finishTransition(Controller from, boolean pushing) { if (from != null) { from.onHide(); - from.detach(); } if (!pushing && from != null) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java index ce9d9298..2d863fc8 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java @@ -115,7 +115,7 @@ public class DrawerController extends Controller implements PinAdapter.Callback, public void setChildController(Controller childController) { addChildController(childController); - childController.attach(container, true); + childController.attachToParentView(container, true); childController.onShow(); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/PopupController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/PopupController.java index 58448d5f..9a9e7537 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/PopupController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/PopupController.java @@ -45,7 +45,7 @@ public class PopupController extends Controller implements View.OnClickListener public void setChildController(NavigationController childController) { addChildController(childController); - childController.attach(container, true); + childController.attachToParentView(container, true); childController.onShow(); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java index b269dd06..4bac428c 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java @@ -82,7 +82,6 @@ public class SplitNavigationController extends Controller implements AndroidUtil public void setLeftController(Controller leftController) { if (this.leftController != null) { this.leftController.onHide(); - this.leftController.detach(); removeChildController(this.leftController); } @@ -90,17 +89,14 @@ public class SplitNavigationController extends Controller implements AndroidUtil if (leftController != null) { addChildController(leftController); - leftController.attach(leftControllerView, true); + leftController.attachToParentView(leftControllerView, true); leftController.onShow(); - } else { - } } public void setRightController(Controller rightController) { if (this.rightController != null) { this.rightController.onHide(); - this.rightController.detach(); removeChildController(this.rightController); } else { rightControllerView.removeAllViews(); @@ -110,7 +106,7 @@ public class SplitNavigationController extends Controller implements AndroidUtil if (rightController != null) { addChildController(rightController); - rightController.attach(rightControllerView, true); + rightController.attachToParentView(rightControllerView, true); rightController.onShow(); } else { rightControllerView.addView(emptyView);