Search in sources :

Example 1 with LifecycleListener

use of com.bluelinelabs.conductor.Controller.LifecycleListener in project Conductor by bluelinelabs.

the class ControllerLifecycleSubjectHelper method create.

public static BehaviorSubject<ControllerEvent> create(Controller controller) {
    ControllerEvent initialState;
    if (controller.isBeingDestroyed() || controller.isDestroyed()) {
        throw new OutsideLifecycleException("Cannot bind to Controller lifecycle when outside of it.");
    } else if (controller.isAttached()) {
        initialState = ControllerEvent.ATTACH;
    } else if (controller.getView() != null) {
        initialState = ControllerEvent.CREATE_VIEW;
    } else if (controller.getActivity() != null) {
        initialState = ControllerEvent.CONTEXT_AVAILABLE;
    } else {
        initialState = ControllerEvent.CREATE;
    }
    final BehaviorSubject<ControllerEvent> subject = BehaviorSubject.create(initialState);
    controller.addLifecycleListener(new LifecycleListener() {

        @Override
        public void preContextAvailable(@NonNull Controller controller) {
            subject.onNext(ControllerEvent.CONTEXT_AVAILABLE);
        }

        @Override
        public void preCreateView(@NonNull Controller controller) {
            subject.onNext(ControllerEvent.CREATE_VIEW);
        }

        @Override
        public void preAttach(@NonNull Controller controller, @NonNull View view) {
            subject.onNext(ControllerEvent.ATTACH);
        }

        @Override
        public void preDetach(@NonNull Controller controller, @NonNull View view) {
            subject.onNext(ControllerEvent.DETACH);
        }

        @Override
        public void preDestroyView(@NonNull Controller controller, @NonNull View view) {
            subject.onNext(ControllerEvent.DESTROY_VIEW);
        }

        @Override
        public void preContextUnavailable(@NonNull Controller controller, @NonNull Context context) {
            subject.onNext(ControllerEvent.CONTEXT_UNAVAILABLE);
        }

        @Override
        public void preDestroy(@NonNull Controller controller) {
            subject.onNext(ControllerEvent.DESTROY);
        }
    });
    return subject;
}
Also used : Context(android.content.Context) OutsideLifecycleException(com.trello.rxlifecycle.OutsideLifecycleException) LifecycleListener(com.bluelinelabs.conductor.Controller.LifecycleListener) Controller(com.bluelinelabs.conductor.Controller) View(android.view.View)

Example 2 with LifecycleListener

use of com.bluelinelabs.conductor.Controller.LifecycleListener in project Conductor by bluelinelabs.

the class ControllerLifecycleCallbacksTests method testLifecycleCallOrder.

