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