Merge "[Ongoing Call Chip] Remove the chip when an ongoing call notification is updated to a non-ongoing call notification." into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
168ba65337
@@ -82,16 +82,14 @@ class OngoingCallController @Inject constructor(
|
|||||||
entry.sbn.notification.contentIntent.intent,
|
entry.sbn.notification.contentIntent.intent,
|
||||||
entry.sbn.uid)
|
entry.sbn.uid)
|
||||||
updateChip()
|
updateChip()
|
||||||
|
} else if (isCallNotification(entry)) {
|
||||||
|
removeChip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onEntryRemoved(entry: NotificationEntry, reason: Int) {
|
override fun onEntryRemoved(entry: NotificationEntry, reason: Int) {
|
||||||
if (isOngoingCallNotification(entry)) {
|
if (isOngoingCallNotification(entry)) {
|
||||||
ongoingCallInfo = null
|
removeChip()
|
||||||
mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
|
|
||||||
if (uidObserver != null) {
|
|
||||||
iActivityManager.unregisterUidObserver(uidObserver)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,6 +222,14 @@ class OngoingCallController @Inject constructor(
|
|||||||
return procState <= ActivityManager.PROCESS_STATE_TOP
|
return procState <= ActivityManager.PROCESS_STATE_TOP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun removeChip() {
|
||||||
|
ongoingCallInfo = null
|
||||||
|
mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
|
||||||
|
if (uidObserver != null) {
|
||||||
|
iActivityManager.unregisterUidObserver(uidObserver)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class OngoingCallInfo(
|
private class OngoingCallInfo(
|
||||||
val callStartTime: Long,
|
val callStartTime: Long,
|
||||||
val intent: Intent,
|
val intent: Intent,
|
||||||
@@ -233,10 +239,15 @@ class OngoingCallController @Inject constructor(
|
|||||||
|
|
||||||
private fun isOngoingCallNotification(entry: NotificationEntry): Boolean {
|
private fun isOngoingCallNotification(entry: NotificationEntry): Boolean {
|
||||||
val extras = entry.sbn.notification.extras
|
val extras = entry.sbn.notification.extras
|
||||||
val callStyleTemplateName = Notification.CallStyle::class.java.name
|
return isCallNotification(entry) &&
|
||||||
return extras.getString(Notification.EXTRA_TEMPLATE) == callStyleTemplateName &&
|
|
||||||
extras.getInt(Notification.EXTRA_CALL_TYPE, -1) == CALL_TYPE_ONGOING
|
extras.getInt(Notification.EXTRA_CALL_TYPE, -1) == CALL_TYPE_ONGOING
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isCallNotification(entry: NotificationEntry): Boolean {
|
||||||
|
val extras = entry.sbn.notification.extras
|
||||||
|
val callStyleTemplateName = Notification.CallStyle::class.java.name
|
||||||
|
return extras.getString(Notification.EXTRA_TEMPLATE) == callStyleTemplateName
|
||||||
|
}
|
||||||
|
|
||||||
private const val TAG = "OngoingCallController"
|
private const val TAG = "OngoingCallController"
|
||||||
private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
|
private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ class OngoingCallControllerTest : SysuiTestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun onEntryUpdated_isOngoingCallNotif_listenerNotifiedWithRightCallTime() {
|
fun onEntryUpdated_isOngoingCallNotif_listenerNotified() {
|
||||||
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
|
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
|
||||||
|
|
||||||
verify(mockOngoingCallListener).onOngoingCallStateChanged(anyBoolean())
|
verify(mockOngoingCallListener).onOngoingCallStateChanged(anyBoolean())
|
||||||
@@ -129,6 +129,15 @@ class OngoingCallControllerTest : SysuiTestCase() {
|
|||||||
verify(mockOngoingCallListener, never()).onOngoingCallStateChanged(anyBoolean())
|
verify(mockOngoingCallListener, never()).onOngoingCallStateChanged(anyBoolean())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun onEntryUpdated_ongoingCallNotifThenScreeningCallNotif_listenerNotifiedTwice() {
|
||||||
|
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
|
||||||
|
notifCollectionListener.onEntryUpdated(createScreeningCallNotifEntry())
|
||||||
|
|
||||||
|
verify(mockOngoingCallListener, times(2))
|
||||||
|
.onOngoingCallStateChanged(anyBoolean())
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun onEntryRemoved_ongoingCallNotif_listenerNotified() {
|
fun onEntryRemoved_ongoingCallNotif_listenerNotified() {
|
||||||
notifCollectionListener.onEntryRemoved(createOngoingCallNotifEntry(), REASON_USER_STOPPED)
|
notifCollectionListener.onEntryRemoved(createOngoingCallNotifEntry(), REASON_USER_STOPPED)
|
||||||
@@ -188,6 +197,22 @@ class OngoingCallControllerTest : SysuiTestCase() {
|
|||||||
assertThat(controller.hasOngoingCall()).isFalse()
|
assertThat(controller.hasOngoingCall()).isFalse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun hasOngoingCall_ongoingCallNotifSentThenScreeningCallNotifSent_returnsFalse() {
|
||||||
|
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
|
||||||
|
notifCollectionListener.onEntryUpdated(createScreeningCallNotifEntry())
|
||||||
|
|
||||||
|
assertThat(controller.hasOngoingCall()).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun hasOngoingCall_ongoingCallNotifSentThenUnrelatedNotifSent_returnsTrue() {
|
||||||
|
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
|
||||||
|
notifCollectionListener.onEntryUpdated(createNotCallNotifEntry())
|
||||||
|
|
||||||
|
assertThat(controller.hasOngoingCall()).isTrue()
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This test fakes a theme change during an ongoing call.
|
* This test fakes a theme change during an ongoing call.
|
||||||
*
|
*
|
||||||
@@ -281,9 +306,13 @@ class OngoingCallControllerTest : SysuiTestCase() {
|
|||||||
// Other tests for notifyChipVisibilityChanged are in [OngoingCallLogger], since
|
// Other tests for notifyChipVisibilityChanged are in [OngoingCallLogger], since
|
||||||
// [OngoingCallController.notifyChipVisibilityChanged] just delegates to that class.
|
// [OngoingCallController.notifyChipVisibilityChanged] just delegates to that class.
|
||||||
|
|
||||||
private fun createOngoingCallNotifEntry(): NotificationEntry {
|
private fun createOngoingCallNotifEntry() = createCallNotifEntry(ongoingCallStyle)
|
||||||
|
|
||||||
|
private fun createScreeningCallNotifEntry() = createCallNotifEntry(screeningCallStyle)
|
||||||
|
|
||||||
|
private fun createCallNotifEntry(callStyle: Notification.CallStyle): NotificationEntry {
|
||||||
val notificationEntryBuilder = NotificationEntryBuilder()
|
val notificationEntryBuilder = NotificationEntryBuilder()
|
||||||
notificationEntryBuilder.modifyNotification(context).style = ongoingCallStyle
|
notificationEntryBuilder.modifyNotification(context).style = callStyle
|
||||||
|
|
||||||
val contentIntent = mock(PendingIntent::class.java)
|
val contentIntent = mock(PendingIntent::class.java)
|
||||||
`when`(contentIntent.intent).thenReturn(mock(Intent::class.java))
|
`when`(contentIntent.intent).thenReturn(mock(Intent::class.java))
|
||||||
@@ -295,6 +324,9 @@ class OngoingCallControllerTest : SysuiTestCase() {
|
|||||||
private fun createNotCallNotifEntry() = NotificationEntryBuilder().build()
|
private fun createNotCallNotifEntry() = NotificationEntryBuilder().build()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ongoingCallStyle = Notification.CallStyle.forOngoingCall(
|
private val person = Person.Builder().setName("name").build()
|
||||||
Person.Builder().setName("name").build(),
|
private val hangUpIntent = mock(PendingIntent::class.java)
|
||||||
/* hangUpIntent= */ mock(PendingIntent::class.java))
|
|
||||||
|
private val ongoingCallStyle = Notification.CallStyle.forOngoingCall(person, hangUpIntent)
|
||||||
|
private val screeningCallStyle = Notification.CallStyle.forScreeningCall(
|
||||||
|
person, hangUpIntent, /* answerIntent= */ mock(PendingIntent::class.java))
|
||||||
Reference in New Issue
Block a user