Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 661a5f0b authored by wilsonshih's avatar wilsonshih
Browse files

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
parent 6c9c6cb6
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -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> T safeReturnAttrDefault(UnaryOperator<T> 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,10 +488,15 @@ public class SplashscreenContentDrawer {
                    drawable = layerDrawable.getDrawable(0);
                }
            }
            if (drawable == null) {
                mColorChecker = new SingleColorTester(
                        (ColorDrawable) createDefaultBackgroundDrawable());
            } else {
                mColorChecker = drawable instanceof ColorDrawable
                        ? new SingleColorTester((ColorDrawable) drawable)
                        : new ComplexDrawableTester(drawable, filterTransparent);
            }
        }

        public float nonTransparentRatio() {
            return mColorChecker.nonTransparentRatio();