Merge "[Ongoing Call] Show status bar in immersive if there's an ongoing call." into sc-v2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b19f61c2af
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user