diff options
2 files changed, 40 insertions, 8 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt index bf84d77224b1..7e5b26732e00 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt @@ -28,6 +28,7 @@ import android.os.UserHandle import android.service.controls.Control import android.service.controls.ControlsProviderService import android.util.Log +import java.lang.ClassCastException /** * Proxy to launch in user 0 @@ -59,20 +60,29 @@ class ControlsRequestReceiver : BroadcastReceiver() { return } - val packageName = intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME) - ?.packageName + val targetComponent = try { + intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME) + } catch (e: ClassCastException) { + Log.e(TAG, "Malformed intent extra ComponentName", e) + return + } + + val control = try { + intent.getParcelableExtra<Control>(ControlsProviderService.EXTRA_CONTROL) + } catch (e: ClassCastException) { + Log.e(TAG, "Malformed intent extra Control", e) + return + } + + val packageName = targetComponent?.packageName if (packageName == null || !isPackageInForeground(context, packageName)) { return } val activityIntent = Intent(context, ControlsRequestDialog::class.java).apply { - Intent.EXTRA_COMPONENT_NAME.let { - putExtra(it, intent.getParcelableExtra<ComponentName>(it)) - } - ControlsProviderService.EXTRA_CONTROL.let { - putExtra(it, intent.getParcelableExtra<Control>(it)) - } + putExtra(Intent.EXTRA_COMPONENT_NAME, targetComponent) + putExtra(ControlsProviderService.EXTRA_CONTROL, control) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) } activityIntent.putExtra(Intent.EXTRA_USER_ID, context.userId) diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestReceiverTest.kt index ee1cc7b1ab71..890b9aec69bf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestReceiverTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestReceiverTest.kt @@ -154,6 +154,28 @@ class ControlsRequestReceiverTest : SysuiTestCase() { assertNull(wrapper.intent) } + @Test + fun testClassCastExceptionComponentName_noCrash() { + val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply { + putExtra(Intent.EXTRA_COMPONENT_NAME, Intent()) + putExtra(ControlsProviderService.EXTRA_CONTROL, control) + } + receiver.onReceive(wrapper, badIntent) + + assertNull(wrapper.intent) + } + + @Test + fun testClassCastExceptionControl_noCrash() { + val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply { + putExtra(Intent.EXTRA_COMPONENT_NAME, componentName) + putExtra(ControlsProviderService.EXTRA_CONTROL, Intent()) + } + receiver.onReceive(wrapper, badIntent) + + assertNull(wrapper.intent) + } + class MyWrapper(context: Context) : ContextWrapper(context) { var intent: Intent? = null |