Merge "[Ongoing Call] Catch a security exception instead of crashing SysUI." into tm-dev

This commit is contained in:
Caitlin Cassidy
2022-02-24 15:49:59 +00:00
committed by Android (Google) Code Review
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. * Sets up an [IUidObserver] to monitor the status of the application managing the ongoing call.
*/ */
private fun setUpUidObserver(currentCallNotificationInfo: CallNotificationInfo) { private fun setUpUidObserver(currentCallNotificationInfo: CallNotificationInfo) {
isCallAppVisible = isProcessVisibleToUser( try {
iActivityManager.getUidProcessState(currentCallNotificationInfo.uid, null)) 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) { if (uidObserver != null) {
iActivityManager.unregisterUidObserver(uidObserver) iActivityManager.unregisterUidObserver(uidObserver)
@@ -275,12 +281,17 @@ class OngoingCallController @Inject constructor(
override fun onUidCachedChanged(uid: Int, cached: Boolean) {} override fun onUidCachedChanged(uid: Int, cached: Boolean) {}
} }
iActivityManager.registerUidObserver( try {
iActivityManager.registerUidObserver(
uidObserver, uidObserver,
ActivityManager.UID_OBSERVER_PROCSTATE, ActivityManager.UID_OBSERVER_PROCSTATE,
ActivityManager.PROCESS_STATE_UNKNOWN, ActivityManager.PROCESS_STATE_UNKNOWN,
null 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. */ /** 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()) 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 * If a call notification is never added before #onEntryRemoved is called, then the listener
* should never be notified. * should never be notified.