Merge "Implement new splash screen API" into oc-dev
diff --git a/api/current.txt b/api/current.txt
index db6df0a..bbed515 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1541,6 +1541,7 @@
field public static final int windowShowAnimation = 16842934; // 0x10100b6
field public static final int windowShowWallpaper = 16843410; // 0x1010292
field public static final int windowSoftInputMode = 16843307; // 0x101022b
+ field public static final int windowSplashscreenContent = 16844135; // 0x1010567
field public static final int windowSwipeToDismiss = 16843763; // 0x10103f3
field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c
field public static final int windowTitleSize = 16842842; // 0x101005a
diff --git a/api/system-current.txt b/api/system-current.txt
index 20634f6..f19fe60 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -1663,6 +1663,7 @@
field public static final int windowShowAnimation = 16842934; // 0x10100b6
field public static final int windowShowWallpaper = 16843410; // 0x1010292
field public static final int windowSoftInputMode = 16843307; // 0x101022b
+ field public static final int windowSplashscreenContent = 16844135; // 0x1010567
field public static final int windowSwipeToDismiss = 16843763; // 0x10103f3
field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c
field public static final int windowTitleSize = 16842842; // 0x101005a
diff --git a/api/test-current.txt b/api/test-current.txt
index 624a7d3..e74ca97 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -1541,6 +1541,7 @@
field public static final int windowShowAnimation = 16842934; // 0x10100b6
field public static final int windowShowWallpaper = 16843410; // 0x1010292
field public static final int windowSoftInputMode = 16843307; // 0x101022b
+ field public static final int windowSplashscreenContent = 16844135; // 0x1010567
field public static final int windowSwipeToDismiss = 16843763; // 0x10103f3
field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c
field public static final int windowTitleSize = 16842842; // 0x101005a
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 5ede1c9..67f6d19 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -430,10 +430,9 @@
<flag name="adjustNothing" value="0x30" />
</attr>
- <!-- Flag allowing you to disable the preview animation for a window.
- The default value is false; if set to true, the system can never
- use the window's theme to show a preview of it before your
- actual instance is shown to the user. -->
+ <!-- Flag allowing you to disable the splash screen for a window. The default value is
+ false; if set to true, the system can never use the window's theme to show a splash
+ screen before your actual instance is shown to the user. -->
<attr name="windowDisablePreview" format="boolean" />
<!-- Flag indicating that this window should not be displayed at all.
@@ -2049,6 +2048,17 @@
Corresponds to setting {@link android.view.View#SYSTEM_UI_FLAG_LIGHT_STATUS_BAR} on
the decor view. -->
<attr name="windowLightStatusBar" format="boolean" />
+
+ <!-- Reference to a drawable to be used as the splash screen content of the window. This
+ drawable will be placed on top of the {@link android.R.attr#windowBackground} with its
+ bounds inset by the system bars. If the drawable should not be inset by the system
+ bars, use a fullscreen theme.
+ <p>
+ Note that even if no splashscreen content is set on the theme, the system may still
+ show a splash screen using the other attributes on the theme, like the
+ {@link android.R.attr#windowBackground}.
+ -->
+ <attr name="windowSplashscreenContent" format="reference" />
</declare-styleable>
<!-- The set of attributes that describe a AlertDialog's theme. -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 31ece50..d6ed178 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2816,6 +2816,7 @@
<public name="iconSpaceReserved"/>
<public name="defaultFocusHighlightEnabled" />
<public name="persistentFeature"/>
+ <public name="windowSplashscreenContent" />
</public-group>
<public-group type="style" first-id="0x010302e0">
@@ -2835,7 +2836,6 @@
<public name="paste_as_plain_text" />
</public-group>
-
<!-- ===============================================================
DO NOT ADD UN-GROUPED ITEMS HERE
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index e6df49a..4f29bfa 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -145,6 +145,7 @@
import android.database.ContentObserver;
import android.graphics.PixelFormat;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPlaybackClient;
@@ -221,6 +222,7 @@
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
+import android.widget.ImageView;
import com.android.internal.R;
import com.android.internal.logging.MetricsLogger;
@@ -2809,6 +2811,7 @@
+ overrideConfig + " to starting window resId=" + resId);
context = overrideContext;
}
+ typedArray.recycle();
}
final PhoneWindow win = new PhoneWindow(context);
@@ -2868,6 +2871,8 @@
}
params.setTitle("Splash Screen " + packageName);
+ addSplashscreenContent(win, context);
+
wm = (WindowManager) context.getSystemService(WINDOW_SERVICE);
view = win.getDecorView();
@@ -2898,6 +2903,24 @@
return null;
}
+ private void addSplashscreenContent(PhoneWindow win, Context ctx) {
+ final TypedArray a = ctx.obtainStyledAttributes(R.styleable.Window);
+ final int resId = a.getResourceId(R.styleable.Window_windowSplashscreenContent, 0);
+ a.recycle();
+ if (resId == 0) {
+ return;
+ }
+ final Drawable drawable = ctx.getDrawable(resId);
+ if (drawable == null) {
+ return;
+ }
+
+ // We wrap this into a view so the system insets get applied to the drawable.
+ final View v = new View(ctx);
+ v.setBackground(drawable);
+ win.setContentView(v);
+ }
+
/** Obtain proper context for showing splash screen on the provided display. */
private Context getDisplayContext(Context context, int displayId) {
if (displayId == Display.DEFAULT_DISPLAY) {
diff --git a/tests/ActivityTests/AndroidManifest.xml b/tests/ActivityTests/AndroidManifest.xml
index 64cdcf7..b381cbf 100644
--- a/tests/ActivityTests/AndroidManifest.xml
+++ b/tests/ActivityTests/AndroidManifest.xml
@@ -87,5 +87,13 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+ <activity android:name="CustomSplashscreenActivity"
+ android:label="CustomSplashscreen"
+ android:theme="@style/CustomSplashscreen">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
</application>
</manifest>
diff --git a/tests/ActivityTests/res/drawable/splashscreen.xml b/tests/ActivityTests/res/drawable/splashscreen.xml
new file mode 100644
index 0000000..01fb646
--- /dev/null
+++ b/tests/ActivityTests/res/drawable/splashscreen.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2017 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/icon"/>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/tests/ActivityTests/res/values/themes.xml b/tests/ActivityTests/res/values/themes.xml
index b8dd830..c11d2e4 100644
--- a/tests/ActivityTests/res/values/themes.xml
+++ b/tests/ActivityTests/res/values/themes.xml
@@ -26,4 +26,7 @@
<item name="android:colorBackground">@color/blue</item>
<item name="android:windowBackground">@color/blue</item>
</style>
+ <style name="CustomSplashscreen" parent="@android:style/Theme.Material.Light.NoActionBar">
+ <item name="android:windowSplashscreenContent">@drawable/splashscreen</item>
+ </style>
</resources>
diff --git a/tests/ActivityTests/src/com/google/android/test/activity/CustomSplashscreenActivity.java b/tests/ActivityTests/src/com/google/android/test/activity/CustomSplashscreenActivity.java
new file mode 100644
index 0000000..0683df6
--- /dev/null
+++ b/tests/ActivityTests/src/com/google/android/test/activity/CustomSplashscreenActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.google.android.test.activity;
+
+import android.annotation.Nullable;
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.SystemClock;
+
+/**
+ * Activity for which we set a custom splash screen.
+ */
+public class CustomSplashscreenActivity extends Activity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ SystemClock.sleep(2000);
+ }
+}