diff --git a/core/api/current.txt b/core/api/current.txt
index e1d7fd5839463..3b41a332511e8 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -1745,6 +1745,7 @@ package android {
field public static final int windowSplashScreenAnimatedIcon = 16844333; // 0x101062d
field public static final int windowSplashScreenAnimationDuration = 16844334; // 0x101062e
field public static final int windowSplashScreenBackground = 16844332; // 0x101062c
+ field public static final int windowSplashScreenBehavior;
field public static final int windowSplashScreenBrandingImage = 16844335; // 0x101062f
field public static final int windowSplashScreenIconBackgroundColor = 16844336; // 0x1010630
field @Deprecated public static final int windowSplashscreenContent = 16844132; // 0x1010564
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 8df5871577916..68ddbe61f4257 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2332,6 +2332,17 @@
contrast between the window background and the icon. Note the shape would also be
masking like an icon. -->
+
+
+
+
+
+
+
+
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index f05137e144d90..cc63fd6146a7d 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3275,6 +3275,7 @@
+
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index aca84a9b3c0c1..0527c6e58cfc8 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -811,6 +811,27 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// How long we wait until giving up transfer splash screen.
private static final int TRANSFER_SPLASH_SCREEN_TIMEOUT = 2000;
+ /**
+ * The icon is shown when the launching activity sets the splashScreenStyle to
+ * SPLASH_SCREEN_STYLE_ICON. If the launching activity does not specify any style,
+ * follow the system behavior.
+ *
+ * @see android.R.attr#windowSplashScreenBehavior
+ */
+ private static final int SPLASH_SCREEN_BEHAVIOR_DEFAULT = 0;
+ /**
+ * The icon is shown unless the launching app specified SPLASH_SCREEN_STYLE_EMPTY.
+ *
+ * @see android.R.attr#windowSplashScreenBehavior
+ */
+ private static final int SPLASH_SCREEN_BEHAVIOR_ICON_PREFERRED = 1;
+
+ @IntDef(prefix = {"SPLASH_SCREEN_BEHAVIOR_"}, value = {
+ SPLASH_SCREEN_BEHAVIOR_DEFAULT,
+ SPLASH_SCREEN_BEHAVIOR_ICON_PREFERRED
+ })
+ @interface SplashScreenBehavior { }
+
// TODO: Have a WindowContainer state for tracking exiting/deferred removal.
boolean mIsExiting;
// Force an app transition to be ran in the case the visibility of the app did not change.
@@ -6590,8 +6611,23 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return null;
}
+ private boolean isIconStylePreferred(int theme) {
+ if (theme == 0) {
+ return false;
+ }
+ final AttributeCache.Entry ent = AttributeCache.instance().get(packageName, theme,
+ R.styleable.Window, mWmService.mCurrentUserId);
+ if (ent != null) {
+ if (ent.array.hasValue(R.styleable.Window_windowSplashScreenBehavior)) {
+ return ent.array.getInt(R.styleable.Window_windowSplashScreenBehavior,
+ SPLASH_SCREEN_BEHAVIOR_DEFAULT)
+ == SPLASH_SCREEN_BEHAVIOR_ICON_PREFERRED;
+ }
+ }
+ return false;
+ }
private boolean shouldUseEmptySplashScreen(ActivityRecord sourceRecord, boolean startActivity,
- ActivityOptions options) {
+ ActivityOptions options, int resolvedTheme) {
if (sourceRecord == null && !startActivity) {
// Use empty style if this activity is not top activity. This could happen when adding
// a splash screen window to the warm start activity which is re-create because top is
@@ -6601,11 +6637,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return true;
}
}
+
+ // setSplashScreenStyle decide in priority of windowSplashScreenBehavior.
if (options != null) {
final int optionsStyle = options.getSplashScreenStyle();
if (optionsStyle == SplashScreen.SPLASH_SCREEN_STYLE_EMPTY) {
return true;
- } else if (optionsStyle == SplashScreen.SPLASH_SCREEN_STYLE_ICON) {
+ } else if (optionsStyle == SplashScreen.SPLASH_SCREEN_STYLE_ICON
+ || isIconStylePreferred(resolvedTheme)) {
return false;
}
// Choose the default behavior for Launcher and SystemUI when the SplashScreen style is
@@ -6615,6 +6654,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
} else if (mLaunchSourceType == LAUNCH_SOURCE_TYPE_SYSTEMUI) {
return true;
}
+ } else if (isIconStylePreferred(resolvedTheme)) {
+ return false;
}
if (sourceRecord == null) {
sourceRecord = searchCandidateLaunchingActivity();
@@ -6687,13 +6728,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
return;
}
- mSplashScreenStyleEmpty = shouldUseEmptySplashScreen(
- sourceRecord, startActivity, startOptions);
-
final int splashScreenTheme = startActivity ? getSplashscreenTheme(startOptions) : 0;
final int resolvedTheme = evaluateStartingWindowTheme(prev, packageName, theme,
splashScreenTheme);
+ mSplashScreenStyleEmpty = shouldUseEmptySplashScreen(sourceRecord, startActivity,
+ startOptions, resolvedTheme);
+
final boolean activityCreated =
mState.ordinal() >= STARTED.ordinal() && mState.ordinal() <= STOPPED.ordinal();
// If this activity is just created and all activities below are finish, treat this