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
Fixes: 33947140
(cherry picked from commit 1b0066230e)
This commit is contained in:
committed by
Adrian Roos
parent
2f157c421a
commit
acf90acf13
@@ -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);
|
||||
@@ -518,10 +521,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user