Merge "[Ongoing Call] Catch a security exception instead of crashing SysUI." into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
e586173d8d
@@ -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) {
|
||||||
|
try {
|
||||||
isCallAppVisible = isProcessVisibleToUser(
|
isCallAppVisible = isProcessVisibleToUser(
|
||||||
iActivityManager.getUidProcessState(currentCallNotificationInfo.uid, null))
|
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) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
iActivityManager.registerUidObserver(
|
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. */
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user