Fixed
Status Update
Comments
pa...@google.com <pa...@google.com> #2
Hi. Thanks for reporting this. Fixed in alpha-04
jo...@google.com <jo...@google.com> #3
Project: platform/frameworks/support
Branch: androidx-main
commit e782987543a9f8ccd485e970ddc74564b24378db
Author: Vighnesh Raut <vighnesh.raut13@gmail.com>
Date: Mon Jan 02 15:27:40 2023
fix: tab row crashes when only 1 tab is added
Bug: b/264018028
Test: Added unit test
Change-Id: I6381dbac304fc1d69d3708c6655f8b595668e93f
M tv/tv-material/src/androidTest/java/androidx/tv/material/TabRowTest.kt
M tv/tv-material/src/main/java/androidx/tv/material/TabRow.kt
https://android-review.googlesource.com/2373449
Branch: androidx-main
commit e782987543a9f8ccd485e970ddc74564b24378db
Author: Vighnesh Raut <vighnesh.raut13@gmail.com>
Date: Mon Jan 02 15:27:40 2023
fix: tab row crashes when only 1 tab is added
Bug:
Test: Added unit test
Change-Id: I6381dbac304fc1d69d3708c6655f8b595668e93f
M tv/tv-material/src/androidTest/java/androidx/tv/material/TabRowTest.kt
M tv/tv-material/src/main/java/androidx/tv/material/TabRow.kt
pa...@google.com <pa...@google.com> #4
deleted
jo...@google.com <jo...@google.com> #5
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.tv:tv-material:1.0.0-alpha04
je...@google.com <je...@google.com> #6
Our API is not very friendly to accommodate this scenario (because we didn't think of this use when designing it), but it is possible to achieve with public API:
@LargeTest
@RunWith(AndroidJUnit4::class)
class LateActivityLaunchTest {
private lateinit var activityScenario: ActivityScenario<CustomActivity>
@get:Rule
val rule = AndroidComposeTestRule(EmptyTestRule()) {
var activity: CustomActivity? = null
activityScenario.onActivity { activity = it }
checkNotNull(activity) { "Activity didn't launch" }
}
class EmptyTestRule : TestRule {
override fun apply(base: Statement, description: Description) = base
}
@Test
fun test() {
setupSomethingFirst()
ActivityScenario.launch<CustomActivity>(
Intent(ApplicationProvider.getApplicationContext(), CustomActivity::class.java)
).use {
activityScenario = it
rule.onNode(hasText("Hello")).assertExists()
}
}
private fun setupSomethingFirst() {
}
}
class CustomActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Text("Hello")
}
}
}
We should provide more accessible support in our API for this though
je...@google.com <je...@google.com> #7
Current thoughts are to split the ComposeTestRule
interface and add fun createComposeRuleNoLauncher
. Roughly something like this:
// commonMain
interface ComposeTestRule {
// same as now, but without `fun setContent`
}
// commonMain
interface ComposeContentTestRule : ComposeTestRule {
fun setContent(content: @Composable () -> Unit)
}
// androidMain
class AndroidComposeTestRule : ComposeContentTestRule
// commonMain
expect fun createComposeRule() : ComposeContentTestRule
// androidMain
actual fun createComposeRule() = createAndroidComposeRule()
// androidMain
fun createAndroidComposeRule() : AndroidComposeTestRule
// androidMain
fun createComposeRuleNoLauncher() : ComposeTestRule = AndroidComposeTestRule(activityRule = null)
A few things still have to be worked out, but the main bit I wanted to share is the new factory method and the interface split.
Things still to be worked out:
- Will we keep supporting AndroidComposeTestRule with a generic activityRule + activityProvider, or do we direct devs to use
createComposeRuleNoLauncher
and do the wiring themselves? - AndroidComposeTestRule constructor to be used by
createComposeRuleNoLauncher
. Depends on answer to 1.
pa...@google.com <pa...@google.com>
ap...@google.com <ap...@google.com> #8
Project: platform/frameworks/support
Branch: androidx-main
commit ce81b84e699a64e9538bb57d3dcdf25fdd5151c1
Author: Jelle Fresen <jellefresen@google.com>
Date: Tue Jan 19 18:44:09 2021
Use ComposeTestRule without launching Activity
The factory method createEmptyComposeRule has been added that creates an
AndroidComposeTestRule that does not start any Activity. To make sure
one can't call setContent (which uses the started Activity) on that test
rule, the ComposeTestRule interface has been split into ComposeTestRule
and ComposeContentTestRule, with the latter containing setContent and
the former containing all the other methods. createEmptyComposeRule's
return type is ComposeTestRule, without setContent.
Fixes: 174472899
Test: Added LateActivityLaunchTest
Relnote: "Introduced `ComposeContentTestRule`, which extends
`ComposeTestRule` and defines `setContent`, which has been removed from
`ComposeTestRule`. Added a factory method `createEmptyComposeRule()`
that returns a `ComposeTestRule` and does not launch an Activity for
you. Use this when you want to launch your Activity during your test,
e.g. using `ActivityScenario.launch`"
Change-Id: I9d78283c27d87a3135071884e115bbd814492c47
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/FoundationTest.kt
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/DrawerScreenshotTest.kt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialTest.kt
M compose/ui/ui-test-junit4/api/current.txt
M compose/ui/ui-test-junit4/api/public_plus_experimental_current.txt
M compose/ui/ui-test-junit4/api/restricted_current.txt
M compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/FirstDrawTest.kt
A compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/LateActivityLaunchTest.kt
M compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.kt
M compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.kt
M compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.kt
M compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/ComposeTestRule.kt
M compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
https://android-review.googlesource.com/1554347
Branch: androidx-main
commit ce81b84e699a64e9538bb57d3dcdf25fdd5151c1
Author: Jelle Fresen <jellefresen@google.com>
Date: Tue Jan 19 18:44:09 2021
Use ComposeTestRule without launching Activity
The factory method createEmptyComposeRule has been added that creates an
AndroidComposeTestRule that does not start any Activity. To make sure
one can't call setContent (which uses the started Activity) on that test
rule, the ComposeTestRule interface has been split into ComposeTestRule
and ComposeContentTestRule, with the latter containing setContent and
the former containing all the other methods. createEmptyComposeRule's
return type is ComposeTestRule, without setContent.
Fixes: 174472899
Test: Added LateActivityLaunchTest
Relnote: "Introduced `ComposeContentTestRule`, which extends
`ComposeTestRule` and defines `setContent`, which has been removed from
`ComposeTestRule`. Added a factory method `createEmptyComposeRule()`
that returns a `ComposeTestRule` and does not launch an Activity for
you. Use this when you want to launch your Activity during your test,
e.g. using `ActivityScenario.launch`"
Change-Id: I9d78283c27d87a3135071884e115bbd814492c47
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/FoundationTest.kt
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/textfield/TextFieldScrollTest.kt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/DrawerScreenshotTest.kt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialRippleThemeTest.kt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/MaterialTest.kt
M compose/ui/ui-test-junit4/api/current.txt
M compose/ui/ui-test-junit4/api/public_plus_experimental_current.txt
M compose/ui/ui-test-junit4/api/restricted_current.txt
M compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/FirstDrawTest.kt
A compose/ui/ui-test-junit4/src/androidAndroidTest/kotlin/androidx/compose/ui/test/junit4/LateActivityLaunchTest.kt
M compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/AndroidComposeTestRule.kt
M compose/ui/ui-test-junit4/src/androidMain/kotlin/androidx/compose/ui/test/junit4/StateRestorationTester.kt
M compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.kt
M compose/ui/ui-test-junit4/src/jvmMain/kotlin/androidx/compose/ui/test/junit4/ComposeTestRule.kt
M compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/focus/FocusTestUtils.kt
Description
Jetpack Compose release version: Snapshot 6995125 Android Studio Build: n/a
See update to Alpha08 in Crane:https://github.com/android/compose-samples/pull/298/files#diff-b10b1fb51606b96175c832427089cc3f024a536153eab5cdbb95e4a7bb273b7cR60-R74
The
AndroidComposeTestRule
class has been changed in Alpha08, and it now needs anactivityProvider
parameter. That requires quite some boilerplate, asActivityScenarioRule.getActivity()
is private (AndroidComposeTestRule.kt line 311), and so the consumer has to copy that implementation.