Allow InterestsItem to be skipped on recomposition

Add a benchmark for topics state change
pull/380/head
Ben Trengrove 2 years ago
parent 0faa7b2067
commit 3a501f4530

@ -19,6 +19,7 @@ package com.google.samples.apps.nowinandroid.interests
import androidx.benchmark.macro.MacrobenchmarkScope import androidx.benchmark.macro.MacrobenchmarkScope
import androidx.test.uiautomator.By import androidx.test.uiautomator.By
import androidx.test.uiautomator.Direction import androidx.test.uiautomator.Direction
import androidx.test.uiautomator.Until
fun MacrobenchmarkScope.interestsScrollTopicsDownUp() { fun MacrobenchmarkScope.interestsScrollTopicsDownUp() {
val topicsList = device.findObject(By.res("interests:topics")) val topicsList = device.findObject(By.res("interests:topics"))
@ -33,3 +34,14 @@ fun MacrobenchmarkScope.interestsScrollPeopleDownUp() {
device.waitForIdle() device.waitForIdle()
peopleList.fling(Direction.UP) peopleList.fling(Direction.UP)
} }
fun MacrobenchmarkScope.interestsWaitForTopics() {
device.wait(Until.hasObject(By.text("Accessibility")), 30_000)
}
fun MacrobenchmarkScope.interestsToggleBookmarked() {
val topicsList = device.findObject(By.res("interests:topics"))
val checkable = topicsList.findObject(By.checkable(true))
checkable.click()
device.waitForIdle()
}

@ -0,0 +1,61 @@
/*
* 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 com.google.samples.apps.nowinandroid.interests
import androidx.benchmark.macro.CompilationMode
import androidx.benchmark.macro.FrameTimingMetric
import androidx.benchmark.macro.StartupMode
import androidx.benchmark.macro.junit4.MacrobenchmarkRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.uiautomator.By
import com.google.samples.apps.nowinandroid.PACKAGE_NAME
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class TopicsScreenRecompositionBenchmark {
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun benchmarkStateChangeCompilationBaselineProfile() =
benchmarkStateChange(CompilationMode.Partial())
private fun benchmarkStateChange(compilationMode: CompilationMode) =
benchmarkRule.measureRepeated(
packageName = PACKAGE_NAME,
metrics = listOf(FrameTimingMetric()),
compilationMode = compilationMode,
iterations = 10,
startupMode = StartupMode.WARM,
setupBlock = {
// Start the app
pressHome()
startActivityAndWait()
// Navigate to interests screen
device.findObject(By.text("Interests")).click()
device.waitForIdle()
}
) {
interestsWaitForTopics()
repeat(3) {
interestsToggleBookmarked()
}
}
}

@ -46,14 +46,15 @@ fun TopicsTabContent(
contentPadding = PaddingValues(top = 8.dp) contentPadding = PaddingValues(top = 8.dp)
) { ) {
topics.forEach { followableTopic -> topics.forEach { followableTopic ->
item { val topicId = followableTopic.topic.id
item(key = topicId) {
InterestsItem( InterestsItem(
name = followableTopic.topic.name, name = followableTopic.topic.name,
following = followableTopic.isFollowed, following = followableTopic.isFollowed,
description = followableTopic.topic.shortDescription, description = followableTopic.topic.shortDescription,
topicImageUrl = followableTopic.topic.imageUrl, topicImageUrl = followableTopic.topic.imageUrl,
onClick = { onTopicClick(followableTopic.topic.id) }, onClick = { onTopicClick(topicId) },
onFollowButtonClick = { onFollowButtonClick(followableTopic.topic.id, it) } onFollowButtonClick = { onFollowButtonClick(topicId, it) }
) )
} }
} }

Loading…
Cancel
Save