From b62c73879e4cbd7c8facc9de8fa8ee8e7b822173 Mon Sep 17 00:00:00 2001 From: Caitlin Cassidy Date: Thu, 2 Sep 2021 13:27:17 +0000 Subject: [PATCH] [Ongoing Call] Show status bar in immersive if there's an ongoing call. Test: atest+manual Bug: 195839150 Change-Id: Ib065a8f4e2f03a98ae52dae386b6a8f08203dcb5 --- packages/SystemUI/res/values/flags.xml | 2 ++ .../android/systemui/flags/FeatureFlags.java | 5 +++++ .../dagger/StatusBarDependenciesModule.java | 10 +++++++-- .../phone/StatusBarWindowController.java | 11 +++++++++- .../ongoingcall/OngoingCallController.kt | 6 +++++- .../ongoingcall/OngoingCallControllerTest.kt | 21 +++++++++++++++++++ 6 files changed, 51 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml index d442cc51cfd76..9a438df5b7fc1 100644 --- a/packages/SystemUI/res/values/flags.xml +++ b/packages/SystemUI/res/values/flags.xml @@ -46,6 +46,8 @@ true + false + false true diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java index e51f90f9c73b9..b17041bc83f2e 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java @@ -161,6 +161,11 @@ public class FeatureFlags { return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip); } + public boolean isOngoingCallInImmersiveEnabled() { + return isOngoingCallStatusBarChipEnabled() + && mFlagReader.isEnabled(R.bool.flag_ongoing_call_in_immersive); + } + public boolean isSmartspaceEnabled() { return mFlagReader.isEnabled(R.bool.flag_smartspace); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java index 6730afaafdef5..0352212ced1bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java @@ -65,6 +65,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl; import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback; +import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.phone.SystemUIHostDialogProvider; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLogger; @@ -253,11 +254,16 @@ public interface StatusBarDependenciesModule { @Main Executor mainExecutor, IActivityManager iActivityManager, OngoingCallLogger logger, - DumpManager dumpManager) { + DumpManager dumpManager, + StatusBarWindowController statusBarWindowController) { + Optional windowController = + featureFlags.isOngoingCallInImmersiveEnabled() + ? Optional.of(statusBarWindowController) + : Optional.empty(); OngoingCallController ongoingCallController = new OngoingCallController( notifCollection, featureFlags, systemClock, activityStarter, mainExecutor, - iActivityManager, logger, dumpManager); + iActivityManager, logger, dumpManager, windowController); ongoingCallController.init(); return ongoingCallController; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index aec27d0ac2010..b708861ecc744 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -208,6 +208,12 @@ public class StatusBarWindowController { apply(mCurrentState); } + /** Sets whether there is currently an ongoing call. */ + public void setIsCallOngoing(boolean isCallOngoing) { + mCurrentState.mIsCallOngoing = isCallOngoing; + apply(mCurrentState); + } + /** * Return the container in which we should run launch animations started from the status bar and * expanding into the opening window. @@ -248,10 +254,13 @@ public class StatusBarWindowController { private static class State { boolean mForceStatusBarVisible; boolean mIsLaunchAnimationRunning; + boolean mIsCallOngoing; } private void applyForceStatusBarVisibleFlag(State state) { - if (state.mForceStatusBarVisible || state.mIsLaunchAnimationRunning) { + if (state.mForceStatusBarVisible + || state.mIsLaunchAnimationRunning + || state.mIsCallOngoing) { mLpChanged.privateFlags |= PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; } else { mLpChanged.privateFlags &= ~PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt index ab6ee89627efa..b7c80def7dad4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt @@ -37,10 +37,12 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener +import com.android.systemui.statusbar.phone.StatusBarWindowController import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.util.time.SystemClock import java.io.FileDescriptor import java.io.PrintWriter +import java.util.Optional import java.util.concurrent.Executor import javax.inject.Inject @@ -57,6 +59,7 @@ class OngoingCallController @Inject constructor( private val iActivityManager: IActivityManager, private val logger: OngoingCallLogger, private val dumpManager: DumpManager, + private val statusBarWindowController: Optional, ) : CallbackController, Dumpable { /** Non-null if there's an active call notification. */ @@ -201,7 +204,7 @@ class OngoingCallController @Inject constructor( } setUpUidObserver(currentCallNotificationInfo) - + statusBarWindowController.ifPresent { it.setIsCallOngoing(true) } mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) } } else { // If we failed to update the chip, don't store the call info. Then [hasOngoingCall] @@ -268,6 +271,7 @@ class OngoingCallController @Inject constructor( private fun removeChip() { callNotificationInfo = null tearDownChipView() + statusBarWindowController.ifPresent { it.setIsCallOngoing(false) } mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) } if (uidObserver != null) { iActivityManager.unregisterUidObserver(uidObserver) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt index fe7ec68f77b87..e97aba2816e16 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallControllerTest.kt @@ -40,6 +40,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener +import com.android.systemui.statusbar.phone.StatusBarWindowController import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.time.FakeSystemClock @@ -60,6 +61,7 @@ import org.mockito.Mockito.reset import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import java.util.Optional private const val CALL_UID = 900 @@ -84,6 +86,7 @@ class OngoingCallControllerTest : SysuiTestCase() { @Mock private lateinit var mockOngoingCallListener: OngoingCallListener @Mock private lateinit var mockActivityStarter: ActivityStarter @Mock private lateinit var mockIActivityManager: IActivityManager + @Mock private lateinit var mockStatusBarWindowController: StatusBarWindowController private lateinit var chipView: View @@ -108,6 +111,7 @@ class OngoingCallControllerTest : SysuiTestCase() { mockIActivityManager, OngoingCallLogger(uiEventLoggerFake), DumpManager(), + Optional.of(mockStatusBarWindowController), ) controller.init() controller.addCallback(mockOngoingCallListener) @@ -133,6 +137,13 @@ class OngoingCallControllerTest : SysuiTestCase() { verify(mockOngoingCallListener).onOngoingCallStateChanged(anyBoolean()) } + @Test + fun onEntryUpdated_isOngoingCallNotif_windowControllerUpdated() { + notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) + + verify(mockStatusBarWindowController).setIsCallOngoing(true) + } + @Test fun onEntryUpdated_notOngoingCallNotif_listenerNotNotified() { notifCollectionListener.onEntryUpdated(createNotCallNotifEntry()) @@ -224,6 +235,16 @@ class OngoingCallControllerTest : SysuiTestCase() { verify(mockOngoingCallListener).onOngoingCallStateChanged(anyBoolean()) } + @Test + fun onEntryUpdated_callNotifAddedThenRemoved_windowControllerUpdated() { + val ongoingCallNotifEntry = createOngoingCallNotifEntry() + notifCollectionListener.onEntryAdded(ongoingCallNotifEntry) + + notifCollectionListener.onEntryRemoved(ongoingCallNotifEntry, REASON_USER_STOPPED) + + verify(mockStatusBarWindowController).setIsCallOngoing(false) + } + /** Regression test for b/188491504. */ @Test fun onEntryRemoved_removedNotifHasSameKeyAsAddedNotif_listenerNotified() {