diff --git a/app/src/androidTest/java/com/beemdevelopment/aegis/IntroTest.java b/app/src/androidTest/java/com/beemdevelopment/aegis/IntroTest.java index b1d5f993..dd490a18 100644 --- a/app/src/androidTest/java/com/beemdevelopment/aegis/IntroTest.java +++ b/app/src/androidTest/java/com/beemdevelopment/aegis/IntroTest.java @@ -13,10 +13,13 @@ import static junit.framework.TestCase.assertNull; import static junit.framework.TestCase.assertTrue; import static org.hamcrest.Matchers.not; +import androidx.test.espresso.IdlingRegistry; +import androidx.test.espresso.IdlingResource; import androidx.test.espresso.ViewInteraction; import androidx.test.ext.junit.rules.ActivityScenarioRule; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; +import androidx.viewpager2.widget.ViewPager2; import com.beemdevelopment.aegis.rules.ScreenshotTestRule; import com.beemdevelopment.aegis.ui.IntroActivity; @@ -25,6 +28,8 @@ import com.beemdevelopment.aegis.vault.slots.BiometricSlot; import com.beemdevelopment.aegis.vault.slots.PasswordSlot; import com.beemdevelopment.aegis.vault.slots.SlotList; +import org.junit.After; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.RuleChain; @@ -39,9 +44,24 @@ import dagger.hilt.android.testing.HiltAndroidTest; public class IntroTest extends AegisTest { private final ActivityScenarioRule _activityRule = new ActivityScenarioRule<>(IntroActivity.class); + private ViewPager2IdlingResource _viewPager2IdlingResource; + @Rule public final TestRule testRule = RuleChain.outerRule(_activityRule).around(new ScreenshotTestRule()); + @Before + public void setUp() { + _activityRule.getScenario().onActivity(activity -> { + _viewPager2IdlingResource = new ViewPager2IdlingResource(activity.findViewById(R.id.pager), "viewPagerIdlingResource"); + IdlingRegistry.getInstance().register(_viewPager2IdlingResource); + }); + } + + @After + public void tearDown() { + IdlingRegistry.getInstance().unregister(_viewPager2IdlingResource); + } + @Test public void doIntro_None() { ViewInteraction next = onView(withId(R.id.btnNext)); @@ -56,7 +76,6 @@ public class IntroTest extends AegisTest { next.perform(click()); prev.check(matches(not(isDisplayed()))); next.perform(click()); - next.perform(click()); VaultRepository vault = _vaultManager.getVault(); assertFalse(vault.isEncryptionEnabled()); @@ -93,4 +112,39 @@ public class IntroTest extends AegisTest { assertTrue(slots.has(PasswordSlot.class)); assertFalse(slots.has(BiometricSlot.class)); } + + // Source: https://stackoverflow.com/a/32763454/12972657 + private static class ViewPager2IdlingResource implements IdlingResource { + private final String _resName; + private boolean _isIdle = true; + private IdlingResource.ResourceCallback _resourceCallback = null; + + public ViewPager2IdlingResource(ViewPager2 viewPager, String resName) { + viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageScrollStateChanged(int state) { + _isIdle = (state == ViewPager2.SCROLL_STATE_IDLE || state == ViewPager2.SCROLL_STATE_DRAGGING); + if (_isIdle && _resourceCallback != null) { + _resourceCallback.onTransitionToIdle(); + } + } + }); + _resName = resName; + } + + @Override + public String getName() { + return _resName; + } + + @Override + public boolean isIdleNow() { + return _isIdle; + } + + @Override + public void registerIdleTransitionCallback(IdlingResource.ResourceCallback resourceCallback) { + _resourceCallback = resourceCallback; + } + } }