From 3ff7e05c3a354904a6169454f118a2c33d88ed14 Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Wed, 21 Jul 2021 18:17:25 +0800 Subject: [PATCH] Add the failure listener into the lottie animation view of IllustrationPreference. Root cause: The component is unable to parse composition if the lottie file format is not correct. Solution: Add the failure listener was provided from lottie animation view to avoid throwing the exception to crash. Bug: 194223160 Test: manual test in the aosp ROM by forrest build Change-Id: I8e515d244f904921b9d6f3e6bdf439550bc562a9 --- .../widget/IllustrationPreference.java | 28 ++++++++----------- .../widget/IllustrationPreferenceTest.java | 25 +++++++++++++++++ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java index f04b0e338959f..266fc78b2b6ab 100644 --- a/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java +++ b/packages/SettingsLib/IllustrationPreference/src/com/android/settingslib/widget/IllustrationPreference.java @@ -267,26 +267,22 @@ public class IllustrationPreference extends Preference { private static void startLottieAnimationWith(LottieAnimationView illustrationView, Uri imageUri) { - try { - final InputStream inputStream = - getInputStreamFromUri(illustrationView.getContext(), imageUri); - illustrationView.setAnimation(inputStream, /* cacheKey= */ null); - illustrationView.setRepeatCount(LottieDrawable.INFINITE); - illustrationView.playAnimation(); - } catch (IllegalStateException e) { - Log.w(TAG, "Invalid illustration image uri: " + imageUri, e); - } + final InputStream inputStream = + getInputStreamFromUri(illustrationView.getContext(), imageUri); + illustrationView.setFailureListener( + result -> Log.w(TAG, "Invalid illustration image uri: " + imageUri, result)); + illustrationView.setAnimation(inputStream, /* cacheKey= */ null); + illustrationView.setRepeatCount(LottieDrawable.INFINITE); + illustrationView.playAnimation(); } private static void startLottieAnimationWith(LottieAnimationView illustrationView, @RawRes int rawRes) { - try { - illustrationView.setAnimation(rawRes); - illustrationView.setRepeatCount(LottieDrawable.INFINITE); - illustrationView.playAnimation(); - } catch (IllegalStateException e) { - Log.w(TAG, "Invalid illustration resource id: " + rawRes, e); - } + illustrationView.setFailureListener( + result -> Log.w(TAG, "Invalid illustration resource id: " + rawRes, result)); + illustrationView.setAnimation(rawRes); + illustrationView.setRepeatCount(LottieDrawable.INFINITE); + illustrationView.playAnimation(); } private static void resetAnimations(LottieAnimationView illustrationView) { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java index ea9be04527be1..9e3312ae2ddf8 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/IllustrationPreferenceTest.java @@ -18,6 +18,8 @@ package com.android.settingslib.widget; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -130,4 +132,27 @@ public class IllustrationPreferenceTest { verify(drawable).start(); } + + @Test + public void playLottieAnimationWithUri_verifyFailureListener() { + doReturn(null).when(mAnimationView).getDrawable(); + + mPreference.setImageUri(mImageUri); + mPreference.onBindViewHolder(mViewHolder); + + verify(mAnimationView).setFailureListener(any()); + } + + @Test + public void playLottieAnimationWithResource_verifyFailureListener() { + // fake the valid lottie image + final int fakeValidResId = 111; + doNothing().when(mAnimationView).setImageResource(fakeValidResId); + doReturn(null).when(mAnimationView).getDrawable(); + + mPreference.setLottieAnimationResId(fakeValidResId); + mPreference.onBindViewHolder(mViewHolder); + + verify(mAnimationView).setFailureListener(any()); + } }