From 19a46afe7b44922d037904fea1be91b02b2838d3 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Wed, 26 Jan 2022 17:46:23 +0000 Subject: [PATCH] untracking activities during espresso runs as soon as they're idle - Sometimes activities are instantly idle without going through the lifecycleChanged callback which means we were registering callsbacks which were duplicated and triggering for later waits --- .../java/im/vector/app/EspressoExt.kt | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/vector/src/androidTest/java/im/vector/app/EspressoExt.kt b/vector/src/androidTest/java/im/vector/app/EspressoExt.kt index 59982c72aa..59ad122f36 100644 --- a/vector/src/androidTest/java/im/vector/app/EspressoExt.kt +++ b/vector/src/androidTest/java/im/vector/app/EspressoExt.kt @@ -160,43 +160,50 @@ fun initialSyncIdlingResource(session: Session): IdlingResource { } fun activityIdlingResource(activityClass: Class<*>): IdlingResource { + val lifecycleMonitor = ActivityLifecycleMonitorRegistry.getInstance() + val res = object : IdlingResource, ActivityLifecycleCallback { private var callback: IdlingResource.ResourceCallback? = null + private var resumedActivity: Activity? = null + private val uniqTS = System.currentTimeMillis() - var hasResumed = false - private var currentActivity: Activity? = null - - val uniqTS = System.currentTimeMillis() override fun getName() = "activityIdlingResource_${activityClass.name}_$uniqTS" override fun isIdleNow(): Boolean { - val currentActivity = currentActivity ?: ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED).elementAtOrNull(0) + val activity = resumedActivity ?: ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED).firstOrNull { + activityClass == it.javaClass + } - val isIdle = hasResumed || currentActivity?.javaClass?.let { activityClass.isAssignableFrom(it) } ?: false - println("*** [$name] isIdleNow activityIdlingResource $currentActivity isIdle:$isIdle") + val isIdle = activity != null + if (isIdle) { + unregister() + } return isIdle } override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) { println("*** [$name] registerIdleTransitionCallback $callback") this.callback = callback - // if (hasResumed) callback?.onTransitionToIdle() } override fun onActivityLifecycleChanged(activity: Activity?, stage: Stage?) { - println("*** [$name] onActivityLifecycleChanged $activity $stage") - currentActivity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED).elementAtOrNull(0) - val isIdle = currentActivity?.javaClass?.let { activityClass.isAssignableFrom(it) } ?: false - println("*** [$name] onActivityLifecycleChanged $currentActivity isIdle:$isIdle") - if (isIdle) { - hasResumed = true - println("*** [$name] onActivityLifecycleChanged callback: $callback") - callback?.onTransitionToIdle() - ActivityLifecycleMonitorRegistry.getInstance().removeLifecycleCallback(this) + if (activityClass == activity?.javaClass) { + when (stage) { + Stage.RESUMED -> { + unregister() + resumedActivity = activity + println("*** [$name] onActivityLifecycleChanged callback: $callback") + callback?.onTransitionToIdle() + } + } } } + + private fun unregister() { + lifecycleMonitor.removeLifecycleCallback(this) + } } - ActivityLifecycleMonitorRegistry.getInstance().addLifecycleCallback(res) + lifecycleMonitor.addLifecycleCallback(res) return res }