From 9f6a94dee2e39ee24d6d31d37544c0584aa37b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Fri, 26 May 2023 12:05:49 +0200 Subject: [PATCH 01/10] Change folder for compose-reports Change-Id: I7757f13c36c60991586224707f91f8ac8c0beae8 --- .../com/google/samples/apps/nowinandroid/AndroidCompose.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index 5997f7d4e..ebf82b970 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -61,7 +61,7 @@ private fun Project.buildComposeMetricsParameters(): List { val enableMetricsProvider = project.providers.gradleProperty("enableComposeCompilerMetrics") val enableMetrics = (enableMetricsProvider.orNull == "true") if (enableMetrics) { - val metricsFolder = File(project.buildDir, "compose-metrics") + val metricsFolder = File(project.rootProject.buildDir, "compose-metrics") metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" + metricsFolder.absolutePath @@ -71,7 +71,7 @@ private fun Project.buildComposeMetricsParameters(): List { val enableReportsProvider = project.providers.gradleProperty("enableComposeCompilerReports") val enableReports = (enableReportsProvider.orNull == "true") if (enableReports) { - val reportsFolder = File(project.buildDir, "compose-reports") + val reportsFolder = File(project.rootProject.buildDir, "compose-reports") metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + reportsFolder.absolutePath From ca8b22e798f01aa7df87c1d2fe1babd15b341b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Fri, 26 May 2023 12:07:38 +0200 Subject: [PATCH 02/10] Update README Change-Id: I36e98760b254be00d591d8d719dcbc57a8dd8d62 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9aca22cbd..cb97c2a6b 100644 --- a/README.md +++ b/README.md @@ -159,8 +159,8 @@ Run the following command to get and analyse compose compiler metrics: ./gradlew assembleRelease -PenableComposeCompilerMetrics=true -PenableComposeCompilerReports=true ``` -The reports files will be added to build/compose-reports in each module. The metrics files will be -added to build/compose-metrics in each module. +The reports files will be added to build/compose-reports in root folder. The metrics files will also be +added to build/compose-metrics in root folder. For more information on Compose compiler metrics, see [this blog post](https://medium.com/androiddevelopers/jetpack-compose-stability-explained-79c10db270c8). From d549ca6c7a4fdb12366c87a565a01e3b4c76439d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Fri, 26 May 2023 16:15:05 +0200 Subject: [PATCH 03/10] Apply suggestions from code review Co-authored-by: Simon Marquis --- README.md | 4 ++-- .../com/google/samples/apps/nowinandroid/AndroidCompose.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index cb97c2a6b..ae8c3b3aa 100644 --- a/README.md +++ b/README.md @@ -159,8 +159,8 @@ Run the following command to get and analyse compose compiler metrics: ./gradlew assembleRelease -PenableComposeCompilerMetrics=true -PenableComposeCompilerReports=true ``` -The reports files will be added to build/compose-reports in root folder. The metrics files will also be -added to build/compose-metrics in root folder. +The reports files will be added to [build/compose-reports](build/compose-reports). The metrics files will also be +added to [build/compose-metrics](build/compose-metrics). For more information on Compose compiler metrics, see [this blog post](https://medium.com/androiddevelopers/jetpack-compose-stability-explained-79c10db270c8). diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index ebf82b970..393c68535 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -61,7 +61,7 @@ private fun Project.buildComposeMetricsParameters(): List { val enableMetricsProvider = project.providers.gradleProperty("enableComposeCompilerMetrics") val enableMetrics = (enableMetricsProvider.orNull == "true") if (enableMetrics) { - val metricsFolder = File(project.rootProject.buildDir, "compose-metrics") + val metricsFolder = rootProject.buildDir.resolve("compose-metrics") metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" + metricsFolder.absolutePath @@ -71,7 +71,7 @@ private fun Project.buildComposeMetricsParameters(): List { val enableReportsProvider = project.providers.gradleProperty("enableComposeCompilerReports") val enableReports = (enableReportsProvider.orNull == "true") if (enableReports) { - val reportsFolder = File(project.rootProject.buildDir, "compose-reports") + val reportsFolder = rootProject.buildDir.resolve("compose-reports") metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + reportsFolder.absolutePath From f577fb06cc9e3d3695587c5a6b8eac6c0f8b7db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Fri, 26 May 2023 16:29:36 +0200 Subject: [PATCH 04/10] Add project path subfolder Change-Id: I1b680a37ecbd80b894b0d1b649633936cbe41328 --- .../com/google/samples/apps/nowinandroid/AndroidCompose.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index 393c68535..ed0d38335 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -23,7 +23,6 @@ import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.io.File /** * Configure Compose-specific options @@ -59,9 +58,11 @@ internal fun Project.configureAndroidCompose( private fun Project.buildComposeMetricsParameters(): List { val metricParameters = mutableListOf() val enableMetricsProvider = project.providers.gradleProperty("enableComposeCompilerMetrics") + val projectPath = project.path.replace(':', '_').drop(1) + val enableMetrics = (enableMetricsProvider.orNull == "true") if (enableMetrics) { - val metricsFolder = rootProject.buildDir.resolve("compose-metrics") + val metricsFolder = rootProject.buildDir.resolve("compose-metrics/$projectPath") metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" + metricsFolder.absolutePath @@ -71,7 +72,7 @@ private fun Project.buildComposeMetricsParameters(): List { val enableReportsProvider = project.providers.gradleProperty("enableComposeCompilerReports") val enableReports = (enableReportsProvider.orNull == "true") if (enableReports) { - val reportsFolder = rootProject.buildDir.resolve("compose-reports") + val reportsFolder = rootProject.buildDir.resolve("compose-reports/$projectPath") metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + reportsFolder.absolutePath From 375480a2f912044362d6518cd1ccd94668330bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Mon, 29 May 2023 09:42:16 +0200 Subject: [PATCH 05/10] Make paths relative Change-Id: Iefdf9b2a0313bbdc0532450bb10ca9b7cca41014 --- .../com/google/samples/apps/nowinandroid/AndroidCompose.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt index ed0d38335..3051d0635 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/AndroidCompose.kt @@ -58,11 +58,11 @@ internal fun Project.configureAndroidCompose( private fun Project.buildComposeMetricsParameters(): List { val metricParameters = mutableListOf() val enableMetricsProvider = project.providers.gradleProperty("enableComposeCompilerMetrics") - val projectPath = project.path.replace(':', '_').drop(1) + val relativePath = projectDir.relativeTo(rootDir) val enableMetrics = (enableMetricsProvider.orNull == "true") if (enableMetrics) { - val metricsFolder = rootProject.buildDir.resolve("compose-metrics/$projectPath") + val metricsFolder = rootProject.buildDir.resolve("compose-metrics").resolve(relativePath) metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" + metricsFolder.absolutePath @@ -72,7 +72,7 @@ private fun Project.buildComposeMetricsParameters(): List { val enableReportsProvider = project.providers.gradleProperty("enableComposeCompilerReports") val enableReports = (enableReportsProvider.orNull == "true") if (enableReports) { - val reportsFolder = rootProject.buildDir.resolve("compose-reports/$projectPath") + val reportsFolder = rootProject.buildDir.resolve("compose-reports").resolve(relativePath) metricParameters.add("-P") metricParameters.add( "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" + reportsFolder.absolutePath From 0f98e4b7099f94d568b48a1a13830894aa2dc9bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Mon, 29 May 2023 10:46:02 +0200 Subject: [PATCH 06/10] Simplify StartupBenchmark to just use StartupMode.COLD Change-Id: I70186c3fdab43fb1ceebcce62105666551ede269 --- .../nowinandroid/startup/StartupBenchmark.kt | 30 ++++--------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt index 8e396eda3..678102f78 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt @@ -19,45 +19,24 @@ package com.google.samples.apps.nowinandroid.startup import androidx.benchmark.macro.BaselineProfileMode.Disable import androidx.benchmark.macro.BaselineProfileMode.Require import androidx.benchmark.macro.CompilationMode -import androidx.benchmark.macro.StartupMode import androidx.benchmark.macro.StartupMode.COLD -import androidx.benchmark.macro.StartupMode.HOT -import androidx.benchmark.macro.StartupMode.WARM import androidx.benchmark.macro.StartupTimingMetric import androidx.benchmark.macro.junit4.MacrobenchmarkRule import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner import com.google.samples.apps.nowinandroid.PACKAGE_NAME +import com.google.samples.apps.nowinandroid.allowNotifications import com.google.samples.apps.nowinandroid.foryou.forYouWaitForContent import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith /** + * Enables app startups from various states of baseline profile or [CompilationMode]s. * Run this benchmark from Studio to see startup measurements, and captured system traces * for investigating your app's performance from a cold state. */ @RunWith(AndroidJUnit4ClassRunner::class) -class ColdStartupBenchmark : AbstractStartupBenchmark(COLD) - -/** - * Run this benchmark from Studio to see startup measurements, and captured system traces - * for investigating your app's performance from a warm state. - */ -@RunWith(AndroidJUnit4ClassRunner::class) -class WarmStartupBenchmark : AbstractStartupBenchmark(WARM) - -/** - * Run this benchmark from Studio to see startup measurements, and captured system traces - * for investigating your app's performance from a hot state. - */ -@RunWith(AndroidJUnit4ClassRunner::class) -class HotStartupBenchmark : AbstractStartupBenchmark(HOT) - -/** - * Base class for benchmarks with different startup modes. - * Enables app startups from various states of baseline profile or [CompilationMode]s. - */ -abstract class AbstractStartupBenchmark(private val startupMode: StartupMode) { +class StartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() @@ -80,9 +59,10 @@ abstract class AbstractStartupBenchmark(private val startupMode: StartupMode) { metrics = listOf(StartupTimingMetric()), compilationMode = compilationMode, iterations = 10, - startupMode = startupMode, + startupMode = COLD, setupBlock = { pressHome() + allowNotifications() }, ) { startActivityAndWait() From 7bee6d2f37b857c82c34997ffffc3e3248dd3442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Mon, 29 May 2023 10:58:29 +0200 Subject: [PATCH 07/10] Add waitAndFind helper Change-Id: I7498dda3eb686d15829d89688695866ae8382c6e --- .../androidx/test/uiautomator/UiAutomatorHelpers.kt | 12 ++++++++++++ .../apps/nowinandroid/foryou/ForYouActions.kt | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt index 85867b982..766de00e1 100644 --- a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt +++ b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt @@ -46,3 +46,15 @@ enum class HasChildrenOp { EXACTLY, AT_MOST, } + +/** + * Waits until an object with [selector] if visible on screen and returns the object. + * If the element is not available in [timeout], throws [AssertionError] + */ +fun UiDevice.waitAndFindObject(selector: BySelector, timeout: Long): UiObject2 { + if (!wait(Until.hasObject(selector), timeout)) { + throw AssertionError("Element not found on screen in ${timeout}ms (selector=$selector)") + } + + return findObject(selector) +} diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index 5e4952fbb..bb21f3d39 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -20,6 +20,7 @@ import androidx.benchmark.macro.MacrobenchmarkScope import androidx.test.uiautomator.By import androidx.test.uiautomator.Until import androidx.test.uiautomator.untilHasChildren +import androidx.test.uiautomator.waitAndFindObject import com.google.samples.apps.nowinandroid.flingElementDownUp fun MacrobenchmarkScope.forYouWaitForContent() { @@ -27,7 +28,7 @@ fun MacrobenchmarkScope.forYouWaitForContent() { device.wait(Until.gone(By.res("loadingWheel")), 5_000) // Sometimes, the loading wheel is gone, but the content is not loaded yet // So we'll wait here for topics to be sure - val obj = device.findObject(By.res("forYou:topicSelection")) + val obj = device.waitAndFindObject(By.res("forYou:topicSelection"), 10_000) // Timeout here is quite big, because sometimes data loading takes a long time! obj.wait(untilHasChildren(), 60_000) } From 951e968aa4967042532296675c3f7555f9973814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Mon, 29 May 2023 16:44:16 +0200 Subject: [PATCH 08/10] Allow notification for BP Generator Change-Id: Ie9a432ab04e56cd42664c8aacbc898b622767c62 --- .../nowinandroid/baselineprofile/BaselineProfileGenerator.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt index 3dfafd647..9286b2bef 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/baselineprofile/BaselineProfileGenerator.kt @@ -19,6 +19,7 @@ package com.google.samples.apps.nowinandroid.baselineprofile import androidx.benchmark.macro.ExperimentalBaselineProfilesApi import androidx.benchmark.macro.junit4.BaselineProfileRule import com.google.samples.apps.nowinandroid.PACKAGE_NAME +import com.google.samples.apps.nowinandroid.allowNotifications import com.google.samples.apps.nowinandroid.bookmarks.goToBookmarksScreen import com.google.samples.apps.nowinandroid.foryou.forYouScrollFeedDownUp import com.google.samples.apps.nowinandroid.foryou.forYouSelectTopics @@ -41,7 +42,7 @@ class BaselineProfileGenerator { // This block defines the app's critical user journey. Here we are interested in // optimizing for app startup. But you can also navigate and scroll // through your most important UI. - + allowNotifications() pressHome() startActivityAndWait() From 51713c71e7825239074ed9b408f2396b7f82611a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Mon, 29 May 2023 16:51:17 +0200 Subject: [PATCH 09/10] Fix FrameTimingMetric using StartupMode.WARM Change-Id: I1d08af6622f893eb6fef83b2b145cf8d6098b372 --- .../apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt index 3008fdc0d..18a7a717b 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt @@ -43,7 +43,7 @@ class ScrollForYouFeedBenchmark { metrics = listOf(FrameTimingMetric()), compilationMode = compilationMode, iterations = 10, - startupMode = StartupMode.COLD, + startupMode = StartupMode.WARM, setupBlock = { // Start the app pressHome() From 4fcc867dd445b58f2a4b50a4e2ebe4d2c73d79f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Mlynari=C4=8D?= Date: Mon, 29 May 2023 17:33:25 +0200 Subject: [PATCH 10/10] Move waitAndFind + dumpWindowHierarchy to Utils Change-Id: Id4e05bf2392553179672155b9c1f935a933525dc --- .../test/uiautomator/UiAutomatorHelpers.kt | 12 ---------- .../google/samples/apps/nowinandroid/Utils.kt | 24 +++++++++++++++++++ .../apps/nowinandroid/foryou/ForYouActions.kt | 2 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt index 766de00e1..85867b982 100644 --- a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt +++ b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt @@ -46,15 +46,3 @@ enum class HasChildrenOp { EXACTLY, AT_MOST, } - -/** - * Waits until an object with [selector] if visible on screen and returns the object. - * If the element is not available in [timeout], throws [AssertionError] - */ -fun UiDevice.waitAndFindObject(selector: BySelector, timeout: Long): UiObject2 { - if (!wait(Until.hasObject(selector), timeout)) { - throw AssertionError("Element not found on screen in ${timeout}ms (selector=$selector)") - } - - return findObject(selector) -} diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt index 494e451d0..9ece991c4 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/Utils.kt @@ -16,10 +16,13 @@ package com.google.samples.apps.nowinandroid +import androidx.test.uiautomator.BySelector import androidx.test.uiautomator.Direction import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiObject2 +import androidx.test.uiautomator.Until import com.google.samples.apps.nowinandroid.benchmarks.BuildConfig +import java.io.ByteArrayOutputStream /** * Convenience parameter to use proper package name with regards to build type and build flavor. @@ -38,3 +41,24 @@ fun UiDevice.flingElementDownUp(element: UiObject2) { waitForIdle() element.fling(Direction.UP) } + +/** + * Waits until an object with [selector] if visible on screen and returns the object. + * If the element is not available in [timeout], throws [AssertionError] + */ +fun UiDevice.waitAndFindObject(selector: BySelector, timeout: Long): UiObject2 { + if (!wait(Until.hasObject(selector), timeout)) { + throw AssertionError("Element not found on screen in ${timeout}ms (selector=$selector)") + } + + return findObject(selector) +} + +/** + * Helper to dump window hierarchy into a string. + */ +fun UiDevice.dumpWindowHierarchy(): String { + val buffer = ByteArrayOutputStream() + dumpWindowHierarchy(buffer) + return buffer.toString() +} diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt index bb21f3d39..9dea9dc4a 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ForYouActions.kt @@ -20,8 +20,8 @@ import androidx.benchmark.macro.MacrobenchmarkScope import androidx.test.uiautomator.By import androidx.test.uiautomator.Until import androidx.test.uiautomator.untilHasChildren -import androidx.test.uiautomator.waitAndFindObject import com.google.samples.apps.nowinandroid.flingElementDownUp +import com.google.samples.apps.nowinandroid.waitAndFindObject fun MacrobenchmarkScope.forYouWaitForContent() { // Wait until content is loaded by checking if topics are loaded