[Ongoing Call] Catch a security exception instead of crashing SysUI.

This will mean that the ongoing call chip will stay visible even when
the user is in the calling process. However, this is much better than
crashing SysUI.

Fixes: 216693695
Bug: 216489355
Bug: 216248574
Test: verified starting a call won't crash SysUI even with ag/16659008
in the build.
Test: new unit test

Change-Id: I1108fc6fe01f284364331dd9de57ebe9390d4d78
Merged-In: I1108fc6fe01f284364331dd9de57ebe9390d4d78
This commit is contained in:
Caitlin Cassidy
2022-01-26 19:01:08 +00:00
parent 9492d508d8
commit 706633bcf8
2 changed files with 36 additions and 4 deletions

View File

@@ -242,8 +242,14 @@ class OngoingCallController @Inject constructor(
* Sets up an [IUidObserver] to monitor the status of the application managing the ongoing call.
*/
private fun setUpUidObserver(currentCallNotificationInfo: CallNotificationInfo) {
isCallAppVisible = isProcessVisibleToUser(
iActivityManager.getUidProcessState(currentCallNotificationInfo.uid, null))
try {
isCallAppVisible = isProcessVisibleToUser(
iActivityManager.getUidProcessState(currentCallNotificationInfo.uid, null)
)
} catch (se: SecurityException) {
Log.e(TAG, "Security exception when trying to get process state: $se")
return
}
if (uidObserver != null) {
iActivityManager.unregisterUidObserver(uidObserver)
@@ -275,12 +281,17 @@ class OngoingCallController @Inject constructor(
override fun onUidCachedChanged(uid: Int, cached: Boolean) {}
}
iActivityManager.registerUidObserver(
try {
iActivityManager.registerUidObserver(
uidObserver,
ActivityManager.UID_OBSERVER_PROCSTATE,
ActivityManager.PROCESS_STATE_UNKNOWN,
null
)
)
} catch (se: SecurityException) {
Log.e(TAG, "Security exception when trying to register uid observer: $se")
return
}
}
/** Returns true if the given [procState] represents a process that's visible to the user. */

View File

@@ -217,6 +217,27 @@ class OngoingCallControllerTest : SysuiTestCase() {
verify(mockIActivityManager, times(numCalls - 1)).unregisterUidObserver(any())
}
/** Regression test for b/216248574. */
@Test
fun entryUpdated_getUidProcessStateThrowsException_noCrash() {
`when`(mockIActivityManager.getUidProcessState(eq(CALL_UID), nullable(String::class.java)))
.thenThrow(SecurityException())
// No assert required, just check no crash
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
}
/** Regression test for b/216248574. */
@Test
fun entryUpdated_registerUidObserverThrowsException_noCrash() {
`when`(mockIActivityManager.registerUidObserver(
any(), any(), any(), nullable(String::class.java)
)).thenThrow(SecurityException())
// No assert required, just check no crash
notifCollectionListener.onEntryUpdated(createOngoingCallNotifEntry())
}
/**
* If a call notification is never added before #onEntryRemoved is called, then the listener
* should never be notified.