Status Update
Comments
p1...@gmail.com <p1...@gmail.com> #2
Branch: androidx-master-dev
commit c60f33e229e31ab328ef6b59dab63b264954831c
Author: Alexandre Elias <aelias@google.com>
Date: Fri Jul 10 16:23:09 2020
Semantics no-op cleanups
Partly in response to lmr's broad code review, I did a pass of
superficial API/implementation cleanup. The main changes are:
- I changed each Boolean SemanticsProperty where false is equivalent to
not being present to take "Unit" instead. This is conceptually
clearer: it avoids questions like "can I cancel out a semantics from a
merged child by setting it to false?" Because "property = Unit" looks
weird, I also changed the style of these to "property()".
- I moved the Semantics id generator closer to where it's used, in
SemanticsModifierCore. I made it internal and an AtomicInt.
(Note that integer ids are heavily used in the Android
AccessibilityNodeInfo APIs so I can't simply remove them entirely.)
- I deleted dead code. Some examples include SemanticsHintOverrides,
a public API not connected to anything, and SemanticsPropertyKey
merge() open method which is never called. (In both cases I have
a different plan in mind for accessibility.)
Fixes: 145951226
Fixes: 145955412
Test: existing tests
Relnote: "Single-value semantics properties now use a calling style.
For example, 'semantics { hidden = true }' is now written as:
'semantics { hidden() }'."
Change-Id: Ic1afd12ea22c926babc9662f1804d80b33aa0cfc
M ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/LayoutNodeModifierBenchmark.kt
M ui/ui-core/api/0.1.0-dev15.txt
M ui/ui-core/api/current.txt
M ui/ui-core/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-core/api/public_plus_experimental_current.txt
M ui/ui-core/api/restricted_0.1.0-dev15.txt
M ui/ui-core/api/restricted_current.txt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/graphics/vector/VectorTest.kt
M ui/ui-core/src/androidAndroidTest/kotlin/androidx/ui/semantics/SemanticsTests.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidActuals.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeView.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidComposeViewAccessibilityDelegateCompat.kt
M ui/ui-core/src/androidMain/kotlin/androidx/ui/core/AndroidPopup.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/Expect.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsConfiguration.kt
D ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsHintOverrides.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsModifier.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsNode.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsOwner.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/core/semantics/SemanticsWrapper.kt
M ui/ui-core/src/commonMain/kotlin/androidx/ui/semantics/SemanticsProperties.kt
M ui/ui-foundation/api/0.1.0-dev15.txt
M ui/ui-foundation/api/current.txt
M ui/ui-foundation/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-foundation/api/public_plus_experimental_current.txt
M ui/ui-foundation/api/restricted_0.1.0-dev15.txt
M ui/ui-foundation/api/restricted_current.txt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Dialog.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/Scroller.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Selectable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/Toggleable.kt
M ui/ui-foundation/src/main/java/androidx/ui/foundation/semantics/FoundationSemanticsProperties.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ButtonTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CardTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/RadioButtonScreenshotTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SnackbarTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/SurfaceTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/ripple/RippleIndicationTest.kt
M ui/ui-material/src/androidTest/java/androidx/ui/material/textfield/TextFieldScreenshotTest.kt
M ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
M ui/ui-material/src/main/java/androidx/ui/material/TextFieldImpl.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/AssertsTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/CallSemanticsActionTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ErrorMessagesTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/FindersTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/PrintToStringTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/ScrollToTest.kt
M ui/ui-test/src/androidTest/java/androidx/ui/test/TextActionsTest.kt
M ui/ui-test/src/main/java/androidx/ui/test/Actions.kt
M ui/ui-test/src/main/java/androidx/ui/test/Filters.kt
M ui/ui-text/api/0.1.0-dev15.txt
M ui/ui-text/api/current.txt
M ui/ui-text/api/public_plus_experimental_0.1.0-dev15.txt
M ui/ui-text/api/public_plus_experimental_current.txt
M ui/ui-text/api/restricted_0.1.0-dev15.txt
M ui/ui-text/api/restricted_current.txt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/CoreTextField.kt
M ui/ui-text/src/commonMain/kotlin/androidx/ui/text/TextSemanticsProperties.kt
se...@google.com <se...@google.com> #3
We previously discussed in the tea whether this extension should be provided out of box.
Currently, it was decided not to provide it, because it seems niche and not really needed at one hand, and very easy to implement for developers who want it at the other.
Implementation-wise, I'd note that ALifecycleObserver
can be replaced with
Gonna mark it as Feature Request and leave it open to see if there is an appetite for this API as official extension.
p1...@gmail.com <p1...@gmail.com> #4
fun Lifecycle.asFlow() = callbackFlow<Lifecycle.Event> {
val observer = LifecycleEventObserver { _, event ->
if (!isClosedForSend) offer(event)
}.also { this@asFlow.addObserver(it) }
awaitClose { removeObserver(observer) }
}.flowOn(Dispatchers.Main)
il...@google.com <il...@google.com>
ca...@google.com <ca...@google.com> #5
This is something I also added as a workaround. It seems like a natural API to include in Jetpack.
il...@google.com <il...@google.com>
ey...@gmail.com <ey...@gmail.com> #6
I was very surprised that this wasn't included in Jetpack.
it...@gmail.com <it...@gmail.com> #7
sa...@google.com <sa...@google.com>
ap...@google.com <ap...@google.com> #8
Branch: androidx-main
commit 2f35da31af699a8b91439c53d9eb43840da6551b
Author: sanura <sanura@google.com>
Date: Thu Feb 09 01:47:28 2023
Expose Lifecycle as a Flow<Lifecycle.Event>
Adding an extension method to Lifecycle that
will allow observing Lifecycle.Event as a Flow.
RelNote: "`Lifecycle.Event`s are now able to be
observed as a `Flow` with `Lifecycle.asFlow().`"
Bug: 176311030
Test: LifecycleAsFlowTest
Change-Id: If2c0f10760caca7109d43c235ea76437ef2af5dc
M lifecycle/lifecycle-common/api/current.txt
M lifecycle/lifecycle-common/api/public_plus_experimental_current.txt
M lifecycle/lifecycle-common/api/restricted_current.txt
M lifecycle/lifecycle-common/build.gradle
M lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.kt
A lifecycle/lifecycle-runtime-testing/src/test/java/androidx/lifecycle/testing/LifecycleEventFlowTest.kt
it...@gmail.com <it...@gmail.com> #9
sa...@google.com <sa...@google.com>
na...@google.com <na...@google.com> #10
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.lifecycle:lifecycle-common:2.7.0-alpha01
androidx.lifecycle:lifecycle-runtime-testing:2.7.0-alpha01
Description
Also present you my workaround
fun Lifecycle.asFlow() = callbackFlow<Lifecycle.Event> {
val observer = ALifecycleObserver(this@asFlow) { offer(it) }
awaitClose { removeObserver(observer) }
}
class ALifecycleObserver(
lifecycle: Lifecycle,
private val action: (Lifecycle.Event) -> Unit
): LifecycleObserver {
init { lifecycle.addObserver(this) }
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(event: Lifecycle.Event) = action.invoke(event)
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(event: Lifecycle.Event) = action.invoke(event)
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(event: Lifecycle.Event) = action.invoke(event)
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(event: Lifecycle.Event) = action.invoke(event)
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(event: Lifecycle.Event) = action.invoke(event)
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(event: Lifecycle.Event) = action.invoke(event)
}