Status Update
Comments
pa...@google.com <pa...@google.com> #2
Branch: androidx-main
commit 9082f62682f853ad5251a1c79dde9eccba7abdd9
Author: Max Alfonso-Ying <maxying@google.com>
Date: Thu Apr 18 00:34:40 2024
[M2 text field] Apply background to decoration box
...instead of to the BasicTextField, so changing the
backgroundColor will properly change the decoration
box's background color.
Fixes:
Test: added unit tests
Relnote: "Fix backgroundColor not applying to
TextFieldDecorationBox and OutlinedTextFieldDecorationBox.
Decoration boxes now accept a `shape` parameter."
Change-Id: I371c26718597cb36ac537e9412ce476532afb40d
M compose/material/material/api/current.txt
M compose/material/material/api/restricted_current.txt
M compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TextFieldDecorationBoxDemos.kt
M compose/material/material/src/androidInstrumentedTest/kotlin/androidx/compose/material/textfield/TextFieldDecorationBoxTest.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
jo...@google.com <jo...@google.com> #3
Actually, createAndroidComposeRule
does not seem to allow for the situation where an Activity needs input. I can only find a version where you pass the activity class name, and it gets constructed for you without inputs.
pa...@google.com <pa...@google.com> #4
What kind of input do you mean? Do you mean input for Activity or ActivityScenarioRule?
jo...@google.com <jo...@google.com> #5
Input for the Activity. In the scenario that I linked, the Activity needs a string passed in its intent:
val intent = Intent(context, DetailsActivity::class.java)
intent.putExtra(KEY_ARG_DETAILS_CITY_NAME, item.city.name)
return intent
If I use createAndroidComposeRule
, how would I pass that city name?
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
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.