Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8b3ddfe authored by Dave Mankoff's avatar Dave Mankoff
Browse files

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
parent ca8c7689
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) {
+9 −4
Original line number Diff line number Diff line
@@ -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
+35 −0
Original line number Diff line number Diff line
@@ -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);