Status Update
Comments
il...@google.com <il...@google.com> #2
First of all thanks for this detailed issue.
This issue had been investigated thoroughly when it was first reported internally. The surprising detail in this report is that the issue is not reproducible before 1.7
. I will look into this.
The main problem with POBox is the fact that it is deprecated. Since 2021 Sony has been shipping new Xperia devices with Gboard pre-installed. Although we are aware that there is still a considerable amount of users still using POBox, the described behavior is caused by POBox's noncompliant behavior with InputConnection
and InputMethodManager
documentation. However, this is understandable since TextView
implementation was also not respecting the behavior that is expected from Editors.
Ultimately we have decided to enforce the documented behavior with specifically regards to when editors should call InputMethodManager.updateSelection
. Also, although unconfirmed, there were traces of possible custom code being included in Sony OEM images that changed how InputMethodManager was notified from TextView. If POBox also depended on something like this, it would be impossible for Compose code to replicate the same unknown behavior.
il...@google.com <il...@google.com> #3
Or is that option not available?
Even if the root cause is POBox, from the perspective of the app's customers, it looks like an app bug, so this issue is a blocker against updating Jetpack Compose.
il...@google.com <il...@google.com> #4
Just to be sure, it is dangerous to replace Compose TextField with Android View EditText as a workaround for this issue.
Compose 1.7 has a bug that causes ANR when the focus is on EditText.
Another View-related bug in Compose 1.7 is that an Android View is focused by calling FocusManager.clearFocus().
Perhaps there is a lack of testing of Compose 1.7 in combination with Android View. There is also a possibility that there are other fatal bugs related to View.
In other words, the only options for apps targeting the Japanese market that require POBox support are to continue using Compose 1.6 or to use EditText in combination with various workarounds.
il...@google.com <il...@google.com> #5
Project: platform/frameworks/support
Branch: androidx-main
Author: Halil Ozercan <
Link:
Fix POBox keyboard issue
Expand for full commit details
Fix POBox keyboard issue
Fix: 373743376
Fix: 329209241
Test: NullableInputConnectionWrapperTest
Change-Id: I94e0e598274fb88b255f977f9fbd50dfbbb1ecb1
Files:
- M
compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapperTest.kt
- M
compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/text/input/NullableInputConnectionWrapper.android.kt
Hash: 57f58c4b80d5d8470b2aca325dfdcd55f235231e
Date: Thu Oct 24 01:25:20 2024
il...@google.com <il...@google.com>
ap...@google.com <ap...@google.com> #6
Many thanks again for this report. Especially for giving us a huge clue in terms of what could be going wrong. The fix is now merged and I will ask for a cherry-pick into a stable release.
ap...@google.com <ap...@google.com> #7
Do you have any concrete plan to cherry-pick the fix into current stable version (1.7.x)? We are currently waiting it.
ap...@google.com <ap...@google.com> #8
Yes, this fix is planned to be included in a future 1.7.x
release.
il...@google.com <il...@google.com> #9
Thanks for the fix. Sorry to follow up on this. is it possible for you to share specific release version/date for the stable version? We are waiting on this to decide on our direction.
sn...@gmail.com <sn...@gmail.com> #10
is this issue really resolved ?
I still face the same issue .
Here is my code , is there anything I am missing out ?
Scaffold(topBar = { TopAppBar(topAppBarData = topBar) })
{
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
AndroidViewBinding(TestFragmentBinding::inflate)
}
}
il...@google.com <il...@google.com> #11
Re
ro...@theorytank.com <ro...@theorytank.com> #12
I think the problem is that the onRelease code assumes that the localContext (see --->) can be cast to an Activity. But this doesn't work when it's a ContextThemeWrapper.
onRelease = { view ->
view.getBinding<T>().onRelease()
(view as? ViewGroup)?.let { rootGroup ->
// clean up inflated fragments when the AndroidViewBinding is disposed
// Find the right FragmentManager
val fragmentManager = parentFragment?.childFragmentManager
---> ?: (localContext as? FragmentActivity)?.supportFragmentManager
forEachFragmentContainerView(rootGroup) { container ->
// Now find the fragment inflated via the FragmentContainerView
val existingFragment = fragmentManager?.findFragmentById(container.id)
if (existingFragment != null && !fragmentManager.isStateSaved) {
// If the state isn't saved, that means that some state change
// has removed this Composable from the hierarchy
fragmentManager.commitNow {
remove(existingFragment)
}
}
}
}
},
il...@google.com <il...@google.com> #13
Re AndroidFragment
fragment-compose
artifact, which is what we suggest for embedding your fragment in a Compose hierarchy now.
[Deleted User] <[Deleted User]> #14
Re
Description
Jetpack Compose release version: Compose alpha11 Android Studio Build: Arctic Fox Canary 4
There appears to be a number of issues with inflating a fragment by using
AndroidViewBinding
:If you use
FragmentContainerView
, the fragment appears the first time the container is inflated, but later times it does not appear.If you use
<fragment>
, the fragment appears the first time the fragment is inflated, but will crash if you try to re-inflate the same layout a second time. Rotating your screen or otherwise recreating the Activity will reset it so that the first inflation worksIn both cases, removing the
AndroidViewBinding
from your compose hierarchy does not remove the underlyingFragment
from theFragmentManager
. This means that the Fragment remains in memory forever afterwards.I've attached a sample project that contains three situation (using
FragmentContainerView
, using<fragment>
, and manually doing aFragmentTransaction
in Compose code) and a 'Show' button of each that lets you confirm what happens when theAndroidViewBinding
is removed from the hierarchy.My investigation lead to a couple of discoveries:
After a configuration change, the whole activity and the
FragmentManager
has moved to theRESUMED
state before the compose hierarchy is processed andAndroidViewBinding
is able to inflate its container. This means the original fragment added via the inflatedFragmentContainerView
has already had its view created and moved to theRESUMED
state before the container exists. Thus, the transition betweenonCreateView()
andonViewCreated()
where the view is attached to its container has already passed when theAndroidViewBinding
creates the container.The
<fragment>
tag added fragment never goes above theCREATED
state on its own - Fragments is correctly stopping it from going higher thanCREATED
during the inflation, but because Compose is inflating it after the FragmentManager has already moved throughRESUMED
, the usual moving of state for<fragment>
inflated fragments doesn't happen. Doing anotherFragmentTransaction
on a different fragment/container moves it toSTARTED
, but it never moves toRESUMED
as no FragmentTransactions on that container are pending (and moving toRESUMED
is done at a container by container basis) as the<fragment>
tag doesn't actually do aFragmentTransaction
.It is expected that when a composable is removed from the hierarchy that any internal state is thrown out (that's why you'd normally hoist state you want to save). Because Fragments are never removed when the
AndroidViewBinding
is removed from the hierarchy, the Fragments keep their state over a removal / addition of a new element that happens to inflate that same layout.