Fix waiting for content

pull/458/head
mlykotom 2 years ago
parent 8f42be517c
commit 2242b8a1dc

@ -0,0 +1,48 @@
/*
* Copyright 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.test.uiautomator
import androidx.test.uiautomator.HasChildrenOp.AT_LEAST
import androidx.test.uiautomator.HasChildrenOp.AT_MOST
import androidx.test.uiautomator.HasChildrenOp.EXACTLY
// These helpers need to be in the androidx.test.uiautomator package,
// because the abstract class has package local method that needs to be implemented.
/**
* Condition will be satisfied if given element has specified count of children
*/
fun untilHasChildren(
childCount: Int = 1,
op: HasChildrenOp = AT_LEAST
): UiObject2Condition<Boolean> {
return object : UiObject2Condition<Boolean>() {
override fun apply(element: UiObject2): Boolean {
return when (op) {
AT_LEAST -> element.childCount >= childCount
EXACTLY -> element.childCount == childCount
AT_MOST -> element.childCount < childCount
}
}
}
}
enum class HasChildrenOp {
AT_LEAST,
EXACTLY,
AT_MOST
}

@ -18,12 +18,15 @@ package com.google.samples.apps.nowinandroid.foryou
import androidx.benchmark.macro.MacrobenchmarkScope import androidx.benchmark.macro.MacrobenchmarkScope
import androidx.test.uiautomator.By import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until import androidx.test.uiautomator.Direction.RIGHT
import androidx.test.uiautomator.untilHasChildren
import com.google.samples.apps.nowinandroid.flingElementDownUp import com.google.samples.apps.nowinandroid.flingElementDownUp
import kotlin.random.Random.Default.nextInt
fun MacrobenchmarkScope.forYouWaitForContent() { fun MacrobenchmarkScope.forYouWaitForContent() {
// Wait until content is loaded // Wait until content is loaded by checking if authors are loaded
device.wait(Until.hasObject(By.text("What are you interested in?")), 30_000) val obj = device.findObject(By.res("forYou:authors"))
obj.wait(untilHasChildren(), 30_000)
} }
fun MacrobenchmarkScope.forYouSelectAuthors() { fun MacrobenchmarkScope.forYouSelectAuthors() {

@ -126,15 +126,13 @@ internal fun ForYouScreen(
onNewsResourcesCheckedChanged: (String, Boolean) -> Unit, onNewsResourcesCheckedChanged: (String, Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val onboardingLoading = onboardingUiState is OnboardingUiState.Loading
val feedLoading = feedState is NewsFeedUiState.Loading
// Workaround to call Activity.reportFullyDrawn from Jetpack Compose. // Workaround to call Activity.reportFullyDrawn from Jetpack Compose.
// This code should be called when the UI is ready for use // This code should be called when the UI is ready for use
// and relates to Time To Full Display. // and relates to Time To Full Display.
val onboardingLoaded = if (!isSyncing && !onboardingLoading && !feedLoading) {
onboardingUiState !is OnboardingUiState.Loading
val feedLoaded = feedState !is NewsFeedUiState.Loading
if (onboardingLoaded && feedLoaded) {
val localView = LocalView.current val localView = LocalView.current
// We use Unit to call reportFullyDrawn only on the first recomposition, // We use Unit to call reportFullyDrawn only on the first recomposition,
// however it will be called again if this composable goes out of scope. // however it will be called again if this composable goes out of scope.
@ -196,9 +194,7 @@ internal fun ForYouScreen(
} }
} }
AnimatedVisibility( AnimatedVisibility(
visible = isSyncing || visible = isSyncing || feedLoading || onboardingLoading,
feedState is NewsFeedUiState.Loading ||
onboardingUiState is OnboardingUiState.Loading,
enter = slideInVertically( enter = slideInVertically(
initialOffsetY = { fullHeight -> -fullHeight }, initialOffsetY = { fullHeight -> -fullHeight },
) + fadeIn(), ) + fadeIn(),
@ -211,7 +207,9 @@ internal fun ForYouScreen(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
NiaOverlayLoadingWheel( NiaOverlayLoadingWheel(
modifier = Modifier.align(Alignment.Center), modifier = Modifier
.align(Alignment.Center)
.testTag("forYou:loadingWheel"),
contentDesc = loadingContentDescription contentDesc = loadingContentDescription
) )
} }

Loading…
Cancel
Save