Fix npe on setSquishinessFraction
NPE originally being thrown because of race condition between the notification panel dismissal animation and the layout path; fixed by waiting for layout path to be populated before using it Test: atest QSPanelTest Fixes: 242139605 Change-Id: Ib1f0f90d27b15d838199390f87198eb5c0988dc5
This commit is contained in:
@@ -49,7 +49,6 @@ import com.android.systemui.tuner.TunerService.Tunable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/** View that represents the quick settings tile panel (when expanded/pulled down). **/
|
||||
public class QSPanel extends LinearLayout implements Tunable {
|
||||
@@ -291,7 +290,16 @@ public class QSPanel extends LinearLayout implements Tunable {
|
||||
} else {
|
||||
topOffset = tileHeightOffset;
|
||||
}
|
||||
int top = Objects.requireNonNull(mChildrenLayoutTop.get(child));
|
||||
// Animation can occur before the layout pass, meaning setSquishinessFraction() gets
|
||||
// called before onLayout(). So, a child view could be null because it has not
|
||||
// been added to mChildrenLayoutTop yet (which happens in onLayout()).
|
||||
// We use a continue statement here to catch this NPE because, on the layout pass,
|
||||
// this code will be called again from onLayout() with the populated children views.
|
||||
Integer childLayoutTop = mChildrenLayoutTop.get(child);
|
||||
if (childLayoutTop == null) {
|
||||
continue;
|
||||
}
|
||||
int top = childLayoutTop;
|
||||
child.setLeftTopRightBottom(child.getLeft(), top + topOffset,
|
||||
child.getRight(), top + topOffset + child.getHeight());
|
||||
}
|
||||
|
||||
@@ -158,6 +158,13 @@ class QSPanelTest : SysuiTestCase() {
|
||||
assertThat(qsPanel.paddingBottom).isEqualTo(padding)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testSetSquishinessFraction_noCrash() {
|
||||
qsPanel.addView(qsPanel.mTileLayout as View, 0)
|
||||
qsPanel.addView(FrameLayout(context))
|
||||
qsPanel.setSquishinessFraction(0.5f)
|
||||
}
|
||||
|
||||
private infix fun View.isLeftOf(other: View): Boolean {
|
||||
val rect = Rect()
|
||||
getBoundsOnScreen(rect)
|
||||
|
||||
Reference in New Issue
Block a user