I stumbled upon this question in search of a similar answer. Using the concepts from Stefano Dachilโs article on IdlingResources , I built the following idle resource, waiting for the Activity to take an active action before starting. In my case, I know that the dialog shows when there is a fragment with a specific tag. This is not the same as the OP test, but the concepts should translate well.
public class BusyWhenFragmentExistsInActivityIdlingResource implements IdlingResource { private FragmentActivity activity = null; private final String fragmentTag; private ResourceCallback resourceCallback; private boolean wasIdleLastTime = true; // Start off as idle private final String name; // Need this strong reference because ActivityLifecycleMonitorRegistry won't hold one private final ActivityLifecycleCallback activityLifecycleCallback; public BusyWhenFragmentExistsInActivityIdlingResource( final Class<? extends FragmentActivity> clazz, final String fragmentTag ){ name = BusyWhenFragmentExistsInActivityIdlingResource.class.getSimpleName()+" "+clazz.getSimpleName(); this.fragmentTag = fragmentTag; activityLifecycleCallback = new ActivityLifecycleCallback() { @Override public void onActivityLifecycleChanged(Activity activity, Stage stage) { if (!FragmentActivity.class.isAssignableFrom(activity.getClass())) { return; } FragmentActivity fragmentActivity = (FragmentActivity) activity; if (!clazz.isAssignableFrom(fragmentActivity.getClass())) { return; } switch (stage){ case RESUMED: BusyWhenFragmentExistsInActivityIdlingResource.this.activity = fragmentActivity; break; case STOPPED: BusyWhenFragmentExistsInActivityIdlingResource.this.activity = null; break; } } }; ActivityLifecycleMonitorRegistry.getInstance() .addLifecycleCallback(activityLifecycleCallback); } @Override public String getName() { return name; } @Override public boolean isIdleNow() { if (activity==null) { return wasIdleLastTime = true; } boolean isIdleThisTime = activity .getSupportFragmentManager() .findFragmentByTag(fragmentTag)==null; if (!wasIdleLastTime && isIdleThisTime && resourceCallback!=null){ resourceCallback.onTransitionToIdle(); } return wasIdleLastTime = isIdleThisTime; } @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { this.resourceCallback = resourceCallback; } }
To use it, add something similar to this test:
@Before public void setUp() throws Exception { registerIdlingResources(new BusyWhenFragmentExistsInActivityIdlingResource( SomeOtherActivity.class, BaseActivity.LOADING_DIALOG )); }
source share