package com.meg7.soas.espresso;
import android.app.Activity;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyLog;
import com.google.android.apps.common.testing.ui.espresso.IdlingResource;
import com.google.common.base.Preconditions;
import com.meg7.soas.SoasApplication;
import java.lang.reflect.Field;
import java.util.Set;
// Based on https://github.com/bolhoso/espresso-volley-tests/blob/master/EspressoTest/src/com/example/espressovolley/test/MyTest.java
public class VolleyIdlingResource implements IdlingResource {
private final String mResourceName;
// Write on main thread, read from any thread.
private volatile ResourceCallback mResourceCallback;
private Field mCurrentRequests;
private RequestQueue mVolleyRequestQueue;
public VolleyIdlingResource(Activity activity, String resourceName) throws SecurityException, NoSuchFieldException {
mResourceName = Preconditions.checkNotNull(resourceName);
mVolleyRequestQueue = SoasApplication.getRequestQueue(activity);
mCurrentRequests = RequestQueue.class.getDeclaredField("mCurrentRequests");
mCurrentRequests.setAccessible(true);
}
@Override
public String getName() {
return mResourceName;
}
@Override
public boolean isIdleNow() {
try {
Set<Request> set = (Set<Request>) mCurrentRequests.get(mVolleyRequestQueue);
if (set != null) {
int count = set.size();
if (count == 0) {
VolleyLog.d("Volley is idle! With count :: " + count);
mResourceCallback.onTransitionToIdle();
} else {
VolleyLog.d("Volley is Not idle! With count :: " + count);
}
return count == 0;
}
} catch (Exception e) {
VolleyLog.e(e.getMessage());
}
VolleyLog.d("Something went wrong!");
return true;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
mResourceCallback = resourceCallback;
}
}