diff --git a/EventBus/build.gradle b/EventBus/build.gradle index 16f57190..cc00933f 100644 --- a/EventBus/build.gradle +++ b/EventBus/build.gradle @@ -1,11 +1,22 @@ +buildscript { + repositories { + maven { url "https://plugins.gradle.org/m2/" } + } + + dependencies { + classpath "net.ltgt.gradle:gradle-apt-plugin:0.13" + } +} + apply plugin: 'java' apply plugin: 'maven' apply plugin: 'signing' apply plugin: 'idea' +apply plugin: 'net.ltgt.apt-idea' archivesBaseName = 'eventbus' group = 'org.greenrobot' -version = '3.1.1' +version = '3.2.0-SNAPSHOT' sourceCompatibility = 1.7 def isSnapshot = version.endsWith('-SNAPSHOT') @@ -18,6 +29,7 @@ if(isSnapshot) { repositories { mavenCentral() + google() } // Still unsupported, see http://issues.gradle.org/browse/GRADLE-784 @@ -32,6 +44,8 @@ dependencies { provided 'com.google.android:android-test:4.1.1.4' provided 'com.google.android:annotations:4.1.1.4' provided 'com.google.android:support-v4:r7' + provided "android.arch.lifecycle:runtime:1.0.3" + apt "android.arch.lifecycle:compiler:1.0.0" // deployerJars 'org.apache.maven.wagon:wagon-webdav-jackrabbit:2.4' deployerJars 'org.apache.maven.wagon:wagon-webdav:1.0-beta-2' } diff --git a/EventBus/src/org/greenrobot/eventbus/EventBus.java b/EventBus/src/org/greenrobot/eventbus/EventBus.java index 247cbb27..312f1ffd 100644 --- a/EventBus/src/org/greenrobot/eventbus/EventBus.java +++ b/EventBus/src/org/greenrobot/eventbus/EventBus.java @@ -15,6 +15,9 @@ */ package org.greenrobot.eventbus; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.LifecycleOwner; + import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; @@ -127,6 +130,45 @@ public EventBus() { executorService = builder.executorService; } + /** + * Adds an observer to the given {@link LifecycleOwner}s lifecycle to automatically register + * EventBus during an onCreated event and unregister during an onDestroy event. + *

+ * Requires dependency on Android Architecture Components Lifecycle package. + * + * @see #register(Object) + * @see #unregister(Object) + */ + public void observeCreateDestroy(LifecycleOwner lifecycleOwner) { + createAndAddObserver(lifecycleOwner, "org.greenrobot.eventbus.android.lifecycle.EventBusCreateDestroyObserver"); + } + + /** + * Adds an observer to the given {@link LifecycleOwner}s lifecycle to automatically register + * EventBus during an onStart event and unregister during an onStop event. + *

+ * Requires dependency on Android Architecture Components Lifecycle package. + * + * @see #register(Object) + * @see #unregister(Object) + */ + public void observeStartStop(LifecycleOwner lifecycleOwner) { + createAndAddObserver(lifecycleOwner, "org.greenrobot.eventbus.android.lifecycle.EventBusStartStopObserver"); + } + + private void createAndAddObserver(LifecycleOwner lifecycleOwner, String className) { + try { + Class observer = Class.forName(className); + LifecycleObserver instance = (LifecycleObserver) observer + .getDeclaredConstructor(LifecycleOwner.class, EventBus.class) + .newInstance(lifecycleOwner, this); + lifecycleOwner.getLifecycle().addObserver(instance); + } catch (Exception e) { + throw new EventBusException("Failed to create LifecycleObserver. " + + "Do you have a dependency on Android Architecture Components Lifecycles?", e); + } + } + /** * Registers the given subscriber to receive events. Subscribers must call {@link #unregister(Object)} once they * are no longer interested in receiving events. diff --git a/EventBus/src/org/greenrobot/eventbus/android/lifecycle/EventBusCreateDestroyObserver.java b/EventBus/src/org/greenrobot/eventbus/android/lifecycle/EventBusCreateDestroyObserver.java new file mode 100644 index 00000000..8fc0c0d3 --- /dev/null +++ b/EventBus/src/org/greenrobot/eventbus/android/lifecycle/EventBusCreateDestroyObserver.java @@ -0,0 +1,31 @@ +package org.greenrobot.eventbus.android.lifecycle; + +import android.arch.lifecycle.Lifecycle.Event; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.LifecycleOwner; +import android.arch.lifecycle.OnLifecycleEvent; + +import org.greenrobot.eventbus.EventBus; + + +public class EventBusCreateDestroyObserver implements LifecycleObserver { + + private final LifecycleOwner lifecycleOwner; + private final EventBus eventBus; + + public EventBusCreateDestroyObserver(LifecycleOwner lifecycleOwner, EventBus eventBus) { + this.lifecycleOwner = lifecycleOwner; + this.eventBus = eventBus; + } + + @OnLifecycleEvent(Event.ON_CREATE) + void register() { + eventBus.register(lifecycleOwner); + } + + @OnLifecycleEvent(Event.ON_DESTROY) + void unregister() { + eventBus.unregister(lifecycleOwner); + } + +} diff --git a/EventBus/src/org/greenrobot/eventbus/android/lifecycle/EventBusStartStopObserver.java b/EventBus/src/org/greenrobot/eventbus/android/lifecycle/EventBusStartStopObserver.java new file mode 100644 index 00000000..2cd89d01 --- /dev/null +++ b/EventBus/src/org/greenrobot/eventbus/android/lifecycle/EventBusStartStopObserver.java @@ -0,0 +1,31 @@ +package org.greenrobot.eventbus.android.lifecycle; + +import android.arch.lifecycle.Lifecycle.Event; +import android.arch.lifecycle.LifecycleObserver; +import android.arch.lifecycle.LifecycleOwner; +import android.arch.lifecycle.OnLifecycleEvent; + +import org.greenrobot.eventbus.EventBus; + + +public class EventBusStartStopObserver implements LifecycleObserver { + + private final LifecycleOwner lifecycleOwner; + private final EventBus eventBus; + + public EventBusStartStopObserver(LifecycleOwner lifecycleOwner, EventBus eventBus) { + this.lifecycleOwner = lifecycleOwner; + this.eventBus = eventBus; + } + + @OnLifecycleEvent(Event.ON_START) + void register() { + eventBus.register(lifecycleOwner); + } + + @OnLifecycleEvent(Event.ON_STOP) + void unregister() { + eventBus.unregister(lifecycleOwner); + } + +}