diff options
| author | 2021-10-12 18:10:22 +0000 | |
|---|---|---|
| committer | 2021-10-12 18:10:22 +0000 | |
| commit | 6db6e348df3a73c80278327a66bdc3cece75070e (patch) | |
| tree | ad86b09632163c882ab45ad19243519e5c3917b9 | |
| parent | 304d678097fed2a648f1d016782be044303c7548 (diff) | |
| parent | de3c5c08081339b91d774bb3f5b6dc1e13c8713c (diff) | |
Merge "[Ongoing Call] Add an option to disable tapping the chip while in immersive mode." into sc-v2-dev
5 files changed, 120 insertions, 30 deletions
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml index d6d98b9397ac..740e97c4e443 100644 --- a/packages/SystemUI/res/values/flags.xml +++ b/packages/SystemUI/res/values/flags.xml @@ -48,6 +48,8 @@ <bool name="flag_ongoing_call_in_immersive">false</bool> + <bool name="flag_ongoing_call_in_immersive_chip_tap">true</bool> + <bool name="flag_smartspace">false</bool> <bool name="flag_smartspace_deduping">true</bool> diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java index f81811ac0ffb..15072a52f531 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java @@ -166,6 +166,11 @@ public class FeatureFlags { && mFlagReader.isEnabled(R.bool.flag_ongoing_call_in_immersive); } + public boolean isOngoingCallInImmersiveChipTapEnabled() { + return isOngoingCallInImmersiveEnabled() + && mFlagReader.isEnabled(R.bool.flag_ongoing_call_in_immersive_chip_tap); + } + 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 452e7370fc30..5758ba41eb1e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarDependenciesModule.java @@ -257,7 +257,8 @@ public interface StatusBarDependenciesModule { OngoingCallLogger logger, DumpManager dumpManager, StatusBarWindowController statusBarWindowController, - SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler) { + SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler, + StatusBarStateController statusBarStateController) { Optional<StatusBarWindowController> windowController = featureFlags.isOngoingCallInImmersiveEnabled() ? Optional.of(statusBarWindowController) @@ -277,8 +278,8 @@ public interface StatusBarDependenciesModule { logger, dumpManager, windowController, - gestureHandler - ); + gestureHandler, + statusBarStateController); ongoingCallController.init(); return ongoingCallController; } 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 c3c935e2ab7e..7d476bfbee04 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 @@ -34,6 +34,7 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.flags.FeatureFlags +import com.android.systemui.plugins.statusbar.StatusBarStateController 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 @@ -61,8 +62,10 @@ class OngoingCallController @Inject constructor( private val dumpManager: DumpManager, private val statusBarWindowController: Optional<StatusBarWindowController>, private val swipeStatusBarAwayGestureHandler: Optional<SwipeStatusBarAwayGestureHandler>, + private val statusBarStateController: StatusBarStateController, ) : CallbackController<OngoingCallListener>, Dumpable { + private var isFullscreen: Boolean = false /** Non-null if there's an active call notification. */ private var callNotificationInfo: CallNotificationInfo? = null /** True if the application managing the call is visible to the user. */ @@ -124,6 +127,7 @@ class OngoingCallController @Inject constructor( dumpManager.registerDumpable(this) if (featureFlags.isOngoingCallStatusBarChipEnabled) { notifCollection.addCollectionListener(notifListener) + statusBarStateController.addCallback(statusBarStateListener) } } @@ -177,10 +181,8 @@ class OngoingCallController @Inject constructor( val currentChipView = chipView val timeView = currentChipView?.getTimeView() - val backgroundView = - currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background) - if (currentChipView != null && timeView != null && backgroundView != null) { + if (currentChipView != null && timeView != null) { if (currentCallNotificationInfo.hasValidStartTime()) { timeView.setShouldHideText(false) timeView.base = currentCallNotificationInfo.callStartTime - @@ -191,19 +193,8 @@ class OngoingCallController @Inject constructor( timeView.setShouldHideText(true) timeView.stop() } + updateChipClickListener() - currentCallNotificationInfo.intent?.let { intent -> - currentChipView.setOnClickListener { - logger.logChipClicked() - activityStarter.postStartActivityDismissingKeyguard( - intent, - 0, - ActivityLaunchAnimator.Controller.fromView( - backgroundView, - InteractionJankMonitor.CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP) - ) - } - } setUpUidObserver(currentCallNotificationInfo) if (!currentCallNotificationInfo.statusBarSwipedAway) { statusBarWindowController.ifPresent { @@ -227,6 +218,30 @@ class OngoingCallController @Inject constructor( } } + private fun updateChipClickListener() { + if (callNotificationInfo == null) { return } + if (isFullscreen && !featureFlags.isOngoingCallInImmersiveChipTapEnabled) { + chipView?.setOnClickListener(null) + } else { + val currentChipView = chipView + val backgroundView = + currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background) + val intent = callNotificationInfo?.intent + if (currentChipView != null && backgroundView != null && intent != null) { + currentChipView.setOnClickListener { + logger.logChipClicked() + activityStarter.postStartActivityDismissingKeyguard( + intent, + 0, + ActivityLaunchAnimator.Controller.fromView( + backgroundView, + InteractionJankMonitor.CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP) + ) + } + } + } + } + /** * Sets up an [IUidObserver] to monitor the status of the application managing the ongoing call. */ @@ -304,14 +319,21 @@ class OngoingCallController @Inject constructor( * This method updates the status bar window appropriately when the swipe away gesture is * detected. */ - private fun onSwipeAwayGestureDetected() { - if (DEBUG) { Log.d(TAG, "Swipe away gesture detected") } - callNotificationInfo = callNotificationInfo?.copy(statusBarSwipedAway = true) - statusBarWindowController.ifPresent { - it.setOngoingProcessRequiresStatusBarVisible(false) - } - swipeStatusBarAwayGestureHandler.ifPresent { - it.removeOnGestureDetectedCallback(TAG) + private fun onSwipeAwayGestureDetected() { + if (DEBUG) { Log.d(TAG, "Swipe away gesture detected") } + callNotificationInfo = callNotificationInfo?.copy(statusBarSwipedAway = true) + statusBarWindowController.ifPresent { + it.setOngoingProcessRequiresStatusBarVisible(false) + } + swipeStatusBarAwayGestureHandler.ifPresent { + it.removeOnGestureDetectedCallback(TAG) + } + } + + private val statusBarStateListener = object : StatusBarStateController.StateListener { + override fun onFullscreenStateChanged(isFullscreen: Boolean) { + this@OngoingCallController.isFullscreen = isFullscreen + updateChipClickListener() } } 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 be2787670d37..ca6e1ee41c31 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 @@ -36,6 +36,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.flags.FeatureFlags +import com.android.systemui.plugins.statusbar.StatusBarStateController 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 @@ -82,11 +83,13 @@ class OngoingCallControllerTest : SysuiTestCase() { private lateinit var controller: OngoingCallController private lateinit var notifCollectionListener: NotifCollectionListener + @Mock private lateinit var mockFeatureFlags: FeatureFlags @Mock private lateinit var mockSwipeStatusBarAwayGestureHandler: SwipeStatusBarAwayGestureHandler @Mock private lateinit var mockOngoingCallListener: OngoingCallListener @Mock private lateinit var mockActivityStarter: ActivityStarter @Mock private lateinit var mockIActivityManager: IActivityManager @Mock private lateinit var mockStatusBarWindowController: StatusBarWindowController + @Mock private lateinit var mockStatusBarStateController: StatusBarStateController private lateinit var chipView: View @@ -98,13 +101,12 @@ class OngoingCallControllerTest : SysuiTestCase() { } MockitoAnnotations.initMocks(this) - val featureFlags = mock(FeatureFlags::class.java) - `when`(featureFlags.isOngoingCallStatusBarChipEnabled).thenReturn(true) + `when`(mockFeatureFlags.isOngoingCallStatusBarChipEnabled).thenReturn(true) val notificationCollection = mock(CommonNotifCollection::class.java) controller = OngoingCallController( notificationCollection, - featureFlags, + mockFeatureFlags, clock, mockActivityStarter, mainExecutor, @@ -113,7 +115,8 @@ class OngoingCallControllerTest : SysuiTestCase() { DumpManager(), Optional.of(mockStatusBarWindowController), Optional.of(mockSwipeStatusBarAwayGestureHandler), - ) + mockStatusBarStateController, + ) controller.init() controller.addCallback(mockOngoingCallListener) controller.setChipView(chipView) @@ -455,6 +458,56 @@ class OngoingCallControllerTest : SysuiTestCase() { // Other tests for notifyChipVisibilityChanged are in [OngoingCallLogger], since // [OngoingCallController.notifyChipVisibilityChanged] just delegates to that class. + @Test + fun callNotificationAdded_chipIsClickable() { + notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) + + assertThat(chipView.hasOnClickListeners()).isTrue() + } + + @Test + fun fullscreenIsTrue_thenCallNotificationAdded_chipNotClickable() { + `when`(mockFeatureFlags.isOngoingCallInImmersiveChipTapEnabled).thenReturn(false) + + getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) + notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) + + assertThat(chipView.hasOnClickListeners()).isFalse() + } + + @Test + fun callNotificationAdded_thenFullscreenIsTrue_chipNotClickable() { + `when`(mockFeatureFlags.isOngoingCallInImmersiveChipTapEnabled).thenReturn(false) + + notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) + getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) + + assertThat(chipView.hasOnClickListeners()).isFalse() + } + + @Test + fun fullscreenChangesToFalse_chipClickable() { + `when`(mockFeatureFlags.isOngoingCallInImmersiveChipTapEnabled).thenReturn(false) + + notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) + // First, update to true + getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) + // Then, update to false + getStateListener().onFullscreenStateChanged(/* isFullscreen= */ false) + + assertThat(chipView.hasOnClickListeners()).isTrue() + } + + @Test + fun fullscreenIsTrue_butChipClickInImmersiveEnabled_chipClickable() { + `when`(mockFeatureFlags.isOngoingCallInImmersiveChipTapEnabled).thenReturn(true) + + notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry()) + getStateListener().onFullscreenStateChanged(/* isFullscreen= */ true) + + assertThat(chipView.hasOnClickListeners()).isTrue() + } + private fun createOngoingCallNotifEntry() = createCallNotifEntry(ongoingCallStyle) private fun createScreeningCallNotifEntry() = createCallNotifEntry(screeningCallStyle) @@ -479,6 +532,13 @@ class OngoingCallControllerTest : SysuiTestCase() { } private fun createNotCallNotifEntry() = NotificationEntryBuilder().build() + + private fun getStateListener(): StatusBarStateController.StateListener { + val statusBarStateListenerCaptor = ArgumentCaptor.forClass( + StatusBarStateController.StateListener::class.java) + verify(mockStatusBarStateController).addCallback(statusBarStateListenerCaptor.capture()) + return statusBarStateListenerCaptor.value!! + } } private val person = Person.Builder().setName("name").build() |