Merge "[Ongoing Call] Always unregister the UidObserver." into sc-dev

This commit is contained in:
Caitlin Cassidy
2021-08-10 14:22:13 +00:00
committed by Android (Google) Code Review
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.