diff options
author | dooyoung.hwang <dooyoung.hwang@lge.com> | 2016-12-22 20:04:20 +0900 |
---|---|---|
committer | Zhao Wei Liew <zhaoweiliew@gmail.com> | 2017-01-24 09:47:42 +0000 |
commit | 72667c01e1dd3fecb3679f8e8a6fd2466df6f74c (patch) | |
tree | 526f407f2dbb4b4ce80f46015e3e02734dc16fe1 | |
parent | acb740d3849383da270eab8efb1b0090b3729bfe (diff) | |
download | android_frameworks_base-72667c01e1dd3fecb3679f8e8a6fd2466df6f74c.tar.gz android_frameworks_base-72667c01e1dd3fecb3679f8e8a6fd2466df6f74c.tar.bz2 android_frameworks_base-72667c01e1dd3fecb3679f8e8a6fd2466df6f74c.zip |
QS - Fix race condition in accessibility
When users try to open panel, initialization of accessibility is called
in Main Thread by this callstack.
at android.view.ViewGroup.buildOrderedChildList
at android.view.View.populateAccessibilityNodeInfoDrawingOrderInParent
at android.view.View.onInitializeAccessibilityNodeInfoInternal
at android.view.View.onInitializeAccessibilityNodeInfo
at android.view.View.createAccessibilityNodeInfoInternal
at android.view.View.createAccessibilityNodeInfo
at android.view.accessibility.AccessibilityRecord.setSource
...
at android.view.View.setFlags
at android.view.View.setVisibility
at com.android.systemui.qs.QSContainer.updateQsState
at com.android.systemui.qs.QSContainer.setExpanded
at com.android.systemui.statusbar.phone.NotificationPanelView.updateQsState
And another initialization is tried in QSTileHost Thread by this callstack.
at android.view.ViewGroup.buildOrderedChildList
at android.view.View.populateAccessibilityNodeInfoDrawingOrderInParent
at android.view.View.onInitializeAccessibilityNodeInfoInternal
at android.view.ViewGroup.onInitializeAccessibilityNodeInfoInternal
at android.view.View.onInitializeAccessibilityNodeInfo
at android.view.View.createAccessibilityNodeInfoInternal
at android.view.View.createAccessibilityNodeInfo
at android.view.accessibility.AccessibilityRecord.setSource
...
at android.view.View.announceForAccessibility
at com.android.systemui.qs.QSPanel.onAnnouncementRequested
at com.android.systemui.qs.QSTile.handleStateChanged
This race condition can cause crashes, because the same ArrayList
(mPreSortedChildren or mTempArrayList in ViewGroup) is modified by two
different thread.
Test : manual
Change-Id: I9e0ad1fef4be7dc378463c06d10854e0e4c5b3d6
(cherry picked from commit afe0edd0d50d1b3d6924d1a3440d00c73c03d081)
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/qs/QSPanel.java | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 5a222d59ed6..8a9b26276ee 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -360,7 +360,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { @Override public void onAnnouncementRequested(CharSequence announcement) { - announceForAccessibility(announcement); + if (announcement != null) { + mHandler.obtainMessage(H.ANNOUNCE_FOR_ACCESSIBILITY, announcement) + .sendToTarget(); + } } }; r.tile.addCallback(callback); @@ -529,10 +532,13 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { private class H extends Handler { private static final int SHOW_DETAIL = 1; private static final int SET_TILE_VISIBILITY = 2; + private static final int ANNOUNCE_FOR_ACCESSIBILITY = 3; @Override public void handleMessage(Message msg) { if (msg.what == SHOW_DETAIL) { handleShowDetail((Record)msg.obj, msg.arg1 != 0); + } else if (msg.what == ANNOUNCE_FOR_ACCESSIBILITY) { + announceForAccessibility((CharSequence)msg.obj); } } } |