From 1b0066230edee70aa58bb866ba9b59a4a68690fc Mon Sep 17 00:00:00 2001 From: "dooyoung.hwang" Date: Thu, 22 Dec 2016 20:04:20 +0900 Subject: [PATCH] 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 --- .../SystemUI/src/com/android/systemui/qs/QSPanel.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index dfc89fa457060..612eba73f695e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -345,7 +345,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); @@ -514,10 +517,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); } } }