[Status Bar Refactor] Add a PanelStateChangeListener interface and use

it in PanelBar#go.

Bug: 200063118
Test: manual
Test: atest PhoneStatusBarViewTest
Change-Id: I41e1854ec919ba3619e3abdecd0974e1c1e0d06f
This commit is contained in:
Caitlin Cassidy
2021-09-17 21:17:40 +00:00
parent db885833e7
commit 11e72d9f21
5 changed files with 92 additions and 23 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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) {

View File

@@ -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
}
}
}