From 661a5f0b01213fe4f05a277f8225b446ffb5aa36 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Tue, 8 Jun 2021 16:16:21 +0800 Subject: [PATCH] Return default value safely without throw out exception. Fixes: 190463685 Test: launch app and see no exception breaking the creation of splash screen view. Change-Id: Icae3b189068f074fdc061d0c510faceb024a26c6 --- .../SplashscreenContentDrawer.java | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java index 51a67e2131447..bf1f9e431c6a1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java @@ -60,6 +60,7 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.IntSupplier; import java.util.function.Supplier; +import java.util.function.UnaryOperator; /** * Util class to create the view for a splash screen content. @@ -207,6 +208,15 @@ public class SplashscreenContentDrawer { .build(); } + private static T safeReturnAttrDefault(UnaryOperator getMethod, T def) { + try { + return getMethod.apply(def); + } catch (RuntimeException e) { + Slog.w(TAG, "Get attribute fail, return default: " + e.getMessage()); + return def; + } + } + /** * Get the {@link SplashScreenWindowAttrs} from {@code context} and fill them into * {@code attrs}. @@ -215,16 +225,18 @@ public class SplashscreenContentDrawer { final TypedArray typedArray = context.obtainStyledAttributes( com.android.internal.R.styleable.Window); attrs.mWindowBgResId = typedArray.getResourceId(R.styleable.Window_windowBackground, 0); - attrs.mWindowBgColor = typedArray.getColor( - R.styleable.Window_windowSplashScreenBackground, Color.TRANSPARENT); - attrs.mReplaceIcon = typedArray.getDrawable( - R.styleable.Window_windowSplashScreenAnimatedIcon); - attrs.mAnimationDuration = typedArray.getInt( - R.styleable.Window_windowSplashScreenAnimationDuration, 0); - attrs.mBrandingImage = typedArray.getDrawable( - R.styleable.Window_windowSplashScreenBrandingImage); - attrs.mIconBgColor = typedArray.getColor( - R.styleable.Window_windowSplashScreenIconBackgroundColor, Color.TRANSPARENT); + attrs.mWindowBgColor = safeReturnAttrDefault((def) -> typedArray.getColor( + R.styleable.Window_windowSplashScreenBackground, def), + Color.TRANSPARENT); + attrs.mReplaceIcon = safeReturnAttrDefault((def) -> typedArray.getDrawable( + R.styleable.Window_windowSplashScreenAnimatedIcon), null); + attrs.mAnimationDuration = safeReturnAttrDefault((def) -> typedArray.getInt( + R.styleable.Window_windowSplashScreenAnimationDuration, def), 0); + attrs.mBrandingImage = safeReturnAttrDefault((def) -> typedArray.getDrawable( + R.styleable.Window_windowSplashScreenBrandingImage), null); + attrs.mIconBgColor = safeReturnAttrDefault((def) -> typedArray.getColor( + R.styleable.Window_windowSplashScreenIconBackgroundColor, def), + Color.TRANSPARENT); typedArray.recycle(); if (DEBUG) { Slog.d(TAG, "window attributes color: " @@ -476,9 +488,14 @@ public class SplashscreenContentDrawer { drawable = layerDrawable.getDrawable(0); } } - mColorChecker = drawable instanceof ColorDrawable - ? new SingleColorTester((ColorDrawable) drawable) - : new ComplexDrawableTester(drawable, filterTransparent); + if (drawable == null) { + mColorChecker = new SingleColorTester( + (ColorDrawable) createDefaultBackgroundDrawable()); + } else { + mColorChecker = drawable instanceof ColorDrawable + ? new SingleColorTester((ColorDrawable) drawable) + : new ComplexDrawableTester(drawable, filterTransparent); + } } public float nonTransparentRatio() {