summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Caen <caen@google.com>2021-07-27 10:05:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-07-27 10:05:17 +0000
commitee08a68fd49c8ff69866d907699b8ff12c6991fd (patch)
tree62290a4cd1c3ee0c9f6a95a322577281262505ae
parent28e4c5d57aa2302e34b9a63d0dd7dff904d1c78d (diff)
parent496b4cbb86dc18a1b3a3b43aa2ceb697c3635b76 (diff)
Merge "Do not draw icon background if it shouldn't be seen" into sc-dev
-rw-r--r--core/api/test-current.txt1
-rw-r--r--core/java/android/window/SplashScreenView.java83
-rw-r--r--core/res/res/layout/splash_screen_view.xml3
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java41
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java160
5 files changed, 173 insertions, 115 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index a0799394177d..ea6d0cecfd73 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -3176,7 +3176,6 @@ package android.window {
public final class SplashScreenView extends android.widget.FrameLayout {
method @Nullable public android.view.View getBrandingView();
- method @ColorInt public int getIconBackgroundColor();
}
public final class StartingWindowInfo implements android.os.Parcelable {
diff --git a/core/java/android/window/SplashScreenView.java b/core/java/android/window/SplashScreenView.java
index 1efd2e381289..acf20d701eeb 100644
--- a/core/java/android/window/SplashScreenView.java
+++ b/core/java/android/window/SplashScreenView.java
@@ -89,11 +89,11 @@ public final class SplashScreenView extends FrameLayout {
private boolean mNotCopyable;
private boolean mIsCopied;
private int mInitBackgroundColor;
- private int mInitIconBackgroundColor;
private View mIconView;
private Bitmap mParceledIconBitmap;
private View mBrandingImageView;
private Bitmap mParceledBrandingBitmap;
+ private Bitmap mParceledIconBackgroundBitmap;
private Duration mIconAnimationDuration;
private Instant mIconAnimationStart;
@@ -130,11 +130,12 @@ public final class SplashScreenView extends FrameLayout {
private final Context mContext;
private int mIconSize;
private @ColorInt int mBackgroundColor;
- private @ColorInt int mIconBackground;
private Bitmap mParceledIconBitmap;
+ private Bitmap mParceledIconBackgroundBitmap;
private Drawable mIconDrawable;
// It is only set for legacy splash screen which won't be sent across processes.
private Drawable mOverlayDrawable;
+ private Drawable mIconBackground;
private SurfaceControlViewHost.SurfacePackage mSurfacePackage;
private RemoteCallback mClientCallback;
private int mBrandingImageWidth;
@@ -155,7 +156,6 @@ public final class SplashScreenView extends FrameLayout {
public Builder createFromParcel(SplashScreenViewParcelable parcelable) {
mIconSize = parcelable.getIconSize();
mBackgroundColor = parcelable.getBackgroundColor();
- mIconBackground = parcelable.getIconBackground();
mSurfacePackage = parcelable.mSurfacePackage;
if (mSurfacePackage == null && parcelable.mIconBitmap != null) {
// We only create a Bitmap copies of immobile icons since animated icon are using
@@ -163,6 +163,11 @@ public final class SplashScreenView extends FrameLayout {
mIconDrawable = new BitmapDrawable(mContext.getResources(), parcelable.mIconBitmap);
mParceledIconBitmap = parcelable.mIconBitmap;
}
+ if (parcelable.mIconBackground != null) {
+ mIconBackground = new BitmapDrawable(mContext.getResources(),
+ parcelable.mIconBackground);
+ mParceledIconBackgroundBitmap = parcelable.mIconBackground;
+ }
if (parcelable.mBrandingBitmap != null) {
setBrandingDrawable(new BitmapDrawable(mContext.getResources(),
parcelable.mBrandingBitmap), parcelable.mBrandingWidth,
@@ -213,8 +218,8 @@ public final class SplashScreenView extends FrameLayout {
/**
* Set the background color for the icon.
*/
- public Builder setIconBackground(int color) {
- mIconBackground = color;
+ public Builder setIconBackground(Drawable iconBackground) {
+ mIconBackground = iconBackground;
return this;
}
@@ -245,7 +250,6 @@ public final class SplashScreenView extends FrameLayout {
final SplashScreenView view = (SplashScreenView)
layoutInflater.inflate(R.layout.splash_screen_view, null, false);
view.mInitBackgroundColor = mBackgroundColor;
- view.mInitIconBackgroundColor = mIconBackground;
if (mOverlayDrawable != null) {
view.setBackground(mOverlayDrawable);
} else {
@@ -263,25 +267,29 @@ public final class SplashScreenView extends FrameLayout {
mIconAnimationDuration != null ? mIconAnimationDuration.toMillis() : 0);
view.mIconAnimationStart = mIconAnimationStart;
view.mIconAnimationDuration = mIconAnimationDuration;
- } else {
- view.mIconView = view.findViewById(R.id.splashscreen_icon_view);
- if (mIconSize != 0) {
- final ViewGroup.LayoutParams params = view.mIconView.getLayoutParams();
- params.width = mIconSize;
- params.height = mIconSize;
- view.mIconView.setLayoutParams(params);
- if (mIconDrawable != null) {
- view.mIconView.setBackground(mIconDrawable);
- }
+ } else if (mIconSize != 0) {
+ ImageView imageView = view.findViewById(R.id.splashscreen_icon_view);
+ assert imageView != null;
+
+ final ViewGroup.LayoutParams params = imageView.getLayoutParams();
+ params.width = mIconSize;
+ params.height = mIconSize;
+ imageView.setLayoutParams(params);
+ if (mIconDrawable != null) {
+ imageView.setImageDrawable(mIconDrawable);
}
+ if (mIconBackground != null) {
+ imageView.setBackground(mIconBackground);
+ }
+ view.mIconView = imageView;
}
if (mOverlayDrawable != null || mIconDrawable == null) {
view.setNotCopyable();
}
- if (mParceledIconBitmap != null) {
- view.mParceledIconBitmap = mParceledIconBitmap;
- }
+ view.mParceledIconBackgroundBitmap = mParceledIconBackgroundBitmap;
+ view.mParceledIconBitmap = mParceledIconBitmap;
+
// branding image
if (mBrandingImageHeight > 0 && mBrandingImageWidth > 0 && mBrandingDrawable != null) {
final ViewGroup.LayoutParams params = view.mBrandingImageView.getLayoutParams();
@@ -310,6 +318,7 @@ public final class SplashScreenView extends FrameLayout {
private SurfaceView createSurfaceView(@NonNull SplashScreenView view) {
final SurfaceView surfaceView = new SurfaceView(view.getContext());
surfaceView.setPadding(0, 0, 0, 0);
+ surfaceView.setBackground(mIconBackground);
if (mSurfacePackage == null) {
if (DEBUG) {
Log.d(TAG,
@@ -475,7 +484,11 @@ public final class SplashScreenView extends FrameLayout {
}
setVisibility(GONE);
if (mParceledIconBitmap != null) {
- mIconView.setBackground(null);
+ if (mIconView instanceof ImageView) {
+ ((ImageView) mIconView).setImageDrawable(null);
+ } else if (mIconView != null) {
+ mIconView.setBackground(null);
+ }
mParceledIconBitmap.recycle();
mParceledIconBitmap = null;
}
@@ -484,6 +497,13 @@ public final class SplashScreenView extends FrameLayout {
mParceledBrandingBitmap.recycle();
mParceledBrandingBitmap = null;
}
+ if (mParceledIconBackgroundBitmap != null) {
+ if (mIconView != null) {
+ mIconView.setBackground(null);
+ }
+ mParceledIconBackgroundBitmap.recycle();
+ mParceledIconBackgroundBitmap = null;
+ }
if (mWindow != null) {
final DecorView decorView = (DecorView) mWindow.peekDecorView();
if (DEBUG) {
@@ -600,15 +620,6 @@ public final class SplashScreenView extends FrameLayout {
}
/**
- * Get the icon background color
- * @hide
- */
- @TestApi
- public @ColorInt int getIconBackgroundColor() {
- return mInitIconBackgroundColor;
- }
-
- /**
* Get the initial background color of this view.
* @hide
*/
@@ -637,7 +648,7 @@ public final class SplashScreenView extends FrameLayout {
public static class SplashScreenViewParcelable implements Parcelable {
private int mIconSize;
private int mBackgroundColor;
- private int mIconBackground;
+ private Bitmap mIconBackground;
private Bitmap mIconBitmap = null;
private int mBrandingWidth;
@@ -653,11 +664,11 @@ public final class SplashScreenView extends FrameLayout {
public SplashScreenViewParcelable(SplashScreenView view) {
mIconSize = view.mIconView.getWidth();
mBackgroundColor = view.getInitBackgroundColor();
- mIconBackground = view.getIconBackgroundColor();
+ mIconBackground = copyDrawable(view.getIconView().getBackground());
mSurfacePackage = view.mSurfacePackageCopy;
if (mSurfacePackage == null) {
// We only need to copy the drawable if we are not using a SurfaceView
- mIconBitmap = copyDrawable(view.getIconView().getBackground());
+ mIconBitmap = copyDrawable(((ImageView) view.getIconView()).getDrawable());
}
mBrandingBitmap = copyDrawable(view.getBrandingView().getBackground());
@@ -703,7 +714,7 @@ public final class SplashScreenView extends FrameLayout {
mBrandingBitmap = source.readTypedObject(Bitmap.CREATOR);
mIconAnimationStartMillis = source.readLong();
mIconAnimationDurationMillis = source.readLong();
- mIconBackground = source.readInt();
+ mIconBackground = source.readTypedObject(Bitmap.CREATOR);
mSurfacePackage = source.readTypedObject(SurfaceControlViewHost.SurfacePackage.CREATOR);
mClientCallback = source.readTypedObject(RemoteCallback.CREATOR);
}
@@ -723,7 +734,7 @@ public final class SplashScreenView extends FrameLayout {
dest.writeTypedObject(mBrandingBitmap, flags);
dest.writeLong(mIconAnimationStartMillis);
dest.writeLong(mIconAnimationDurationMillis);
- dest.writeInt(mIconBackground);
+ dest.writeTypedObject(mIconBackground, flags);
dest.writeTypedObject(mSurfacePackage, flags);
dest.writeTypedObject(mClientCallback, flags);
}
@@ -760,10 +771,6 @@ public final class SplashScreenView extends FrameLayout {
return mBackgroundColor;
}
- int getIconBackground() {
- return mIconBackground;
- }
-
/**
* Sets the {@link RemoteCallback} that will be called by the client to notify the shell
* of the removal of the {@link SplashScreenView}.
diff --git a/core/res/res/layout/splash_screen_view.xml b/core/res/res/layout/splash_screen_view.xml
index 0b7b49cdea83..aa050f3a364d 100644
--- a/core/res/res/layout/splash_screen_view.xml
+++ b/core/res/res/layout/splash_screen_view.xml
@@ -21,12 +21,11 @@
android:padding="0dp"
android:orientation="vertical">
- <View android:id="@+id/splashscreen_icon_view"
+ <ImageView android:id="@+id/splashscreen_icon_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:padding="0dp"
- android:background="@null"
android:contentDescription="@string/splash_screen_view_icon_description"/>
<View android:id="@+id/splashscreen_branding_view"
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 dff5577f5f20..29326ec90e31 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
@@ -25,6 +25,7 @@ import static android.window.StartingWindowInfo.STARTING_WINDOW_TYPE_SPLASH_SCRE
import android.annotation.ColorInt;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.ActivityThread;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -315,7 +316,7 @@ public class SplashscreenContentDrawer {
private Drawable mOverlayDrawable;
private int mSuggestType;
private int mThemeColor;
- private Drawable mFinalIconDrawable;
+ private Drawable[] mFinalIconDrawables;
private int mFinalIconSize = mIconSize;
StartingWindowViewBuilder(@NonNull Context context, @NonNull ActivityInfo aInfo) {
@@ -347,12 +348,13 @@ public class SplashscreenContentDrawer {
animationDuration = 0;
mFinalIconSize = 0;
} else if (mTmpAttrs.mSplashScreenIcon != null) {
- // replaced icon, don't process
+ // Using the windowSplashScreenAnimatedIcon attribute
iconDrawable = mTmpAttrs.mSplashScreenIcon;
animationDuration = mTmpAttrs.mAnimationDuration;
// There is no background below the icon, so scale the icon up
- if (mTmpAttrs.mIconBgColor == Color.TRANSPARENT) {
+ if (mTmpAttrs.mIconBgColor == Color.TRANSPARENT
+ || mTmpAttrs.mIconBgColor == mThemeColor) {
mFinalIconSize *= NO_BACKGROUND_SCALE;
}
createIconDrawable(iconDrawable, false);
@@ -383,7 +385,7 @@ public class SplashscreenContentDrawer {
animationDuration = 0;
}
- return fillViewWithIcon(mFinalIconSize, mFinalIconDrawable, animationDuration);
+ return fillViewWithIcon(mFinalIconSize, mFinalIconDrawables, animationDuration);
}
private class ShapeIconFactory extends BaseIconFactory {
@@ -394,12 +396,11 @@ public class SplashscreenContentDrawer {
private void createIconDrawable(Drawable iconDrawable, boolean legacy) {
if (legacy) {
- mFinalIconDrawable = SplashscreenIconDrawableFactory.makeLegacyIconDrawable(
+ mFinalIconDrawables = SplashscreenIconDrawableFactory.makeLegacyIconDrawable(
iconDrawable, mDefaultIconSize, mFinalIconSize, mSplashscreenWorkerHandler);
} else {
- mFinalIconDrawable = SplashscreenIconDrawableFactory.makeIconDrawable(
- mTmpAttrs.mIconBgColor != Color.TRANSPARENT
- ? mTmpAttrs.mIconBgColor : mThemeColor,
+ mFinalIconDrawables = SplashscreenIconDrawableFactory.makeIconDrawable(
+ mTmpAttrs.mIconBgColor, mThemeColor,
iconDrawable, mDefaultIconSize, mFinalIconSize, mSplashscreenWorkerHandler);
}
}
@@ -461,18 +462,24 @@ public class SplashscreenContentDrawer {
return true;
}
- private SplashScreenView fillViewWithIcon(int iconSize, Drawable iconDrawable,
+ private SplashScreenView fillViewWithIcon(int iconSize, @Nullable Drawable[] iconDrawable,
int animationDuration) {
- Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
- final SplashScreenView.Builder builder = new SplashScreenView.Builder(mContext);
- builder.setBackgroundColor(mThemeColor);
- builder.setOverlayDrawable(mOverlayDrawable);
+ Drawable foreground = null;
+ Drawable background = null;
if (iconDrawable != null) {
- builder.setIconSize(iconSize)
- .setIconBackground(mTmpAttrs.mIconBgColor)
- .setCenterViewDrawable(iconDrawable)
- .setAnimationDurationMillis(animationDuration);
+ foreground = iconDrawable.length > 0 ? iconDrawable[0] : null;
+ background = iconDrawable.length > 1 ? iconDrawable[1] : null;
}
+
+ Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
+ final SplashScreenView.Builder builder = new SplashScreenView.Builder(mContext)
+ .setBackgroundColor(mThemeColor)
+ .setOverlayDrawable(mOverlayDrawable)
+ .setIconSize(iconSize)
+ .setIconBackground(background)
+ .setCenterViewDrawable(foreground)
+ .setAnimationDurationMillis(animationDuration);
+
if (mSuggestType == STARTING_WINDOW_TYPE_SPLASH_SCREEN
&& mTmpAttrs.mBrandingImage != null) {
builder.setBrandingDrawable(mTmpAttrs.mBrandingImage, mBrandingImageWidth,
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
index ba9123dca999..951b97e791c9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenIconDrawableFactory.java
@@ -22,9 +22,11 @@ import android.animation.Animator;
import android.animation.ValueAnimator;
import android.annotation.ColorInt;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
@@ -33,7 +35,6 @@ import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.Animatable;
-import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Trace;
@@ -44,32 +45,55 @@ import com.android.internal.R;
/**
* Creating a lightweight Drawable object used for splash screen.
+ *
* @hide
*/
public class SplashscreenIconDrawableFactory {
- static Drawable makeIconDrawable(@ColorInt int backgroundColor,
+ /**
+ * @return An array containing the foreground drawable at index 0 and if needed a background
+ * drawable at index 1.
+ */
+ static Drawable[] makeIconDrawable(@ColorInt int backgroundColor, @ColorInt int themeColor,
@NonNull Drawable foregroundDrawable, int srcIconSize, int iconSize,
Handler splashscreenWorkerHandler) {
+ Drawable foreground;
+ Drawable background = null;
+ boolean drawBackground =
+ backgroundColor != Color.TRANSPARENT && backgroundColor != themeColor;
+
if (foregroundDrawable instanceof Animatable) {
- return new AnimatableIconAnimateListener(backgroundColor, foregroundDrawable);
+ foreground = new AnimatableIconAnimateListener(foregroundDrawable);
} else if (foregroundDrawable instanceof AdaptiveIconDrawable) {
- return new ImmobileIconDrawable(foregroundDrawable,
+ // If the icon is Adaptive, we already use the icon background.
+ drawBackground = false;
+ foreground = new ImmobileIconDrawable(foregroundDrawable,
srcIconSize, iconSize, splashscreenWorkerHandler);
} else {
- // single layer icon
- return new ImmobileIconDrawable(new AdaptiveIconDrawable(
- new ColorDrawable(backgroundColor), foregroundDrawable),
+ // Adaptive icon don't handle transparency so we draw the background of the adaptive
+ // icon with the same color as the window background color instead of using two layers
+ foreground = new ImmobileIconDrawable(
+ new AdaptiveForegroundDrawable(foregroundDrawable),
srcIconSize, iconSize, splashscreenWorkerHandler);
}
+
+ if (drawBackground) {
+ background = new MaskBackgroundDrawable(backgroundColor);
+ }
+
+ return new Drawable[]{foreground, background};
}
- static Drawable makeLegacyIconDrawable(@NonNull Drawable iconDrawable, int srcIconSize,
+ static Drawable[] makeLegacyIconDrawable(@NonNull Drawable iconDrawable, int srcIconSize,
int iconSize, Handler splashscreenWorkerHandler) {
- return new ImmobileIconDrawable(iconDrawable, srcIconSize, iconSize,
- splashscreenWorkerHandler);
+ return new Drawable[]{new ImmobileIconDrawable(iconDrawable, srcIconSize, iconSize,
+ splashscreenWorkerHandler)};
}
+ /**
+ * Drawable pre-drawing the scaled icon in a separate thread to increase the speed of the
+ * final drawing.
+ */
private static class ImmobileIconDrawable extends Drawable {
private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG
| Paint.FILTER_BITMAP_FLAG);
@@ -121,8 +145,10 @@ public class SplashscreenIconDrawableFactory {
}
}
- // Base class the draw the circle background
- private abstract static class MaskBackgroundDrawable extends Drawable {
+ /**
+ * Base class the draw a background clipped by the system mask.
+ */
+ public static class MaskBackgroundDrawable extends Drawable {
private static final float MASK_SIZE = AdaptiveIconDrawable.MASK_SIZE;
private static final float EXTRA_INSET_PERCENTAGE = 1 / 4f;
static final float DEFAULT_VIEW_PORT_SCALE = 1f / (1 + 2 * EXTRA_INSET_PERCENTAGE);
@@ -132,17 +158,24 @@ public class SplashscreenIconDrawableFactory {
private static Path sMask;
private final Path mMaskScaleOnly;
private final Matrix mMaskMatrix;
- private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG
- | Paint.FILTER_BITMAP_FLAG);
- MaskBackgroundDrawable(@ColorInt int backgroundColor) {
+ @Nullable
+ private final Paint mBackgroundPaint;
+
+ public MaskBackgroundDrawable(@ColorInt int backgroundColor) {
final Resources r = Resources.getSystem();
sMask = PathParser.createPathFromPathData(r.getString(R.string.config_icon_mask));
Path mask = new Path(sMask);
mMaskScaleOnly = new Path(mask);
mMaskMatrix = new Matrix();
- mPaint.setColor(backgroundColor);
- mPaint.setStyle(Paint.Style.FILL);
+ if (backgroundColor != Color.TRANSPARENT) {
+ mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG
+ | Paint.FILTER_BITMAP_FLAG);
+ mBackgroundPaint.setColor(backgroundColor);
+ mBackgroundPaint.setStyle(Paint.Style.FILL);
+ } else {
+ mBackgroundPaint = null;
+ }
}
@Override
@@ -162,40 +195,80 @@ public class SplashscreenIconDrawableFactory {
@Override
public void draw(Canvas canvas) {
canvas.clipPath(mMaskScaleOnly);
- if (mMaskScaleOnly != null) {
- canvas.drawPath(mMaskScaleOnly, mPaint);
+ if (mBackgroundPaint != null) {
+ canvas.drawPath(mMaskScaleOnly, mBackgroundPaint);
}
}
@Override
public void setAlpha(int alpha) {
- mPaint.setAlpha(alpha);
+ if (mBackgroundPaint != null) {
+ mBackgroundPaint.setAlpha(alpha);
+ }
}
@Override
public int getOpacity() {
return PixelFormat.RGBA_8888;
}
+
+ @Override
+ public void setColorFilter(ColorFilter colorFilter) {
+ }
+ }
+
+ private static class AdaptiveForegroundDrawable extends MaskBackgroundDrawable {
+
+ @NonNull
+ protected final Drawable mForegroundDrawable;
+ private final Rect mTmpOutRect = new Rect();
+
+ AdaptiveForegroundDrawable(@NonNull Drawable foregroundDrawable) {
+ super(Color.TRANSPARENT);
+ mForegroundDrawable = foregroundDrawable;
+ }
+
+ @Override
+ protected void updateLayerBounds(Rect bounds) {
+ super.updateLayerBounds(bounds);
+ int cX = bounds.width() / 2;
+ int cY = bounds.height() / 2;
+
+ int insetWidth = (int) (bounds.width() / (DEFAULT_VIEW_PORT_SCALE * 2));
+ int insetHeight = (int) (bounds.height() / (DEFAULT_VIEW_PORT_SCALE * 2));
+ final Rect outRect = mTmpOutRect;
+ outRect.set(cX - insetWidth, cY - insetHeight, cX + insetWidth, cY + insetHeight);
+ if (mForegroundDrawable != null) {
+ mForegroundDrawable.setBounds(outRect);
+ }
+ invalidateSelf();
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ mForegroundDrawable.draw(canvas);
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter colorFilter) {
+ mForegroundDrawable.setColorFilter(colorFilter);
+ }
}
/**
* A lightweight AdaptiveIconDrawable which support foreground to be Animatable, and keep this
* drawable masked by config_icon_mask.
*/
- private static class AnimatableIconAnimateListener extends MaskBackgroundDrawable
+ private static class AnimatableIconAnimateListener extends AdaptiveForegroundDrawable
implements SplashScreenView.IconAnimateListener {
- private final Drawable mForegroundDrawable;
private Animatable mAnimatableIcon;
private Animator mIconAnimator;
private boolean mAnimationTriggered;
- private final Rect mTmpOutRect = new Rect();
- AnimatableIconAnimateListener(@ColorInt int backgroundColor, Drawable foregroundDrawable) {
- super(backgroundColor);
- mForegroundDrawable = foregroundDrawable;
- if (mForegroundDrawable != null) {
- mForegroundDrawable.setCallback(mCallback);
- }
+ AnimatableIconAnimateListener(@NonNull Drawable foregroundDrawable) {
+ super(foregroundDrawable);
+ mForegroundDrawable.setCallback(mCallback);
}
@Override
@@ -231,22 +304,6 @@ public class SplashscreenIconDrawableFactory {
return true;
}
- @Override
- protected void updateLayerBounds(Rect bounds) {
- super.updateLayerBounds(bounds);
- int cX = bounds.width() / 2;
- int cY = bounds.height() / 2;
-
- int insetWidth = (int) (bounds.width() / (DEFAULT_VIEW_PORT_SCALE * 2));
- int insetHeight = (int) (bounds.height() / (DEFAULT_VIEW_PORT_SCALE * 2));
- final Rect outRect = mTmpOutRect;
- outRect.set(cX - insetWidth, cY - insetHeight, cX + insetWidth, cY + insetHeight);
- if (mForegroundDrawable != null) {
- mForegroundDrawable.setBounds(outRect);
- }
- invalidateSelf();
- }
-
private final Callback mCallback = new Callback() {
@Override
public void invalidateDrawable(@NonNull Drawable who) {
@@ -276,19 +333,8 @@ public class SplashscreenIconDrawableFactory {
@Override
public void draw(Canvas canvas) {
+ ensureAnimationStarted();
super.draw(canvas);
- if (mForegroundDrawable != null) {
- ensureAnimationStarted();
- mForegroundDrawable.draw(canvas);
- }
- }
-
- @Override
- public void setColorFilter(ColorFilter colorFilter) {
- if (mForegroundDrawable != null) {
- mForegroundDrawable.setColorFilter(colorFilter);
- }
}
}
-
}