diff options
| -rw-r--r-- | core/java/android/service/dreams/DreamService.java | 26 | ||||
| -rw-r--r-- | services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java | 18 |
2 files changed, 34 insertions, 10 deletions
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 997c958187fe..5f6bdbf193b9 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -1383,16 +1383,22 @@ public class DreamService extends Service implements Window.Callback { DreamService.DREAM_META_DATA, DREAM_META_DATA_ROOT_TAG, com.android.internal.R.styleable.Dream)) { if (rawMetadata == null) return null; - return new DreamMetadata( - convertToComponentName( - rawMetadata.getString( - com.android.internal.R.styleable.Dream_settingsActivity), serviceInfo), - rawMetadata.getDrawable( - com.android.internal.R.styleable.Dream_previewImage), - rawMetadata.getBoolean(R.styleable.Dream_showClockAndComplications, - DEFAULT_SHOW_COMPLICATIONS), - rawMetadata.getInt(R.styleable.Dream_dreamCategory, DREAM_CATEGORY_DEFAULT) - ); + try { + return new DreamMetadata( + convertToComponentName( + rawMetadata.getString( + com.android.internal.R.styleable.Dream_settingsActivity), + serviceInfo), + rawMetadata.getDrawable( + com.android.internal.R.styleable.Dream_previewImage), + rawMetadata.getBoolean(R.styleable.Dream_showClockAndComplications, + DEFAULT_SHOW_COMPLICATIONS), + rawMetadata.getInt(R.styleable.Dream_dreamCategory, DREAM_CATEGORY_DEFAULT) + ); + } catch (Exception exception) { + Log.e(TAG, "Failed to create read metadata", exception); + return null; + } } } diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java index 23314cdaf041..1322545c8d7e 100644 --- a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java +++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java @@ -20,12 +20,17 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; +import android.content.res.TypedArray; import android.os.Looper; import android.platform.test.annotations.EnableFlags; import android.service.dreams.DreamService; @@ -41,6 +46,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; @SmallTest @RunWith(AndroidJUnit4.class) @@ -83,6 +89,18 @@ public class DreamServiceTest { assertThat(metadata.dreamCategory).isEqualTo(DreamService.DREAM_CATEGORY_DEFAULT); } + @Test + public void testMetadataParsing_exceptionReading() { + final PackageManager packageManager = Mockito.mock(PackageManager.class); + final ServiceInfo serviceInfo = Mockito.mock(ServiceInfo.class); + final TypedArray rawMetadata = Mockito.mock(TypedArray.class); + when(packageManager.extractPackageItemInfoAttributes(eq(serviceInfo), any(), any(), any())) + .thenReturn(rawMetadata); + when(rawMetadata.getString(anyInt())).thenThrow(new RuntimeException("failure")); + + assertThat(DreamService.getDreamMetadata(packageManager, serviceInfo)).isNull(); + } + private DreamService.DreamMetadata getDreamMetadata(String dreamClassName) throws PackageManager.NameNotFoundException { final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); |