@Test
public void testLifecycleCallOrder() {
    final TestController testController = new TestController();
    final CallState callState = new CallState(false);
    testController.addLifecycleListener(new LifecycleListener() {

        @Override
        public void preCreateView(@NonNull Controller controller) {
            callState.createViewCalls++;
            assertEquals(1, callState.createViewCalls);
            assertEquals(0, testController.currentCallState.createViewCalls);
            assertEquals(0, callState.attachCalls);
            assertEquals(0, testController.currentCallState.attachCalls);
            assertEquals(0, callState.detachCalls);
            assertEquals(0, testController.currentCallState.detachCalls);
            assertEquals(0, callState.destroyViewCalls);
            assertEquals(0, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void postCreateView(@NonNull Controller controller, @NonNull View view) {
            callState.createViewCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(0, callState.attachCalls);
            assertEquals(0, testController.currentCallState.attachCalls);
            assertEquals(0, callState.detachCalls);
            assertEquals(0, testController.currentCallState.detachCalls);
            assertEquals(0, callState.destroyViewCalls);
            assertEquals(0, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void preAttach(@NonNull Controller controller, @NonNull View view) {
            callState.attachCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(1, callState.attachCalls);
            assertEquals(0, testController.currentCallState.attachCalls);
            assertEquals(0, callState.detachCalls);
            assertEquals(0, testController.currentCallState.detachCalls);
            assertEquals(0, callState.destroyViewCalls);
            assertEquals(0, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void postAttach(@NonNull Controller controller, @NonNull View view) {
            callState.attachCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(2, callState.attachCalls);
            assertEquals(1, testController.currentCallState.attachCalls);
            assertEquals(0, callState.detachCalls);
            assertEquals(0, testController.currentCallState.detachCalls);
            assertEquals(0, callState.destroyViewCalls);
            assertEquals(0, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void preDetach(@NonNull Controller controller, @NonNull View view) {
            callState.detachCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(2, callState.attachCalls);
            assertEquals(1, testController.currentCallState.attachCalls);
            assertEquals(1, callState.detachCalls);
            assertEquals(0, testController.currentCallState.detachCalls);
            assertEquals(0, callState.destroyViewCalls);
            assertEquals(0, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void postDetach(@NonNull Controller controller, @NonNull View view) {
            callState.detachCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(2, callState.attachCalls);
            assertEquals(1, testController.currentCallState.attachCalls);
            assertEquals(2, callState.detachCalls);
            assertEquals(1, testController.currentCallState.detachCalls);
            assertEquals(0, callState.destroyViewCalls);
            assertEquals(0, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void preDestroyView(@NonNull Controller controller, @NonNull View view) {
            callState.destroyViewCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(2, callState.attachCalls);
            assertEquals(1, testController.currentCallState.attachCalls);
            assertEquals(2, callState.detachCalls);
            assertEquals(1, testController.currentCallState.detachCalls);
            assertEquals(1, callState.destroyViewCalls);
            assertEquals(0, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void postDestroyView(@NonNull Controller controller) {
            callState.destroyViewCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(2, callState.attachCalls);
            assertEquals(1, testController.currentCallState.attachCalls);
            assertEquals(2, callState.detachCalls);
            assertEquals(1, testController.currentCallState.detachCalls);
            assertEquals(2, callState.destroyViewCalls);
            assertEquals(1, testController.currentCallState.destroyViewCalls);
            assertEquals(0, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void preDestroy(@NonNull Controller controller) {
            callState.destroyCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(2, callState.attachCalls);
            assertEquals(1, testController.currentCallState.attachCalls);
            assertEquals(2, callState.detachCalls);
            assertEquals(1, testController.currentCallState.detachCalls);
            assertEquals(2, callState.destroyViewCalls);
            assertEquals(1, testController.currentCallState.destroyViewCalls);
            assertEquals(1, callState.destroyCalls);
            assertEquals(0, testController.currentCallState.destroyCalls);
        }

        @Override
        public void postDestroy(@NonNull Controller controller) {
            callState.destroyCalls++;
            assertEquals(2, callState.createViewCalls);
            assertEquals(1, testController.currentCallState.createViewCalls);
            assertEquals(2, callState.attachCalls);
            assertEquals(1, testController.currentCallState.attachCalls);
            assertEquals(2, callState.detachCalls);
            assertEquals(1, testController.currentCallState.detachCalls);
            assertEquals(2, callState.destroyViewCalls);
            assertEquals(1, testController.currentCallState.destroyViewCalls);
            assertEquals(2, callState.destroyCalls);
            assertEquals(1, testController.currentCallState.destroyCalls);
        }
    });
    router.pushController(RouterTransaction.with(testController).pushChangeHandler(MockChangeHandler.defaultHandler()).popChangeHandler(MockChangeHandler.defaultHandler()));
    router.popController(testController);
    assertEquals(2, callState.createViewCalls);
    assertEquals(2, callState.attachCalls);
    assertEquals(2, callState.detachCalls);
    assertEquals(2, callState.destroyViewCalls);
    assertEquals(2, callState.destroyCalls);
}
Also used : TestController(com.bluelinelabs.conductor.util.TestController) LifecycleListener(com.bluelinelabs.conductor.Controller.LifecycleListener) CallState(com.bluelinelabs.conductor.util.CallState) TestController(com.bluelinelabs.conductor.util.TestController) View(android.view.View) Test(org.junit.Test)

Example 3 with LifecycleListener

use of com.bluelinelabs.conductor.Controller.LifecycleListener in project Conductor by bluelinelabs.

the class RouterTests method testIsBeingDestroyed.

@Test
public void testIsBeingDestroyed() {
    final LifecycleListener lifecycleListener = new LifecycleListener() {

        @Override
        public void preDestroyView(@NonNull Controller controller, @NonNull View view) {
            assertTrue(controller.isBeingDestroyed());
        }
    };
    Controller controller1 = new TestController();
    Controller controller2 = new TestController();
    controller2.addLifecycleListener(lifecycleListener);
    router.setRoot(RouterTransaction.with(controller1));
    router.pushController(RouterTransaction.with(controller2));
    assertFalse(controller1.isBeingDestroyed());
    assertFalse(controller2.isBeingDestroyed());
    router.popCurrentController();
    assertFalse(controller1.isBeingDestroyed());
    assertTrue(controller2.isBeingDestroyed());
    Controller controller3 = new TestController();
    controller3.addLifecycleListener(lifecycleListener);
    router.pushController(RouterTransaction.with(controller3));
    assertFalse(controller1.isBeingDestroyed());
    assertFalse(controller3.isBeingDestroyed());
    router.popToRoot();
    assertFalse(controller1.isBeingDestroyed());
    assertTrue(controller3.isBeingDestroyed());
}
Also used : NonNull(android.support.annotation.NonNull) TestController(com.bluelinelabs.conductor.util.TestController) LifecycleListener(com.bluelinelabs.conductor.Controller.LifecycleListener) TestController(com.bluelinelabs.conductor.util.TestController) View(android.view.View) Test(org.junit.Test)

Example 4 with LifecycleListener

use of com.bluelinelabs.conductor.Controller.LifecycleListener in project Conductor by bluelinelabs.

the class Router method destroy.

void destroy(boolean popViews) {
    popsLastView = true;
    final List<RouterTransaction> poppedControllers = backstack.popAll();
    trackDestroyingControllers(poppedControllers);
    if (popViews && poppedControllers.size() > 0) {
        RouterTransaction topTransaction = poppedControllers.get(0);
        topTransaction.controller().addLifecycleListener(new LifecycleListener() {

            @Override
            public void onChangeEnd(@NonNull Controller controller, @NonNull ControllerChangeHandler changeHandler, @NonNull ControllerChangeType changeType) {
                if (changeType == ControllerChangeType.POP_EXIT) {
                    for (int i = poppedControllers.size() - 1; i > 0; i--) {
                        RouterTransaction transaction = poppedControllers.get(i);
                        performControllerChange(null, transaction, true, new SimpleSwapChangeHandler());
                    }
                }
            }
        });
        performControllerChange(null, topTransaction, false, topTransaction.popChangeHandler());
    }
}
Also used : NoOpControllerChangeHandler(com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler) LifecycleListener(com.bluelinelabs.conductor.Controller.LifecycleListener) SimpleSwapChangeHandler(com.bluelinelabs.conductor.changehandler.SimpleSwapChangeHandler)

Example 5 with LifecycleListener

use of com.bluelinelabs.conductor.Controller.LifecycleListener in project Conductor by bluelinelabs.

the class Router method trackDestroyingController.

private void trackDestroyingController(@NonNull RouterTransaction transaction) {
    if (!transaction.controller.isDestroyed()) {
        destroyingControllers.add(transaction.controller);
        transaction.controller.addLifecycleListener(new LifecycleListener() {

            @Override
            public void postDestroy(@NonNull Controller controller) {
                destroyingControllers.remove(controller);
            }
        });
    }
}
Also used : LifecycleListener(com.bluelinelabs.conductor.Controller.LifecycleListener)

Aggregations

LifecycleListener (com.bluelinelabs.conductor.Controller.LifecycleListener)5 View (android.view.View)3 TestController (com.bluelinelabs.conductor.util.TestController)2 Test (org.junit.Test)2 Context (android.content.Context)1 NonNull (android.support.annotation.NonNull)1 Controller (com.bluelinelabs.conductor.Controller)1 SimpleSwapChangeHandler (com.bluelinelabs.conductor.changehandler.SimpleSwapChangeHandler)1 NoOpControllerChangeHandler (com.bluelinelabs.conductor.internal.NoOpControllerChangeHandler)1 CallState (com.bluelinelabs.conductor.util.CallState)1 OutsideLifecycleException (com.trello.rxlifecycle.OutsideLifecycleException)1