Fixed
Status Update
Comments
su...@google.com <su...@google.com>
ap...@google.com <ap...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-main
commit 93dc6213fe2e74aa9c9d3dcdb4551c6ad3a85ba4
Author: sanura <sanura@google.com>
Date: Thu Mar 16 01:59:33 2023
Add private initViewTreeOwners() to AppCompatDialog
Ensure that AppCompatDialog also sets initial view
tree owners, since it does not call through to
super.setContentView(), which would set them via
ComponentDialog.
RelNote: "`AppCompatDialog` now correctly sets the `LifecycleOwner`, `SavedStateRegistryOwner`, and `OnBackPressedDispatcherOwner` on the dialog's decor view via the ViewTree APIs, fixing issues when hosting a ComposeView within an AppCompatDialog. AppCompat now depends on Activity 1.7.0."
Bug: 261314581
Test: AppComptaDialogTest
Change-Id: Ib28abb12cc3c617b9ffed9e1450e48308dc7c3df
M appcompat/appcompat/build.gradle
A appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatDialogTest.kt
M appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
https://android-review.googlesource.com/2493316
Branch: androidx-main
commit 93dc6213fe2e74aa9c9d3dcdb4551c6ad3a85ba4
Author: sanura <sanura@google.com>
Date: Thu Mar 16 01:59:33 2023
Add private initViewTreeOwners() to AppCompatDialog
Ensure that AppCompatDialog also sets initial view
tree owners, since it does not call through to
super.setContentView(), which would set them via
ComponentDialog.
RelNote: "`AppCompatDialog` now correctly sets the `LifecycleOwner`, `SavedStateRegistryOwner`, and `OnBackPressedDispatcherOwner` on the dialog's decor view via the ViewTree APIs, fixing issues when hosting a ComposeView within an AppCompatDialog. AppCompat now depends on Activity 1.7.0."
Bug: 261314581
Test: AppComptaDialogTest
Change-Id: Ib28abb12cc3c617b9ffed9e1450e48308dc7c3df
M appcompat/appcompat/build.gradle
A appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatDialogTest.kt
M appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
su...@google.com <su...@google.com> #3
Project: platform/frameworks/support
Branch: androidx-main
commit 6b7a0f963d43aa6a06b461d62743ed81adddce40
Author: sanura <sanura@google.com>
Date: Thu Mar 16 23:01:38 2023
Open up initViewTreeOwners() API for ComponentDialog and ComponentActivity
Making initViewTreeOwners() a public API in ComponentDialog
and ComponentActivity so it can be used by AppCompat.
RelNote: "`ComponentDialog` and `ComponentActivity` now
contain public API `initViewTreeOwners()` to be used to
initialize all view tree owners before setting the
content view."
Bug: 261314581
Test: all tests pass
Change-Id: Ibdce0a994b0daddc090e4ff58583ccba71612870
M activity/activity/api/current.txt
M activity/activity/api/public_plus_experimental_current.txt
M activity/activity/api/restricted_current.txt
M activity/activity/src/main/java/androidx/activity/ComponentActivity.java
M activity/activity/src/main/java/androidx/activity/ComponentDialog.kt
https://android-review.googlesource.com/2493317
Branch: androidx-main
commit 6b7a0f963d43aa6a06b461d62743ed81adddce40
Author: sanura <sanura@google.com>
Date: Thu Mar 16 23:01:38 2023
Open up initViewTreeOwners() API for ComponentDialog and ComponentActivity
Making initViewTreeOwners() a public API in ComponentDialog
and ComponentActivity so it can be used by AppCompat.
RelNote: "`ComponentDialog` and `ComponentActivity` now
contain public API `initViewTreeOwners()` to be used to
initialize all view tree owners before setting the
content view."
Bug: 261314581
Test: all tests pass
Change-Id: Ibdce0a994b0daddc090e4ff58583ccba71612870
M activity/activity/api/current.txt
M activity/activity/api/public_plus_experimental_current.txt
M activity/activity/api/restricted_current.txt
M activity/activity/src/main/java/androidx/activity/ComponentActivity.java
M activity/activity/src/main/java/androidx/activity/ComponentDialog.kt
Description
Version used: 1.0.0-alpha06
Devices/Android versions reproduced on: Many
We can see a large number of ConcurrentModificationExceptions in WorkManager:
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 bqHint=4 (has extras) } in vu@2406837b
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:988)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:7007)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:346)
at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:366)
at androidx.work.impl.constraints.trackers.ConstraintTracker.setState(OperaSrc:89)
at androidx.work.impl.constraints.trackers.NetworkStateTracker$NetworkStateBroadcastReceiver.onReceive(OperaSrc:157)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:978)
It looks like the mListeners set is being modified during the loop in ConstraintTracker.setState(). I see two potential issues with this method:
1. Maybe a listener is added or removed in onConstraintChanged(). I haven't seen this happen, but it might be good to make a copy of mListeners and iterate over the copy.
2. The NetworkStateTracker.mNetworkCallback is called on a different thread than the main thread. In consequence setState() is called on a different thread so there is a possibility that the main thread adds or removes a listener. This cannot be the (only) reason because the error happens in response to the CONNECTIVITY_CHANGE.
This may be fixed with synchronization or by registering mNetworkCallback to run on the main thread.