summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt19
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/controls/management/ControlsRequestReceiverTest.kt77
2 files changed, 89 insertions, 7 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 7e5b26732e00..c110d06aeedb 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsRequestReceiver.kt
@@ -28,7 +28,6 @@ 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
@@ -61,22 +60,28 @@ class ControlsRequestReceiver : BroadcastReceiver() {
}
val targetComponent = try {
- intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME)
- } catch (e: ClassCastException) {
+ intent.getParcelableExtra(Intent.EXTRA_COMPONENT_NAME, ComponentName::class.java)
+ } catch (e: Exception) {
Log.e(TAG, "Malformed intent extra ComponentName", e)
return
+ } ?: run {
+ Log.e(TAG, "Null target component")
+ return
}
val control = try {
- intent.getParcelableExtra<Control>(ControlsProviderService.EXTRA_CONTROL)
- } catch (e: ClassCastException) {
+ intent.getParcelableExtra(ControlsProviderService.EXTRA_CONTROL, Control::class.java)
+ } catch (e: Exception) {
Log.e(TAG, "Malformed intent extra Control", e)
return
+ } ?: run {
+ Log.e(TAG, "Null control")
+ return
}
- val packageName = targetComponent?.packageName
+ val packageName = targetComponent.packageName
- if (packageName == null || !isPackageInForeground(context, packageName)) {
+ if (!isPackageInForeground(context, packageName)) {
return
}
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 890b9aec69bf..ae77d1f590e3 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
@@ -24,6 +24,9 @@ import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.content.pm.PackageManager
+import android.os.Bundle
+import android.os.Parcel
+import android.os.Parcelable
import android.os.UserHandle
import android.service.controls.Control
import android.service.controls.ControlsProviderService
@@ -176,6 +179,64 @@ class ControlsRequestReceiverTest : SysuiTestCase() {
assertNull(wrapper.intent)
}
+ @Test
+ fun testClassNotFoundExceptionComponent_noCrash() {
+ val bundle = Bundle().apply {
+ putParcelable(Intent.EXTRA_COMPONENT_NAME, PrivateParcelable())
+ putParcelable(ControlsProviderService.EXTRA_CONTROL, control)
+ }
+ val parcel = Parcel.obtain()
+ bundle.writeToParcel(parcel, 0)
+
+ parcel.setDataPosition(0)
+
+ val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply {
+ parcel.readBundle()?.let { putExtras(it) }
+ }
+ receiver.onReceive(wrapper, badIntent)
+
+ assertNull(wrapper.intent)
+ }
+
+ @Test
+ fun testClassNotFoundExceptionControl_noCrash() {
+ val bundle = Bundle().apply {
+ putParcelable(Intent.EXTRA_COMPONENT_NAME, componentName)
+ putParcelable(ControlsProviderService.EXTRA_CONTROL, PrivateParcelable())
+ }
+ val parcel = Parcel.obtain()
+ bundle.writeToParcel(parcel, 0)
+
+ parcel.setDataPosition(0)
+
+ val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply {
+ parcel.readBundle()?.let { putExtras(it) }
+ }
+ receiver.onReceive(wrapper, badIntent)
+
+ assertNull(wrapper.intent)
+ }
+
+ @Test
+ fun testMissingComponentName_noCrash() {
+ val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply {
+ putExtra(ControlsProviderService.EXTRA_CONTROL, control)
+ }
+ receiver.onReceive(wrapper, badIntent)
+
+ assertNull(wrapper.intent)
+ }
+
+ @Test
+ fun testMissingControl_noCrash() {
+ val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply {
+ putExtra(Intent.EXTRA_COMPONENT_NAME, componentName)
+ }
+ receiver.onReceive(wrapper, badIntent)
+
+ assertNull(wrapper.intent)
+ }
+
class MyWrapper(context: Context) : ContextWrapper(context) {
var intent: Intent? = null
@@ -189,4 +250,20 @@ class ControlsRequestReceiverTest : SysuiTestCase() {
this.intent = intent
}
}
+
+ class PrivateParcelable : Parcelable {
+ override fun describeContents() = 0
+
+ override fun writeToParcel(dest: Parcel, flags: Int) {}
+
+ companion object CREATOR : Parcelable.Creator<PrivateParcelable?> {
+ override fun createFromParcel(source: Parcel?): PrivateParcelable {
+ return PrivateParcelable()
+ }
+
+ override fun newArray(size: Int): Array<PrivateParcelable?> {
+ return arrayOfNulls(size)
+ }
+ }
+ }
} \ No newline at end of file