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_in_immersive">false</bool>
<bool name="flag_smartspace">false</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);
}
public boolean isOngoingCallInImmersiveEnabled() {
return isOngoingCallStatusBarChipEnabled()
&& mFlagReader.isEnabled(R.bool.flag_ongoing_call_in_immersive);
}
public boolean isSmartspaceEnabled() {
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.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<StatusBarWindowController> 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;
}

View File

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

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.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<StatusBarWindowController>,
) : CallbackController<OngoingCallListener>, 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)

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