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

Commit 11e72d9f authored by Caitlin Cassidy's avatar Caitlin Cassidy
Browse files

[Status Bar Refactor] Add a PanelStateChangeListener interface and use

it in PanelBar#go.

Bug: 200063118
Test: manual
Test: atest PhoneStatusBarViewTest
Change-Id: I41e1854ec919ba3619e3abdecd0974e1c1e0d06f
parent db885833
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -57,7 +57,6 @@ import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.biometrics.SensorLocationInternal;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.os.Bundle;
@@ -2228,12 +2227,6 @@ public class NotificationPanelViewController extends PanelViewController {
        updateQSExpansionEnabledAmbient();
    }

    @Override
    public void setIsShadeOpening(boolean opening) {
        mAmbientState.setIsShadeOpening(opening);
        updateQSExpansionEnabledAmbient();
    }

    private void updateQSExpansionEnabledAmbient() {
        final float scrollRangeToTop = mAmbientState.getTopPadding() - mQuickQsOffsetHeight;
        mQsExpansionEnabledAmbient = mShouldUseSplitNotificationShade
@@ -4629,4 +4622,14 @@ public class NotificationPanelViewController extends PanelViewController {
            return insets;
        }
    }

    private final PanelBar.PanelStateChangeListener mPanelStateChangeListener =
            state -> {
                mAmbientState.setIsShadeOpening(state == PanelBar.STATE_OPENING);
                updateQSExpansionEnabledAmbient();
            };

    public PanelBar.PanelStateChangeListener getPanelStateChangeListener() {
        return mPanelStateChangeListener;
    }
}
+25 −7
Original line number Diff line number Diff line
@@ -17,8 +17,10 @@
package com.android.systemui.statusbar.phone;

import static java.lang.Float.isNaN;
import static java.lang.annotation.RetentionPolicy.SOURCE;

import android.annotation.CallSuper;
import android.annotation.IntDef;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
@@ -27,6 +29,10 @@ import android.util.Log;
import android.view.MotionEvent;
import android.widget.FrameLayout;

import androidx.annotation.Nullable;

import java.lang.annotation.Retention;

public abstract class PanelBar extends FrameLayout {
    public static final boolean DEBUG = false;
    public static final String TAG = PanelBar.class.getSimpleName();
@@ -40,26 +46,27 @@ public abstract class PanelBar extends FrameLayout {
        Log.v(TAG, String.format(fmt, args));
    }

    /** Enum for the current state of the panel. */
    @Retention(SOURCE)
    @IntDef({STATE_CLOSED, STATE_OPENING, STATE_OPEN})
    @interface PanelState {}
    public static final int STATE_CLOSED = 0;
    public static final int STATE_OPENING = 1;
    public static final int STATE_OPEN = 2;

    PanelViewController mPanel;
    @Nullable private PanelStateChangeListener mPanelStateChangeListener;
    private int mState = STATE_CLOSED;
    private boolean mTracking;

