package com.hitherejoe.androidtestcommon.util;
import android.support.test.espresso.IdlingResource;
import java.util.concurrent.atomic.AtomicInteger;
import timber.log.Timber;
/**
* Espresso Idling resource that handles waiting for RxJava Observables executions.
* This class must be used with RxIdlingExecutionHook.
* Before registering this idling resource you must:
* 1. Create an instance of RxIdlingExecutionHook by passing an instance of this class.
* 2. Register RxIdlingExecutionHook with the RxJavaPlugins using registerObservableExecutionHook()
* 3. Register this idle resource with Espresso using Espresso.registerIdlingResources()
*/
public class RxIdlingResource implements IdlingResource {
private final AtomicInteger mActiveSubscriptionsCount = new AtomicInteger(0);
private ResourceCallback mResourceCallback;
@Override
public String getName() {
return getClass().getSimpleName();
}
@Override
public boolean isIdleNow() {
return mActiveSubscriptionsCount.get() <= 0;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback callback) {
mResourceCallback = callback;
}
public void incrementActiveSubscriptionsCount() {
int count = mActiveSubscriptionsCount.incrementAndGet();
Timber.i("Active subscriptions count increased to %d", count);
}
public void decrementActiveSubscriptionsCount() {
int count = mActiveSubscriptionsCount.decrementAndGet();
Timber.i("Active subscriptions count decreased to %d", count);
if (isIdleNow()) {
Timber.i("There is no active subscriptions, transitioning to Idle");
mResourceCallback.onTransitionToIdle();
}
}
}