[Ongoing Call] Always unregister the UidObserver.

Test: atest OngoingCallControllerTest
Fixes: 194731244
Change-Id: I39d20313f78ec0c632dcde999abc0057141bac64
This commit is contained in:
Caitlin Cassidy
2021-08-09 17:17:03 +00:00
parent be851a2ae3
commit 5329ad47a5
2 changed files with 19 additions and 0 deletions

View File

@@ -218,6 +218,10 @@ class OngoingCallController @Inject constructor(
isCallAppVisible = isProcessVisibleToUser(
iActivityManager.getUidProcessState(currentCallNotificationInfo.uid, null))
if (uidObserver != null) {
iActivityManager.unregisterUidObserver(uidObserver)
}
uidObserver = object : IUidObserver.Stub() {
override fun onUidStateChanged(
uid: Int, procState: Int, procStateSeq: Long, capability: Int) {

View File

@@ -184,6 +184,21 @@ class OngoingCallControllerTest : SysuiTestCase() {
.isGreaterThan(0)
}
/** Regression test for b/194731244. */
@Test
fun onEntryUpdated_calledManyTimes_uidObserverUnregisteredManyTimes() {
val numCalls = 4
for (i in 0 until numCalls) {
// Re-create the notification each time so that it's considered a different object and
// observers will get re-registered (and hopefully unregistered).
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
}
// There should be 1 observer still registered, so we should unregister n-1 times.
verify(mockIActivityManager, times(numCalls - 1)).unregisterUidObserver(any())
}
/**
* If a call notification is never added before #onEntryRemoved is called, then the listener
* should never be notified.