Improved lifecycle integration of Conductor and Architecture Components (#383)

Previous mapping was:
- () -> ON_CREATE -> CREATED
- preCreateView -> ON_START -> STARTED
- preAttach -> ON_RESUME -> RESUMED
- preDetach -> ON_PAUSE -> STARTED
- preDestroyView -> ON_STOP -> CREATED
- preDestroy -> ON_DESTROY -> DESTROYED

New mapping is:
- () -> INITIALIZED
- postContextAvailable -> ON_CREATE -> CREATED
- postCreateView -> ON_START -> STARTED
- postAttach -> ON_RESUME -> RESUMED
- preDetach -> ON_PAUSE -> STARTED
- preDestroyView -> ON_STOP -> CREATED
- preContextUnavailable -> // do nothing
- preDestroy -> ON_DESTROY -> DESTROYED

Change-Id: I9f65480018dc1204dc89a8065fa7c7f554ad7dd2
This commit is contained in:
Stephan Schuster
2018-05-25 21:41:06 +02:00
committed by Eric Kuck
parent 9e3095957c
commit 91da937d4f
6 changed files with 122 additions and 136 deletions
@@ -0,0 +1,66 @@
package com.bluelinelabs.conductor.archlifecycle;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.Lifecycle.Event;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.LifecycleRegistry;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View;
import com.bluelinelabs.conductor.Controller;
import com.bluelinelabs.conductor.Controller.LifecycleListener;
public class ControllerLifecycleOwner implements LifecycleOwner {
private final LifecycleRegistry mLifecycleRegistry;
public <T extends Controller & LifecycleOwner> ControllerLifecycleOwner(@NonNull T lifecycleController) {
mLifecycleRegistry = new LifecycleRegistry(lifecycleController); // --> State.INITIALIZED
lifecycleController.addLifecycleListener(new LifecycleListener() {
@Override
public void postContextAvailable(@NonNull Controller controller, @NonNull Context context) {
mLifecycleRegistry.handleLifecycleEvent(Event.ON_CREATE); // --> State.CREATED;
}
@Override
public void postCreateView(@NonNull Controller controller, @NonNull View view) {
mLifecycleRegistry.handleLifecycleEvent(Event.ON_START); // --> State.STARTED;
}
@Override
public void postAttach(@NonNull Controller controller, @NonNull View view) {
mLifecycleRegistry.handleLifecycleEvent(Event.ON_RESUME); // --> State.RESUMED;
}
@Override
public void preDetach(@NonNull Controller controller, @NonNull View view) {
mLifecycleRegistry.handleLifecycleEvent(Event.ON_PAUSE); // --> State.STARTED;
}
@Override
public void preDestroyView(@NonNull Controller controller, @NonNull View view) {
mLifecycleRegistry.handleLifecycleEvent(Event.ON_STOP); // --> State.CREATED;
}
@Override
public void preContextUnavailable(@NonNull Controller controller, @NonNull Context context) {
// do nothing
}
@Override
public void preDestroy(@NonNull Controller controller) {
mLifecycleRegistry.handleLifecycleEvent(Event.ON_DESTROY); // --> State.DESTROYED;
}
});
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
@@ -1,79 +0,0 @@
package com.bluelinelabs.conductor.archlifecycle;
import android.arch.lifecycle.Lifecycle.Event;
import android.arch.lifecycle.Lifecycle.State;
import android.arch.lifecycle.LifecycleRegistry;
import android.arch.lifecycle.LifecycleRegistryOwner;
import android.support.annotation.NonNull;
import android.view.View;
import com.bluelinelabs.conductor.Controller;
import com.bluelinelabs.conductor.Controller.LifecycleListener;
public class ControllerLifecycleRegistryOwner extends LifecycleListener implements LifecycleRegistryOwner {
final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
public ControllerLifecycleRegistryOwner(Controller controller) {
lifecycleRegistry.handleLifecycleEvent(Event.ON_CREATE);
lifecycleRegistry.markState(State.CREATED);
controller.addLifecycleListener(new LifecycleListener() {
@Override
public void preCreateView(@NonNull Controller controller) {
lifecycleRegistry.handleLifecycleEvent(Event.ON_START);
}
@Override
public void postCreateView(@NonNull Controller controller, @NonNull View view) {
lifecycleRegistry.markState(State.STARTED);
}
@Override
public void preAttach(@NonNull Controller controller, @NonNull View view) {
lifecycleRegistry.handleLifecycleEvent(Event.ON_RESUME);
}
@Override
public void postAttach(@NonNull Controller controller, @NonNull View view) {
lifecycleRegistry.markState(State.RESUMED);
}
@Override
public void preDetach(@NonNull Controller controller, @NonNull View view) {
lifecycleRegistry.handleLifecycleEvent(Event.ON_PAUSE);
}
@Override
public void postDetach(@NonNull Controller controller, @NonNull View view) {
lifecycleRegistry.markState(State.STARTED);
}
@Override
public void preDestroyView(@NonNull Controller controller, @NonNull View view) {
lifecycleRegistry.handleLifecycleEvent(Event.ON_STOP);
}
@Override
public void postDestroyView(@NonNull Controller controller) {
lifecycleRegistry.markState(State.CREATED);
}
@Override
public void preDestroy(@NonNull Controller controller) {
lifecycleRegistry.handleLifecycleEvent(Event.ON_DESTROY);
}
@Override
public void postDestroy(@NonNull Controller controller) {
lifecycleRegistry.markState(State.DESTROYED);
}
});
}
@Override
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;
}
}
@@ -1,15 +1,16 @@
package com.bluelinelabs.conductor.archlifecycle;
import android.arch.lifecycle.LifecycleRegistry;
import android.arch.lifecycle.LifecycleRegistryOwner;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.bluelinelabs.conductor.Controller;
public abstract class LifecycleController extends Controller implements LifecycleRegistryOwner {
public abstract class LifecycleController extends Controller implements LifecycleOwner {
private final ControllerLifecycleRegistryOwner lifecycleRegistryOwner = new ControllerLifecycleRegistryOwner(this);
private final ControllerLifecycleOwner mLifecycleOwner = new ControllerLifecycleOwner(this);
public LifecycleController() {
super();
@@ -19,9 +20,10 @@ public abstract class LifecycleController extends Controller implements Lifecycl
super(args);
}
@NonNull
@Override
public LifecycleRegistry getLifecycle() {
return lifecycleRegistryOwner.getLifecycle();
public Lifecycle getLifecycle() {
return mLifecycleOwner.getLifecycle();
}
}
@@ -1,17 +1,29 @@
package com.bluelinelabs.conductor.archlifecycle;
import android.arch.lifecycle.LifecycleRegistry;
import android.arch.lifecycle.LifecycleRegistryOwner;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.bluelinelabs.conductor.RestoreViewOnCreateController;
public abstract class LifecycleRestoreViewOnCreateController extends RestoreViewOnCreateController implements LifecycleRegistryOwner {
public abstract class LifecycleRestoreViewOnCreateController extends RestoreViewOnCreateController implements LifecycleOwner {
private final ControllerLifecycleRegistryOwner lifecycleRegistryOwner = new ControllerLifecycleRegistryOwner(this);
private final ControllerLifecycleOwner mLifecycleOwner = new ControllerLifecycleOwner(this);
public LifecycleRestoreViewOnCreateController() {
super();
}
public LifecycleRestoreViewOnCreateController(@Nullable Bundle args) {
super(args);
}
@NonNull
@Override
public LifecycleRegistry getLifecycle() {
return lifecycleRegistryOwner.getLifecycle();
public Lifecycle getLifecycle() {
return mLifecycleOwner.getLifecycle();
}
}
@@ -2,7 +2,9 @@ package com.bluelinelabs.conductor.demo.controllers;
import android.arch.lifecycle.Lifecycle.Event;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.util.Log;
@@ -35,47 +37,28 @@ public class ArchLifecycleController extends LifecycleController {
private boolean hasExited;
public ArchLifecycleController() {
LifecycleObserver lifecycleObserver = new LifecycleObserver() {
@OnLifecycleEvent(Event.ON_CREATE)
void onCreate() {
Log.d(TAG, "LifecycleObserver onCreate() called");
Log.i(TAG, "Conductor: Constructor called");
getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Event.ON_ANY)
void onLifecycleEvent(@NonNull LifecycleOwner source, @NonNull Event event) {
Log.d(TAG, "Lifecycle: " + source.getClass().getSimpleName() + " emitted event " + event + " and is now in state " + source.getLifecycle().getCurrentState());
}
});
@OnLifecycleEvent(Event.ON_START)
void onStart() {
Log.d(TAG, "LifecycleObserver onStart() called");
}
Log.d(TAG, "Lifecycle: " + getClass().getSimpleName() + " is now in state " + getLifecycle().getCurrentState());
}
@OnLifecycleEvent(Event.ON_RESUME)
void onResume() {
Log.d(TAG, "LifecycleObserver onResume() called");
}
@OnLifecycleEvent(Event.ON_PAUSE)
void onPause() {
Log.d(TAG, "LifecycleObserver onPause() called");
}
@OnLifecycleEvent(Event.ON_STOP)
void onStop() {
Log.d(TAG, "LifecycleObserver onStop() called");
}
@OnLifecycleEvent(Event.ON_DESTROY)
void onDestroy() {
Log.d(TAG, "LifecycleObserver onDestroy() called");
}
};
Log.i(TAG, "constructor called");
getLifecycle().addObserver(lifecycleObserver);
@Override
protected void onContextAvailable(@NonNull Context context) {
Log.i(TAG, "Conductor: onContextAvailable() called");
super.onContextAvailable(context);
}
@NonNull
@Override
protected View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
Log.i(TAG, "onCreateView() called");
Log.i(TAG, "Conductor: onCreateView() called");
View view = inflater.inflate(R.layout.controller_lifecycle, container, false);
view.setBackgroundColor(ContextCompat.getColor(container.getContext(), R.color.orange_300));
@@ -88,36 +71,38 @@ public class ArchLifecycleController extends LifecycleController {
@Override
protected void onAttach(@NonNull View view) {
Log.i(TAG, "Conductor: onAttach() called");
super.onAttach(view);
Log.i(TAG, "onAttach() called");
(((ActionBarProvider) getActivity()).getSupportActionBar()).setTitle("Arch Components Lifecycle Demo");
}
@Override
protected void onDestroyView(@NonNull View view) {
super.onDestroyView(view);
protected void onDetach(@NonNull View view) {
Log.i(TAG, "Conductor: onDetach() called");
super.onDetach(view);
}
Log.i(TAG, "onDestroyView() called");
@Override
protected void onDestroyView(@NonNull View view) {
Log.i(TAG, "Conductor: onDestroyView() called");
super.onDestroyView(view);
unbinder.unbind();
unbinder = null;
}
@Override
protected void onDetach(@NonNull View view) {
super.onDetach(view);
Log.i(TAG, "onDetach() called");
protected void onContextUnavailable() {
Log.i(TAG, "Conductor: onContextUnavailable() called");
super.onContextUnavailable();
}
@Override
public void onDestroy() {
Log.i(TAG, "Conductor: onDestroy() called");
super.onDestroy();
Log.i(TAG, "onDestroy() called");
if (hasExited) {
DemoApplication.refWatcher.watch(this);
}
+1 -1
View File
@@ -13,7 +13,7 @@ ext {
rxLifecycleVersion = '0.8.0'
rxLifecycle2Version = '2.0'
autodisposeVersion = '0.8.0'
archComponentsVersion = '1.0.0-alpha3'
archComponentsVersion = '1.1.1'
junitVersion = '4.11'
roboelectricVersion = '3.0'
lintVersion = '25.2.0'