Merge "[Status Bar Refactor] Remove PhoneStatusBarView's references to some StatusBar methods." into sc-v2-dev am: e9abf65660

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15806167

Change-Id: I42b60858fad54b9d5a185ecfb3fad7fddcf45c53
This commit is contained in:
Caitlin Cassidy
2021-09-17 06:02:39 +00:00
committed by Automerger Merge Worker
5 changed files with 139 additions and 12 deletions

View File

@@ -79,6 +79,8 @@ public class PhoneStatusBarView extends PanelBar {
private int mStatusBarHeight; private int mStatusBarHeight;
@Nullable @Nullable
private List<StatusBar.ExpansionChangedListener> mExpansionChangedListeners; private List<StatusBar.ExpansionChangedListener> mExpansionChangedListeners;
@Nullable
private PanelExpansionStateChangedListener mPanelExpansionStateChangedListener;
private PanelEnabledProvider mPanelEnabledProvider; private PanelEnabledProvider mPanelEnabledProvider;
@@ -102,6 +104,10 @@ public class PhoneStatusBarView extends PanelBar {
mExpansionChangedListeners = listeners; mExpansionChangedListeners = listeners;
} }
void setPanelExpansionStateChangedListener(PanelExpansionStateChangedListener listener) {
mPanelExpansionStateChangedListener = listener;
}
public void setScrimController(ScrimController scrimController) { public void setScrimController(ScrimController scrimController) {
mScrimController = scrimController; mScrimController = scrimController;
} }
@@ -289,11 +295,10 @@ public class PhoneStatusBarView extends PanelBar {
super.panelExpansionChanged(frac, expanded); super.panelExpansionChanged(frac, expanded);
updateScrimFraction(); updateScrimFraction();
if ((frac == 0 || frac == 1)) { if ((frac == 0 || frac == 1)) {
if (mBar.getNavigationBarView() != null) { if (mPanelExpansionStateChangedListener != null) {
mBar.getNavigationBarView().onStatusBarPanelStateChanged(); mPanelExpansionStateChangedListener.onPanelExpansionStateChanged();
} } else {
if (mBar.getNotificationPanelViewController() != null) { Log.w(TAG, "No PanelExpansionStateChangedListener provided.");
mBar.getNotificationPanelViewController().updateSystemUiStateFlags();
} }
} }
@@ -412,4 +417,10 @@ public class PhoneStatusBarView extends PanelBar {
/** Returns true if the panel is enabled and false otherwise. */ /** Returns true if the panel is enabled and false otherwise. */
boolean panelEnabled(); boolean panelEnabled();
} }
/** A listener that will be notified when a panel's expansion state may have changed. */
public interface PanelExpansionStateChangedListener {
/** Called when a panel's expansion state may have changed. */
void onPanelExpansionStateChanged();
}
} }

View File

