Merge "[Ongoing Call] Show status bar in immersive if there's an ongoing call." into sc-v2-dev

This commit is contained in:
Caitlin Cassidy
2021-10-06 16:57:31 +00:00
committed by Android (Google) Code Review
6 changed files with 51 additions and 4 deletions

View File

@@ -46,6 +46,8 @@
<bool name="flag_ongoing_call_status_bar_chip">true</bool> <bool name="flag_ongoing_call_status_bar_chip">true</bool>
<bool name="flag_ongoing_call_in_immersive">false</bool>
<bool name="flag_smartspace">false</bool> <bool name="flag_smartspace">false</bool>
<bool name="flag_smartspace_deduping">true</bool> <bool name="flag_smartspace_deduping">true</bool>

View File

@@ -161,6 +161,11 @@ public class FeatureFlags {
return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip); 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() { public boolean isSmartspaceEnabled() {
return mFlagReader.isEnabled(R.bool.flag_smartspace); return mFlagReader.isEnabled(R.bool.flag_smartspace);
} }

View File

@@ -65,6 +65,7 @@ import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl; import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback; 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.SystemUIHostDialogProvider;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLogger; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLogger;
@@ -253,11 +254,16 @@ public interface StatusBarDependenciesModule {
@Main Executor mainExecutor, @Main Executor mainExecutor,
IActivityManager iActivityManager, IActivityManager iActivityManager,
OngoingCallLogger logger, OngoingCallLogger logger,
DumpManager dumpManager) { DumpManager dumpManager,
StatusBarWindowController statusBarWindowController) {
Optional<StatusBarWindowController> windowController =
featureFlags.isOngoingCallInImmersiveEnabled()
? Optional.of(statusBarWindowController)
: Optional.empty();
OngoingCallController ongoingCallController = OngoingCallController ongoingCallController =
new OngoingCallController( new OngoingCallController(
notifCollection, featureFlags, systemClock, activityStarter, mainExecutor, notifCollection, featureFlags, systemClock, activityStarter, mainExecutor,
iActivityManager, logger, dumpManager); iActivityManager, logger, dumpManager, windowController);
ongoingCallController.init(); ongoingCallController.init();
return ongoingCallController; return ongoingCallController;
} }

View File

@@ -208,6 +208,12 @@ public class StatusBarWindowController {
apply(mCurrentState); 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 * Return the container in which we should run launch animations started from the status bar and
* expanding into the opening window. * expanding into the opening window.
@@ -248,10 +254,13 @@ public class StatusBarWindowController {
private static class State { private static class State {
boolean mForceStatusBarVisible; boolean mForceStatusBarVisible;
boolean mIsLaunchAnimationRunning; boolean mIsLaunchAnimationRunning;
boolean mIsCallOngoing;
} }
private void applyForceStatusBarVisibleFlag(State state) { 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; mLpChanged.privateFlags |= PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;
} else { } else {
mLpChanged.privateFlags &= ~PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; mLpChanged.privateFlags &= ~PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR;

View File

@@ -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.NotificationEntry
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener 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.statusbar.policy.CallbackController
import com.android.systemui.util.time.SystemClock import com.android.systemui.util.time.SystemClock
import java.io.FileDescriptor import java.io.FileDescriptor
import java.io.PrintWriter import java.io.PrintWriter
import java.util.Optional
import java.util.concurrent.Executor import java.util.concurrent.Executor
import javax.inject.Inject import javax.inject.Inject
@@ -57,6 +59,7 @@ class OngoingCallController @Inject constructor(
private val iActivityManager: IActivityManager, private val iActivityManager: IActivityManager,
private val logger: OngoingCallLogger, private val logger: OngoingCallLogger,
private val dumpManager: DumpManager, private val dumpManager: DumpManager,
private val statusBarWindowController: Optional<StatusBarWindowController>,
) : CallbackController<OngoingCallListener>, Dumpable { ) : CallbackController<OngoingCallListener>, Dumpable {
/** Non-null if there's an active call notification. */ /** Non-null if there's an active call notification. */
@@ -201,7 +204,7 @@ class OngoingCallController @Inject constructor(
} }
setUpUidObserver(currentCallNotificationInfo) setUpUidObserver(currentCallNotificationInfo)
statusBarWindowController.ifPresent { it.setIsCallOngoing(true) }
mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) } mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
} else { } else {
// If we failed to update the chip, don't store the call info. Then [hasOngoingCall] // 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() { private fun removeChip() {
callNotificationInfo = null callNotificationInfo = null
tearDownChipView() tearDownChipView()
statusBarWindowController.ifPresent { it.setIsCallOngoing(false) }
mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) } mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
if (uidObserver != null) { if (uidObserver != null) {
iActivityManager.unregisterUidObserver(uidObserver) iActivityManager.unregisterUidObserver(uidObserver)

View File

@@ -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.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener 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.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
import com.android.systemui.util.time.FakeSystemClock 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.times
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
import java.util.Optional
private const val CALL_UID = 900 private const val CALL_UID = 900
@@ -84,6 +86,7 @@ class OngoingCallControllerTest : SysuiTestCase() {
@Mock private lateinit var mockOngoingCallListener: OngoingCallListener @Mock private lateinit var mockOngoingCallListener: OngoingCallListener
@Mock private lateinit var mockActivityStarter: ActivityStarter @Mock private lateinit var mockActivityStarter: ActivityStarter
@Mock private lateinit var mockIActivityManager: IActivityManager @Mock private lateinit var mockIActivityManager: IActivityManager
@Mock private lateinit var mockStatusBarWindowController: StatusBarWindowController
private lateinit var chipView: View private lateinit var chipView: View
@@ -108,6 +111,7 @@ class OngoingCallControllerTest : SysuiTestCase() {
mockIActivityManager, mockIActivityManager,
OngoingCallLogger(uiEventLoggerFake), OngoingCallLogger(uiEventLoggerFake),
DumpManager(), DumpManager(),
Optional.of(mockStatusBarWindowController),
) )
controller.init() controller.init()
controller.addCallback(mockOngoingCallListener) controller.addCallback(mockOngoingCallListener)
@@ -133,6 +137,13 @@ class OngoingCallControllerTest : SysuiTestCase() {
verify(mockOngoingCallListener).onOngoingCallStateChanged(anyBoolean()) verify(mockOngoingCallListener).onOngoingCallStateChanged(anyBoolean())
} }
@Test
fun onEntryUpdated_isOngoingCallNotif_windowControllerUpdated() {
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
verify(mockStatusBarWindowController).setIsCallOngoing(true)
}
@Test @Test
fun onEntryUpdated_notOngoingCallNotif_listenerNotNotified() { fun onEntryUpdated_notOngoingCallNotif_listenerNotNotified() {
notifCollectionListener.onEntryUpdated(createNotCallNotifEntry()) notifCollectionListener.onEntryUpdated(createNotCallNotifEntry())
@@ -224,6 +235,16 @@ class OngoingCallControllerTest : SysuiTestCase() {
verify(mockOngoingCallListener).onOngoingCallStateChanged(anyBoolean()) 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. */ /** Regression test for b/188491504. */
@Test @Test
fun onEntryRemoved_removedNotifHasSameKeyAsAddedNotif_listenerNotified() { fun onEntryRemoved_removedNotifHasSameKeyAsAddedNotif_listenerNotified() {