    public void go(int state) {
    private void go(@PanelState int state) {
        if (DEBUG) LOG("go state: %d -> %d", mState, state);
        mState = state;
        if (mPanel != null) {
            mPanel.setIsShadeOpening(state == STATE_OPENING);
        if (mPanelStateChangeListener != null) {
            mPanelStateChangeListener.onStateChanged(state);
        }
    }

    protected boolean isShadeOpening() {
        return mState == STATE_OPENING;
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        Bundle bundle = new Bundle();
@@ -97,6 +104,11 @@ public abstract class PanelBar extends FrameLayout {
        pv.setBar(this);
    }

    /** Sets the listener that will be notified of panel state changes. */
    public void setPanelStateChangeListener(PanelStateChangeListener listener) {
        mPanelStateChangeListener = listener;
    }

    public boolean panelEnabled() {
        return true;
    }
@@ -226,4 +238,10 @@ public abstract class PanelBar extends FrameLayout {
    public void onClosingFinished() {

    }

    /** An interface that will be notified of panel state changes. */
    public interface PanelStateChangeListener {
        /** Called when the state changes. */
        void onStateChanged(@PanelState int state);
    }
}
+0 −5
Original line number Diff line number Diff line
@@ -1171,11 +1171,6 @@ public abstract class PanelViewController {
        return new OnConfigurationChangedListener();
    }

    /**
     * Set that the panel is currently opening and not fully opened or closed.
     */
    public abstract void setIsShadeOpening(boolean opening);

    public class TouchHandler implements View.OnTouchListener {
        public boolean onInterceptTouchEvent(MotionEvent event) {
            if (mInstantExpanding || !mNotificationsDragEnabled || mTouchDisabled || (mMotionAborted
+2 −0
Original line number Diff line number Diff line
@@ -1161,6 +1161,8 @@ public class StatusBar extends SystemUI implements
                    mStatusBarView = (PhoneStatusBarView) statusBarFragment.getView();
                    mStatusBarView.setBar(this);
                    mStatusBarView.setPanel(mNotificationPanelViewController);
                    mStatusBarView.setPanelStateChangeListener(
                            mNotificationPanelViewController.getPanelStateChangeListener());
                    mStatusBarView.setScrimController(mScrimController);
                    mStatusBarView.setExpansionChangedListeners(mExpansionChangedListeners);
                    for (ExpansionChangedListener listener : mExpansionChangedListeners) {
+55 −4
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ class PhoneStatusBarViewTest : SysuiTestCase() {
    private lateinit var panelView: ViewGroup
    @Mock
    private lateinit var scrimController: ScrimController
    @Mock
    private lateinit var statusBar: StatusBar

    private lateinit var view: PhoneStatusBarView

@@ -48,6 +50,7 @@ class PhoneStatusBarViewTest : SysuiTestCase() {
        view = PhoneStatusBarView(mContext, null)
        view.setPanel(panelViewController)
        view.setScrimController(scrimController)
        view.setBar(statusBar)
    }

    @Test
@@ -72,7 +75,7 @@ class PhoneStatusBarViewTest : SysuiTestCase() {

    @Test
    fun panelExpansionChanged_fracZero_stateChangeListenerNotified() {
        val listener = TestStateChangedListener()
        val listener = TestExpansionStateChangedListener()
        view.setPanelExpansionStateChangedListener(listener)

        view.panelExpansionChanged(0f, false)
@@ -82,7 +85,7 @@ class PhoneStatusBarViewTest : SysuiTestCase() {

    @Test
    fun panelExpansionChanged_fracOne_stateChangeListenerNotified() {
        val listener = TestStateChangedListener()
        val listener = TestExpansionStateChangedListener()
        view.setPanelExpansionStateChangedListener(listener)

        view.panelExpansionChanged(1f, false)
@@ -92,7 +95,7 @@ class PhoneStatusBarViewTest : SysuiTestCase() {

    @Test
    fun panelExpansionChanged_fracHalf_stateChangeListenerNotNotified() {
        val listener = TestStateChangedListener()
        val listener = TestExpansionStateChangedListener()
        view.setPanelExpansionStateChangedListener(listener)

        view.panelExpansionChanged(0.5f, false)
@@ -106,11 +109,59 @@ class PhoneStatusBarViewTest : SysuiTestCase() {
        // No assert needed, just testing no crash
    }

    private class TestStateChangedListener : PhoneStatusBarView.PanelExpansionStateChangedListener {
    @Test
    fun panelStateChanged_toStateOpening_listenerNotified() {
        val listener = TestStateChangedListener()
        view.setPanelStateChangeListener(listener)

        view.panelExpansionChanged(0.5f, true)

        assertThat(listener.state).isEqualTo(PanelBar.STATE_OPENING)
    }

    @Test
    fun panelStateChanged_toStateOpen_listenerNotified() {
        val listener = TestStateChangedListener()
        view.setPanelStateChangeListener(listener)

        view.panelExpansionChanged(1f, true)

        assertThat(listener.state).isEqualTo(PanelBar.STATE_OPEN)
    }

    @Test
    fun panelStateChanged_toStateClosed_listenerNotified() {
        val listener = TestStateChangedListener()
        view.setPanelStateChangeListener(listener)

        // First, open the panel
        view.panelExpansionChanged(1f, true)

        // Then, close it again
        view.panelExpansionChanged(0f, false)

        assertThat(listener.state).isEqualTo(PanelBar.STATE_CLOSED)
    }

    @Test
    fun panelStateChanged_noListener_noCrash() {
        view.panelExpansionChanged(1f, true)
        // No assert needed, just testing no crash
    }

    private class TestExpansionStateChangedListener
        : PhoneStatusBarView.PanelExpansionStateChangedListener {
        var stateChangeCalled: Boolean = false

        override fun onPanelExpansionStateChanged() {
            stateChangeCalled = true
        }
    }

    private class TestStateChangedListener : PanelBar.PanelStateChangeListener {
        var state: Int = 0
        override fun onStateChanged(state: Int) {
            this.state = state
        }
    }
}