diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml
index a138fee325506..e8757b5d96f45 100644
--- a/libs/WindowManager/Shell/res/values/config.xml
+++ b/libs/WindowManager/Shell/res/values/config.xml
@@ -52,9 +52,6 @@
when the PIP menu is shown in center. -->
"596 280 1324 690"
-
- 1000
-
166
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 3ced8d3ec6e73..ef731235a3c42 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -178,7 +178,9 @@
72dp
- 108dp
+ 160dp
+
+ 108dp
48dp
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 ccf062ea3e9d5..1d3a60b8193de 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
@@ -18,7 +18,6 @@ package com.android.wm.shell.startingsurface;
import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
-import static android.os.UserHandle.getUserHandleForUid;
import android.annotation.ColorInt;
import android.annotation.NonNull;
@@ -68,11 +67,12 @@ public class SplashscreenContentDrawer {
// For example, an icon with the foreground 108*108 opaque pixels and it's background
// also 108*108 pixels, then do not enlarge this icon if only need to show foreground icon.
private static final float ENLARGE_FOREGROUND_ICON_THRESHOLD = (72f * 72f) / (108f * 108f);
+ private static final float NO_BACKGROUND_SCALE = 1.3f;
private final Context mContext;
private final IconProvider mIconProvider;
- private final int mMaxAnimatableIconDuration;
private int mIconSize;
+ private int mDefaultIconSize;
private int mBrandingImageWidth;
private int mBrandingImageHeight;
private final int mAppRevealDuration;
@@ -84,11 +84,10 @@ public class SplashscreenContentDrawer {
private final SplashScreenWindowAttrs mTmpAttrs = new SplashScreenWindowAttrs();
private final Handler mSplashscreenWorkerHandler;
- SplashscreenContentDrawer(Context context, int maxAnimatableIconDuration,
- int iconExitAnimDuration, int appRevealAnimDuration, TransactionPool pool) {
+ SplashscreenContentDrawer(Context context, int iconExitAnimDuration, int appRevealAnimDuration,
+ TransactionPool pool) {
mContext = context;
mIconProvider = new IconProvider(context);
- mMaxAnimatableIconDuration = maxAnimatableIconDuration;
mAppRevealDuration = appRevealAnimDuration;
mIconExitDuration = iconExitAnimDuration;
mTransactionPool = pool;
@@ -122,11 +121,7 @@ public class SplashscreenContentDrawer {
context, splashScreenResId);
if (contentView == null) {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "makeSplashScreenContentView");
- if (emptyView) {
- contentView = makeEmptySplashScreenContentView(context);
- } else {
- contentView = makeSplashScreenContentView(context, info);
- }
+ contentView = makeSplashScreenContentView(context, info, emptyView);
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}
} catch (RuntimeException e) {
@@ -141,6 +136,8 @@ public class SplashscreenContentDrawer {
private void updateDensity() {
mIconSize = mContext.getResources().getDimensionPixelSize(
com.android.wm.shell.R.dimen.starting_surface_icon_size);
+ mDefaultIconSize = mContext.getResources().getDimensionPixelSize(
+ com.android.wm.shell.R.dimen.default_icon_size);
mBrandingImageWidth = mContext.getResources().getDimensionPixelSize(
com.android.wm.shell.R.dimen.starting_surface_brand_image_width);
mBrandingImageHeight = mContext.getResources().getDimensionPixelSize(
@@ -195,46 +192,20 @@ public class SplashscreenContentDrawer {
}
}
- private SplashScreenView makeEmptySplashScreenContentView(Context context) {
- getWindowAttrs(context, mTmpAttrs);
- final StartingWindowViewBuilder builder = new StartingWindowViewBuilder();
- final int themeBGColor = peekWindowBGColor(context);
- final SplashScreenView view = builder
- .setContext(context)
- .setWindowBGColor(themeBGColor)
- .build();
- view.setNotCopyable();
- return view;
- }
-
- private SplashScreenView makeSplashScreenContentView(Context context, ActivityInfo ai) {
+ private SplashScreenView makeSplashScreenContentView(Context context, ActivityInfo ai,
+ boolean emptyView) {
updateDensity();
getWindowAttrs(context, mTmpAttrs);
final StartingWindowViewBuilder builder = new StartingWindowViewBuilder();
- final int animationDuration;
- Drawable iconDrawable;
- if (mTmpAttrs.mReplaceIcon != null) {
- iconDrawable = mTmpAttrs.mReplaceIcon;
- animationDuration = Math.max(0,
- Math.min(mTmpAttrs.mAnimationDuration, mMaxAnimatableIconDuration));
- } else {
- iconDrawable = mIconProvider.getIconForUI(
- ai, getUserHandleForUid(ai.applicationInfo.uid));
- if (iconDrawable == null) {
- iconDrawable = context.getPackageManager().getDefaultActivityIcon();
- }
- animationDuration = 0;
- }
final int themeBGColor = peekWindowBGColor(context);
// TODO (b/173975965) Tracking the performance on improved splash screen.
return builder
.setContext(context)
.setWindowBGColor(themeBGColor)
- .setIconDrawable(iconDrawable)
- .setIconAnimationDuration(animationDuration)
- .setBrandingDrawable(mTmpAttrs.mBrandingImage)
- .setIconBackground(mTmpAttrs.mIconBgColor).build();
+ .makeEmptyView(emptyView)
+ .setActivityInfo(ai)
+ .build();
}
private static void getWindowAttrs(Context context, SplashScreenWindowAttrs attrs) {
@@ -270,11 +241,9 @@ public class SplashscreenContentDrawer {
}
private class StartingWindowViewBuilder {
- private Drawable mIconDrawable;
- private int mIconAnimationDuration;
+ private ActivityInfo mActivityInfo;
private Context mContext;
- private Drawable mBrandingDrawable;
- private @ColorInt int mIconBackground;
+ private boolean mEmptyView;
// result
private boolean mBuildComplete = false;
@@ -289,26 +258,14 @@ public class SplashscreenContentDrawer {
return this;
}
- StartingWindowViewBuilder setIconDrawable(Drawable iconDrawable) {
- mIconDrawable = iconDrawable;
+ StartingWindowViewBuilder makeEmptyView(boolean empty) {
+ mEmptyView = empty;
mBuildComplete = false;
return this;
}
- StartingWindowViewBuilder setIconAnimationDuration(int iconAnimationDuration) {
- mIconAnimationDuration = iconAnimationDuration;
- mBuildComplete = false;
- return this;
- }
-
- StartingWindowViewBuilder setBrandingDrawable(Drawable branding) {
- mBrandingDrawable = branding;
- mBuildComplete = false;
- return this;
- }
-
- StartingWindowViewBuilder setIconBackground(int color) {
- mIconBackground = color;
+ StartingWindowViewBuilder setActivityInfo(ActivityInfo ai) {
+ mActivityInfo = ai;
mBuildComplete = false;
return this;
}
@@ -323,40 +280,66 @@ public class SplashscreenContentDrawer {
if (mBuildComplete) {
return mCachedResult;
}
- if (mContext == null) {
+ if (mContext == null || mActivityInfo == null) {
Slog.e(TAG, "Unable to create StartingWindowView, lack of materials!");
return null;
}
- if (!processAdaptiveIcon() && mIconDrawable != null) {
- if (DEBUG) {
- Slog.d(TAG, "The icon is not an AdaptiveIconDrawable");
+ Drawable iconDrawable;
+ final int animationDuration;
+ final int iconSize;
+ if (mEmptyView) {
+ // empty splash screen case
+ animationDuration = 0;
+ iconSize = 0;
+ } else if (mTmpAttrs.mReplaceIcon != null) {
+ // replaced icon, don't process
+ iconDrawable = mTmpAttrs.mReplaceIcon;
+ animationDuration = mTmpAttrs.mAnimationDuration;
+ createIconDrawable(iconDrawable, mIconSize);
+ iconSize = mIconSize;
+ } else {
+ final float iconScale = (float) mIconSize / (float) mDefaultIconSize;
+ iconDrawable = mIconProvider.getIcon(mActivityInfo);
+ if (iconDrawable == null) {
+ iconDrawable = mContext.getPackageManager().getDefaultActivityIcon();
}
- createIconDrawable(mIconDrawable, mIconSize);
+ if (!processAdaptiveIcon(iconDrawable, iconScale)) {
+ 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);
+ }
+ animationDuration = 0;
+ iconSize = (int) (0.5 + mIconSize * mScale);
}
- final int iconSize = mFinalIconDrawable != null ? (int) (mIconSize * mScale) : 0;
- mCachedResult = fillViewWithIcon(mContext, iconSize, mFinalIconDrawable);
+
+ mCachedResult = fillViewWithIcon(iconSize, mFinalIconDrawable, animationDuration);
mBuildComplete = true;
return mCachedResult;
}
private void createIconDrawable(Drawable iconDrawable, int iconSize) {
mFinalIconDrawable = SplashscreenIconDrawableFactory.makeIconDrawable(
- mIconBackground != Color.TRANSPARENT ? mIconBackground : mThemeColor,
+ mTmpAttrs.mIconBgColor != Color.TRANSPARENT
+ ? mTmpAttrs.mIconBgColor : mThemeColor,
iconDrawable, iconSize, mSplashscreenWorkerHandler);
}
- private boolean processAdaptiveIcon() {
- if (!(mIconDrawable instanceof AdaptiveIconDrawable)) {
+ private boolean processAdaptiveIcon(Drawable iconDrawable, float iconScale) {
+ if (!(iconDrawable instanceof AdaptiveIconDrawable)) {
return false;
}
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "processAdaptiveIcon");
- final AdaptiveIconDrawable adaptiveIconDrawable = (AdaptiveIconDrawable) mIconDrawable;
+ final AdaptiveIconDrawable adaptiveIconDrawable =
+ (AdaptiveIconDrawable) iconDrawable;
final DrawableColorTester backIconTester =
new DrawableColorTester(adaptiveIconDrawable.getBackground());
- final Drawable iconForeground = adaptiveIconDrawable.getForeground();
+ Drawable iconForeground = adaptiveIconDrawable.getForeground();
final DrawableColorTester foreIconTester =
new DrawableColorTester(iconForeground, true /* filterTransparent */);
@@ -382,7 +365,9 @@ public class SplashscreenContentDrawer {
// B. The background of the adaptive icon is similar to the theme color, or
// C. The background of the adaptive icon is grayscale, and the foreground of the
// adaptive icon forms a certain contrast with the theme color.
- if (!backComplex && (isRgbSimilarInHsv(mThemeColor, backMainColor)
+ // D. Didn't specify icon background color.
+ if (!backComplex && mTmpAttrs.mIconBgColor == Color.TRANSPARENT
+ && (isRgbSimilarInHsv(mThemeColor, backMainColor)
|| (backIconTester.isGrayscale()
&& !isRgbSimilarInHsv(mThemeColor, foreMainColor)))) {
if (DEBUG) {
@@ -390,8 +375,13 @@ public class SplashscreenContentDrawer {
}
// Reference AdaptiveIcon description, outer is 108 and inner is 72, so we
// should enlarge the size 108/72 if we only draw adaptiveIcon's foreground.
- if (foreIconTester.nonTransparentRatio() < ENLARGE_FOREGROUND_ICON_THRESHOLD) {
- mScale = 1.5f;
+ 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.
@@ -401,30 +391,44 @@ public class SplashscreenContentDrawer {
if (DEBUG) {
Slog.d(TAG, "makeSplashScreenContentView: draw whole icon");
}
- createIconDrawable(adaptiveIconDrawable, mIconSize);
+ final Drawable tempIcon = loadIconByDensity(iconDrawable, iconScale);
+ createIconDrawable(tempIcon, mIconSize);
}
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
return true;
}
- private SplashScreenView fillViewWithIcon(Context context,
- int iconSize, Drawable iconDrawable) {
- Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "fillViewWithIcon");
- final SplashScreenView.Builder builder = new SplashScreenView.Builder(context);
- builder.setIconSize(iconSize).setBackgroundColor(mThemeColor)
- .setIconBackground(mIconBackground);
- if (iconDrawable != null) {
- builder.setCenterViewDrawable(iconDrawable);
+ private Drawable loadIconByDensity(Drawable baseDrawable, float scale) {
+ if (scale == 1 && baseDrawable != null) {
+ return baseDrawable;
}
- builder.setAnimationDurationMillis(mIconAnimationDuration);
- if (mBrandingDrawable != null) {
- builder.setBrandingDrawable(mBrandingDrawable, mBrandingImageWidth,
+ 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");
+ final SplashScreenView.Builder builder = new SplashScreenView.Builder(mContext);
+ builder.setBackgroundColor(mThemeColor);
+ if (iconDrawable != null) {
+ builder.setIconSize(iconSize)
+ .setIconBackground(mTmpAttrs.mIconBgColor)
+ .setCenterViewDrawable(iconDrawable)
+ .setAnimationDurationMillis(animationDuration);
+ }
+ if (mTmpAttrs.mBrandingImage != null) {
+ builder.setBrandingDrawable(mTmpAttrs.mBrandingImage, mBrandingImageWidth,
mBrandingImageHeight);
}
final SplashScreenView splashScreenView = builder.build();
if (DEBUG) {
Slog.d(TAG, "fillViewWithIcon surfaceWindowView " + splashScreenView);
}
+ if (mEmptyView) {
+ splashScreenView.setNotCopyable();
+ }
splashScreenView.makeSystemUIColorsTransparent();
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
return splashScreenView;
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 85845d0d9c891..6cbba9f135865 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
@@ -59,6 +59,7 @@ public class SplashscreenIconDrawableFactory {
return new ImmobileIconDrawable((AdaptiveIconDrawable) foregroundDrawable, iconSize,
splashscreenWorkerHandler);
} else {
+ // TODO for legacy icon don't use adaptive icon drawable to wrapper it
return new ImmobileIconDrawable(new AdaptiveIconDrawable(
new ColorDrawable(backgroundColor), foregroundDrawable), iconSize,
splashscreenWorkerHandler);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
index e4b28696bc4f0..6d3eeae43a968 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
@@ -114,14 +114,12 @@ public class StartingSurfaceDrawer {
mContext = context;
mDisplayManager = mContext.getSystemService(DisplayManager.class);
mSplashScreenExecutor = splashScreenExecutor;
- final int maxAnimatableIconDuration = context.getResources().getInteger(
- com.android.wm.shell.R.integer.max_starting_window_intro_icon_anim_duration);
final int iconExitAnimDuration = context.getResources().getInteger(
com.android.wm.shell.R.integer.starting_window_icon_exit_anim_duration);
final int appRevealAnimDuration = context.getResources().getInteger(
com.android.wm.shell.R.integer.starting_window_app_reveal_anim_duration);
- mSplashscreenContentDrawer = new SplashscreenContentDrawer(mContext,
- maxAnimatableIconDuration, iconExitAnimDuration, appRevealAnimDuration, pool);
+ mSplashscreenContentDrawer = new SplashscreenContentDrawer(mContext, iconExitAnimDuration,
+ appRevealAnimDuration, pool);
mSplashScreenExecutor.execute(() -> mChoreographer = Choreographer.getInstance());
}