package com.patryklenza.androidespressoidlingresource;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import java.util.concurrent.ArrayBlockingQueue;
import javax.inject.Singleton;
import dagger.Component;
import rx.Observable;
import rx.Subscriber;
public class GlobalApplication extends Application {
private static Observable<ActivityEvent> _activityEventStream;
private ApplicationComponent applicationComponent;
public static Observable<ActivityEvent> activityEventStream() {
return _activityEventStream;
}
@Override
public void onCreate() {
super.onCreate();
ActivityEventProducer activityEventProducer = new ActivityEventProducer();
_activityEventStream = Observable.create(activityEventProducer);
registerActivityLifecycleCallbacks(activityEventProducer);
applicationComponent = Dagger_GlobalApplication_ApplicationComponent.builder()
.restServicesModule(new RestServicesModule())
.build();
component().inject(this);
}
public ApplicationComponent component() {
return applicationComponent;
}
public void setApplicationComponent(ApplicationComponent component) {
this.applicationComponent = component;
}
@Singleton
@Component(modules = RestServicesModule.class)
public interface ApplicationComponent {
void inject(GlobalApplication application);
void inject(ThirdActivity thirdActivity);
}
private static class ActivityEventProducer implements ActivityLifecycleCallbacks, Observable.OnSubscribe<ActivityEvent> {
private ArrayBlockingQueue<ActivityEvent> activityEvents = new ArrayBlockingQueue<>(256, false);
private boolean anyOneSubscribed;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if(!anyOneSubscribed) {
return;
}
ActivityEvent activityEvent = new ActivityEvent();
activityEvent.setActivityClass(activity.getClass());
activityEvent.setEventKind(ActivityEventKind.CREATED);
activityEvents.add(activityEvent);
}
@Override
public void onActivityStarted(Activity activity) {
if(!anyOneSubscribed) {
return;
}
}
@Override
public void onActivityResumed(Activity activity) {
if(!anyOneSubscribed) {
return;
}
}
@Override
public void onActivityPaused(Activity activity) {
if(!anyOneSubscribed) {
return;
}
}
@Override
public void onActivityStopped(Activity activity) {
if(!anyOneSubscribed) {
return;
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
if(!anyOneSubscribed) {
return;
}
}
@Override
public void onActivityDestroyed(Activity activity) {
if(!anyOneSubscribed) {
return;
}
ActivityEvent activityEvent = new ActivityEvent();
activityEvent.setActivityClass(activity.getClass());
activityEvent.setEventKind(ActivityEventKind.DESTROYED);
activityEvents.add(activityEvent);
}
@Override
public void call(Subscriber<? super ActivityEvent> subscriber) {
anyOneSubscribed = true;
try {
while(!subscriber.isUnsubscribed()) {
ActivityEvent activityEvent = activityEvents.take();
subscriber.onNext(activityEvent);
}
} catch(Exception e) {
subscriber.onError(e);
} finally {
anyOneSubscribed = false;
activityEvents.clear();
}
}
}
}