Fix NPE when QSPanel not yet attached,

The NotificationPanelViewController tries to use the
QSPanelController before the QSPanel has been attached (sometimes).

Handle the case where it tries to set the expansion pre-attachment
and add a corresponding test.

Fixes: 172520720
Test: atest SystemUITests
Change-Id: Ib957201760de21561df59ec6e4f459ae7bcbf828
This commit is contained in:
Dave Mankoff
2020-11-05 12:16:48 -05:00
parent ca8c768955
commit f8b3ddfe48
3 changed files with 45 additions and 5 deletions

View File

@@ -413,7 +413,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
}
}
mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion);
mQSPanelController.getQsTileRevealController().setExpansion(expansion);
mQSPanelController.setRevealExpansion(expansion);
mQSPanelController.getTileLayout().setExpansion(expansion);
mQSPanelScrollView.setTranslationY(translationScaleY * heightDiff);
if (fullyCollapsed) {

View File

@@ -56,7 +56,9 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
private int mLastOrientation;
private String mCachedSpecs = "";
private QSTileRevealController mQsTileRevealController;
private float mRevealExpansion;
private final QSHost.Callback mQSHostCallback = this::setTiles;
@@ -70,7 +72,6 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
}
}
};
private String mCachedSpecs = "";
protected QSPanelControllerBase(T view, QSTileHost host,
QSCustomizerController qsCustomizerController,
@@ -92,6 +93,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
if (regularTileLayout instanceof PagedTileLayout) {
mQsTileRevealController = mQsTileRevealControllerFactory.create(
(PagedTileLayout) regularTileLayout);
mQsTileRevealController.setExpansion(mRevealExpansion);
}
mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
@@ -246,9 +248,12 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
}
}
/** */
public QSTileRevealController getQsTileRevealController() {
return mQsTileRevealController;
/** Set the expansion on the associated {@link QSTileRevealController}. */
public void setRevealExpansion(float expansion) {
mRevealExpansion = expansion;
if (mQsTileRevealController != null) {
mQsTileRevealController.setExpansion(expansion);
}
}
@Override

View File

@@ -19,9 +19,12 @@ package com.android.systemui.qs;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -112,8 +115,40 @@ public class QSPanelControllerBaseTest extends SysuiTestCase {
mUiEventLogger, mDumpManager);
mController.init();
reset(mQSTileRevealController);
}
@Test
public void testSetRevealExpansion_preAttach() {
mController.onViewDetached();
QSPanelControllerBase<QSPanel> controller = new TestableQSPanelControllerBase(mQSPanel,
mQSTileHost, mQSCustomizerController, mQSTileRevealControllerFactory,
mMetricsLogger, mUiEventLogger, mDumpManager);
// Nothing happens until attached
controller.setRevealExpansion(0);
verify(mQSTileRevealController, never()).setExpansion(anyFloat());
controller.setRevealExpansion(0.5f);
verify(mQSTileRevealController, never()).setExpansion(anyFloat());
controller.setRevealExpansion(1);
verify(mQSTileRevealController, never()).setExpansion(anyFloat());
controller.init();
verify(mQSTileRevealController).setExpansion(1);
}
@Test
public void testSetRevealExpansion_postAttach() {
mController.setRevealExpansion(0);
verify(mQSTileRevealController).setExpansion(0);
mController.setRevealExpansion(0.5f);
verify(mQSTileRevealController).setExpansion(0.5f);
mController.setRevealExpansion(1);
verify(mQSTileRevealController).setExpansion(1);
}
@Test
public void testSetExpanded_Metrics() {
mController.setExpanded(true);