summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordooyoung.hwang <dooyoung.hwang@lge.com>2016-12-22 20:04:20 +0900
committerZhao Wei Liew <zhaoweiliew@gmail.com>2017-01-24 09:47:42 +0000
commit72667c01e1dd3fecb3679f8e8a6fd2466df6f74c (patch)
tree526f407f2dbb4b4ce80f46015e3e02734dc16fe1
parentacb740d3849383da270eab8efb1b0090b3729bfe (diff)
downloadandroid_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.java8
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);
}
}
}