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_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>
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user