@@ -27,7 +27,8 @@ import com.android.systemui.util.ViewController
class PhoneStatusBarViewController( class PhoneStatusBarViewController(
view: PhoneStatusBarView, view: PhoneStatusBarView,
commandQueue: CommandQueue, commandQueue: CommandQueue,
statusBarMoveFromCenterAnimationController: StatusBarMoveFromCenterAnimationController? statusBarMoveFromCenterAnimationController: StatusBarMoveFromCenterAnimationController?,
panelExpansionStateChangedListener: PhoneStatusBarView.PanelExpansionStateChangedListener,
) : ViewController<PhoneStatusBarView>(view) { ) : ViewController<PhoneStatusBarView>(view) {
override fun onViewAttached() {} override fun onViewAttached() {}
@@ -37,6 +38,7 @@ class PhoneStatusBarViewController(
mView.setPanelEnabledProvider { mView.setPanelEnabledProvider {
commandQueue.panelsEnabled() commandQueue.panelsEnabled()
} }
mView.setPanelExpansionStateChangedListener(panelExpansionStateChangedListener)
statusBarMoveFromCenterAnimationController?.let { animationController -> statusBarMoveFromCenterAnimationController?.let { animationController ->
val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side) val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side)

View File

@@ -1152,8 +1152,11 @@ public class StatusBar extends SystemUI implements
moveFromCenterAnimation = mMoveFromCenterAnimation.get(); moveFromCenterAnimation = mMoveFromCenterAnimation.get();
} }
mPhoneStatusBarViewController = mPhoneStatusBarViewController =
new PhoneStatusBarViewController(mStatusBarView, mCommandQueue, new PhoneStatusBarViewController(
moveFromCenterAnimation); mStatusBarView,
mCommandQueue,
moveFromCenterAnimation,
this::onPanelExpansionStateChanged);
mPhoneStatusBarViewController.init(); mPhoneStatusBarViewController.init();
mBatteryMeterViewController = new BatteryMeterViewController( mBatteryMeterViewController = new BatteryMeterViewController(
@@ -1425,6 +1428,15 @@ public class StatusBar extends SystemUI implements
} }
} }
private void onPanelExpansionStateChanged() {
if (getNavigationBarView() != null) {
getNavigationBarView().onStatusBarPanelStateChanged();
}
if (getNotificationPanelViewController() != null) {
getNotificationPanelViewController().updateSystemUiStateFlags();
}
}
@NonNull @NonNull
@Override @Override
public Lifecycle getLifecycle() { public Lifecycle getLifecycle() {

View File

@@ -17,11 +17,14 @@
package com.android.systemui.statusbar.phone package com.android.systemui.statusbar.phone
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import com.android.systemui.R
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.util.mockito.any
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@@ -29,14 +32,20 @@ import org.mockito.Mock
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
import com.android.systemui.R
import com.android.systemui.util.mockito.any
@SmallTest @SmallTest
class PhoneStatusBarViewControllerTest : SysuiTestCase() { class PhoneStatusBarViewControllerTest : SysuiTestCase() {
private val stateChangeListener = TestStateChangedListener()
@Mock @Mock
private lateinit var commandQueue: CommandQueue private lateinit var commandQueue: CommandQueue
@Mock
private lateinit var panelViewController: PanelViewController
@Mock
private lateinit var panelView: ViewGroup
@Mock
private lateinit var scrimController: ScrimController
@Mock @Mock
private lateinit var moveFromCenterAnimation: StatusBarMoveFromCenterAnimationController private lateinit var moveFromCenterAnimation: StatusBarMoveFromCenterAnimationController
@@ -47,13 +56,23 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
@Before @Before
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
`when`(panelViewController.view).thenReturn(panelView)
// create the view on main thread as it requires main looper // create the view on main thread as it requires main looper
InstrumentationRegistry.getInstrumentation().runOnMainSync { InstrumentationRegistry.getInstrumentation().runOnMainSync {
val parent = FrameLayout(mContext) // add parent to keep layout params val parent = FrameLayout(mContext) // add parent to keep layout params
view = LayoutInflater.from(mContext) view = LayoutInflater.from(mContext)
.inflate(R.layout.status_bar, parent, false) as PhoneStatusBarView .inflate(R.layout.status_bar, parent, false) as PhoneStatusBarView
view.setPanel(panelViewController)
view.setScrimController(scrimController)
} }
controller = PhoneStatusBarViewController(view, commandQueue, null)
controller = PhoneStatusBarViewController(
view,
commandQueue,
null,
stateChangeListener
)
} }
@Test @Test
@@ -73,8 +92,29 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
@Test @Test
fun constructor_moveFromCenterAnimationIsNotNull_moveFromCenterAnimationInitialized() { fun constructor_moveFromCenterAnimationIsNotNull_moveFromCenterAnimationInitialized() {
controller = PhoneStatusBarViewController(view, commandQueue, moveFromCenterAnimation) controller = PhoneStatusBarViewController(
view, commandQueue, moveFromCenterAnimation, stateChangeListener
)
verify(moveFromCenterAnimation).init(any(), any()) verify(moveFromCenterAnimation).init(any(), any())
} }
@Test
fun constructor_setsExpansionStateChangedListenerOnView() {
assertThat(stateChangeListener.stateChangeCalled).isFalse()
// If the constructor correctly set the listener, then it should be used when
// [PhoneStatusBarView.panelExpansionChanged] is called.
view.panelExpansionChanged(0f, false)
assertThat(stateChangeListener.stateChangeCalled).isTrue()
}
private class TestStateChangedListener : PhoneStatusBarView.PanelExpansionStateChangedListener {
var stateChangeCalled: Boolean = false
override fun onPanelExpansionStateChanged() {
stateChangeCalled = true
}
}
} }

View File

@@ -16,20 +16,38 @@
package com.android.systemui.statusbar.phone package com.android.systemui.statusbar.phone
import android.view.ViewGroup
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
@SmallTest @SmallTest
class PhoneStatusBarViewTest : SysuiTestCase() { class PhoneStatusBarViewTest : SysuiTestCase() {
@Mock
private lateinit var panelViewController: PanelViewController
@Mock
private lateinit var panelView: ViewGroup
@Mock
private lateinit var scrimController: ScrimController
private lateinit var view: PhoneStatusBarView private lateinit var view: PhoneStatusBarView
@Before @Before
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this)
// TODO(b/197137564): Setting up a panel view and its controller feels unnecessary when
// testing just [PhoneStatusBarView].
`when`(panelViewController.view).thenReturn(panelView)
view = PhoneStatusBarView(mContext, null) view = PhoneStatusBarView(mContext, null)
view.setPanel(panelViewController)
view.setScrimController(scrimController)
} }
@Test @Test
@@ -51,4 +69,48 @@ class PhoneStatusBarViewTest : SysuiTestCase() {
view.panelEnabled() view.panelEnabled()
// No assert needed, just testing no crash // No assert needed, just testing no crash
} }
@Test
fun panelExpansionChanged_fracZero_stateChangeListenerNotified() {
val listener = TestStateChangedListener()
view.setPanelExpansionStateChangedListener(listener)
view.panelExpansionChanged(0f, false)
assertThat(listener.stateChangeCalled).isTrue()
}
@Test
fun panelExpansionChanged_fracOne_stateChangeListenerNotified() {
val listener = TestStateChangedListener()
view.setPanelExpansionStateChangedListener(listener)
view.panelExpansionChanged(1f, false)
assertThat(listener.stateChangeCalled).isTrue()
}
@Test
fun panelExpansionChanged_fracHalf_stateChangeListenerNotNotified() {
val listener = TestStateChangedListener()
view.setPanelExpansionStateChangedListener(listener)
view.panelExpansionChanged(0.5f, false)
assertThat(listener.stateChangeCalled).isFalse()
}
@Test
fun panelExpansionChanged_noStateChangeListener_noCrash() {
view.panelExpansionChanged(1f, false)
// No assert needed, just testing no crash
}
private class TestStateChangedListener : PhoneStatusBarView.PanelExpansionStateChangedListener {
var stateChangeCalled: Boolean = false
override fun onPanelExpansionStateChanged() {
stateChangeCalled = true
}
}
} }