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

Commit a54290f3 authored by Riddle Hsu's avatar Riddle Hsu Committed by Android (Google) Code Review
Browse files

Merge "Load icon of splash screen only once" into sc-dev

parents 22962c17 25954658
Loading
Loading
Loading
Loading
+17 −34
Original line number Diff line number Diff line
@@ -245,7 +245,7 @@ public class SplashscreenContentDrawer {
        private SplashScreenView mCachedResult;
        private int mThemeColor;
        private Drawable mFinalIconDrawable;
        private float mScale = 1f;
        private int mFinalIconSize = mIconSize;

        StartingWindowViewBuilder setWindowBGColor(@ColorInt int background) {
            mThemeColor = background;
@@ -282,48 +282,46 @@ public class SplashscreenContentDrawer {

            Drawable iconDrawable;
            final int animationDuration;
            final int iconSize;
            if (mEmptyView) {
                // empty splash screen case
                animationDuration = 0;
                iconSize = 0;
                mFinalIconSize = 0;
            } else if (mTmpAttrs.mReplaceIcon != null) {
                // replaced icon, don't process
                iconDrawable = mTmpAttrs.mReplaceIcon;
                animationDuration = mTmpAttrs.mAnimationDuration;
                createIconDrawable(iconDrawable, mIconSize);
                iconSize = mIconSize;
                createIconDrawable(iconDrawable);
            } else {
                final float iconScale = (float) mIconSize / (float) mDefaultIconSize;
                iconDrawable = mIconProvider.getIcon(mActivityInfo);
                final int densityDpi = mContext.getResources().getDisplayMetrics().densityDpi;
                final int scaledIconDpi = (int) (0.5f + iconScale * densityDpi);
                iconDrawable = mIconProvider.getIcon(mActivityInfo, scaledIconDpi);
                if (iconDrawable == null) {
                    iconDrawable = mContext.getPackageManager().getDefaultActivityIcon();
                }
                if (!processAdaptiveIcon(iconDrawable, iconScale)) {
                if (!processAdaptiveIcon(iconDrawable)) {
                    if (DEBUG) {
                        Slog.d(TAG, "The icon is not an AdaptiveIconDrawable");
                    }
                    // TODO process legacy icon(bitmap)
                    final Drawable tempIcon = loadIconByDensity(iconDrawable, iconScale);
                    createIconDrawable(tempIcon, mIconSize);
                    createIconDrawable(iconDrawable);
                }
                animationDuration = 0;
                iconSize = (int) (0.5 + mIconSize * mScale);
            }

            mCachedResult = fillViewWithIcon(iconSize, mFinalIconDrawable, animationDuration);
            mCachedResult = fillViewWithIcon(mFinalIconSize, mFinalIconDrawable, animationDuration);
            mBuildComplete = true;
            return mCachedResult;
        }

        private void createIconDrawable(Drawable iconDrawable, int iconSize) {
        private void createIconDrawable(Drawable iconDrawable) {
            mFinalIconDrawable = SplashscreenIconDrawableFactory.makeIconDrawable(
                    mTmpAttrs.mIconBgColor != Color.TRANSPARENT
                            ? mTmpAttrs.mIconBgColor : mThemeColor,
                    iconDrawable, iconSize, mSplashscreenWorkerHandler);
                    iconDrawable, mFinalIconSize, mSplashscreenWorkerHandler);
        }

        private boolean processAdaptiveIcon(Drawable iconDrawable, float iconScale) {
        private boolean processAdaptiveIcon(Drawable iconDrawable) {
            if (!(iconDrawable instanceof AdaptiveIconDrawable)) {
                return false;
            }
@@ -334,7 +332,7 @@ public class SplashscreenContentDrawer {
            final DrawableColorTester backIconTester =
                    new DrawableColorTester(adaptiveIconDrawable.getBackground());

            Drawable iconForeground = adaptiveIconDrawable.getForeground();
            final Drawable iconForeground = adaptiveIconDrawable.getForeground();
            final DrawableColorTester foreIconTester =
                    new DrawableColorTester(iconForeground, true /* filterTransparent */);

@@ -373,35 +371,20 @@ public class SplashscreenContentDrawer {
                final float noBgScale =
                        foreIconTester.nonTransparentRatio() < ENLARGE_FOREGROUND_ICON_THRESHOLD
                                ? NO_BACKGROUND_SCALE : 1f;
                final Drawable tempIcon = loadIconByDensity(iconDrawable, iconScale * noBgScale);
                if (tempIcon instanceof AdaptiveIconDrawable) {
                    mScale = noBgScale;
                    iconForeground = ((AdaptiveIconDrawable) tempIcon).getForeground();
                }
                // Using AdaptiveIconDrawable here can help keep the shape consistent with the
                // current settings.
                final int iconSize = (int) (0.5f + mIconSize * mScale);
                createIconDrawable(iconForeground, iconSize);
                mFinalIconSize = (int) (0.5f + mIconSize * noBgScale);
                createIconDrawable(iconForeground);
            } else {
                if (DEBUG) {
                    Slog.d(TAG, "makeSplashScreenContentView: draw whole icon");
                }
                final Drawable tempIcon = loadIconByDensity(iconDrawable, iconScale);
                createIconDrawable(tempIcon, mIconSize);
                createIconDrawable(iconDrawable);
            }
            Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
            return true;
        }

        private Drawable loadIconByDensity(Drawable baseDrawable, float scale) {
            if (scale == 1 && baseDrawable != null) {
                return baseDrawable;
            }
            final int densityDpi = mContext.getResources().getDisplayMetrics().densityDpi;
            final int updateDpi = (int) (0.5f + scale * densityDpi);
            return  mIconProvider.getIcon(mActivityInfo, updateDpi);
        }

        private SplashScreenView fillViewWithIcon(int iconSize, Drawable iconDrawable,
                int animationDuration) {
            Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");