summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/WindowManagerPolicy.java6
-rw-r--r--core/res/res/anim/dialog_enter.xml2
-rw-r--r--core/res/res/anim/dialog_exit.xml2
-rw-r--r--core/res/res/anim/recent_enter.xml28
-rw-r--r--core/res/res/anim/recent_exit.xml29
-rw-r--r--core/res/res/values/styles.xml7
-rw-r--r--core/res/res/values/themes.xml6
-rw-r--r--services/java/com/android/server/WindowManagerService.java46
8 files changed, 114 insertions, 12 deletions
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index bd38b2dca2a3..45ff27e83848 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -436,6 +436,12 @@ public interface WindowManagerPolicy {
public int subWindowTypeToLayerLw(int type);
/**
+ * Get the highest layer (actually one more than) that the wallpaper is
+ * allowed to be in.
+ */
+ public int getMaxWallpaperLayer();
+
+ /**
* Called when the system would like to show a UI to indicate that an
* application is starting. You can use this to add a
* APPLICATION_STARTING_TYPE window with the given appToken to the window
diff --git a/core/res/res/anim/dialog_enter.xml b/core/res/res/anim/dialog_enter.xml
index cc409e8f5a05..167f4bce4a9d 100644
--- a/core/res/res/anim/dialog_enter.xml
+++ b/core/res/res/anim/dialog_enter.xml
@@ -22,7 +22,7 @@
android:interpolator="@anim/decelerate_interpolator">
<scale android:fromXScale="0.9" android:toXScale="1.0"
android:fromYScale="0.9" android:toYScale="1.0"
- android:pivotX="50%" android:pivotY="50%"
+ android:pivotX="50%p" android:pivotY="50%p"
android:duration="@android:integer/config_shortAnimTime" />
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_shortAnimTime" />
diff --git a/core/res/res/anim/dialog_exit.xml b/core/res/res/anim/dialog_exit.xml
index 8bf808247b6a..d412cfb1291f 100644
--- a/core/res/res/anim/dialog_exit.xml
+++ b/core/res/res/anim/dialog_exit.xml
@@ -21,7 +21,7 @@
android:interpolator="@anim/accelerate_interpolator">
<scale android:fromXScale="1.0" android:toXScale="0.9"
android:fromYScale="1.0" android:toYScale="0.9"
- android:pivotX="50%" android:pivotY="50%"
+ android:pivotX="50%p" android:pivotY="50%p"
android:duration="@android:integer/config_shortAnimTime" />
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="@android:integer/config_shortAnimTime"/>
diff --git a/core/res/res/anim/recent_enter.xml b/core/res/res/anim/recent_enter.xml
new file mode 100644
index 000000000000..deeb96b9dcb0
--- /dev/null
+++ b/core/res/res/anim/recent_enter.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2009, 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@anim/decelerate_interpolator">
+ <scale android:fromXScale="2.0" android:toXScale="1.0"
+ android:fromYScale="2.0" android:toYScale="1.0"
+ android:pivotX="50%p" android:pivotY="50%p"
+ android:duration="@android:integer/config_mediumAnimTime" />
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:duration="@android:integer/config_mediumAnimTime"/>
+</set>
diff --git a/core/res/res/anim/recent_exit.xml b/core/res/res/anim/recent_exit.xml
new file mode 100644
index 000000000000..fed701409e66
--- /dev/null
+++ b/core/res/res/anim/recent_exit.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2009, 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:interpolator="@anim/decelerate_interpolator"
+ android:zAdjustment="top">
+ <scale android:fromXScale="1.0" android:toXScale="2.0"
+ android:fromYScale="1.0" android:toYScale="2.0"
+ android:pivotX="50%p" android:pivotY="50%p"
+ android:duration="@android:integer/config_mediumAnimTime" />
+ <alpha android:fromAlpha="1.0" android:toAlpha="0"
+ android:duration="@android:integer/config_mediumAnimTime"/>
+</set>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 69612e9ce249..35db8eed78b7 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -177,6 +177,13 @@
<item name="windowExitAnimation">@anim/wallpaper_exit</item>
</style>
+ <!-- A special animation we can use for recent applications,
+ for devices that can support it (do alpha transformations). -->
+ <style name="Animation.RecentApplications">
+ <item name="windowEnterAnimation">@anim/recent_enter</item>
+ <item name="windowExitAnimation">@anim/recent_exit</item>
+ </style>
+
<!-- Status Bar Styles -->
<style name="TextAppearance.StatusBarTitle">
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 1aa48ee6bf6b..04402fd9204e 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -500,4 +500,10 @@
<item name="windowContentOverlay">@null</item>
<item name="textAppearance">@style/TextAppearance.Theme.Dialog.AppError</item>
</style>
+
+ <!-- Special theme for the recent apps dialog, to allow customization
+ with overlays. -->
+ <style name="Theme.Dialog.RecentApplications">
+ </style>
+
</resources>
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index d53f00242f18..0cd59494c756 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -1384,12 +1384,18 @@ public class WindowManagerService extends IWindowManager.Stub
(mLowerWallpaperTarget == null && foundW.mAppToken != null)
? foundW.mAppToken.animLayerAdjustment : 0;
+ final int maxLayer = mPolicy.getMaxWallpaperLayer()
+ * TYPE_LAYER_MULTIPLIER
+ + TYPE_LAYER_OFFSET;
+
// Now w is the window we are supposed to be behind... but we
// need to be sure to also be behind any of its attached windows,
- // AND any starting window associated with it.
+ // AND any starting window associated with it, AND below the
+ // maximum layer the policy allows for wallpapers.
while (foundI > 0) {
WindowState wb = (WindowState)localmWindows.get(foundI-1);
- if (wb.mAttachedWindow != foundW &&
+ if (wb.mBaseLayer < maxLayer &&
+ wb.mAttachedWindow != foundW &&
(wb.mAttrs.type != TYPE_APPLICATION_STARTING ||
wb.mToken != foundW.mToken)) {
// This window is not related to the previous one in any
@@ -2266,6 +2272,12 @@ public class WindowManagerService extends IWindowManager.Stub
// Currently in a hide animation... turn this into
// an exit.
win.mExiting = true;
+ } else if (win == mWallpaperTarget) {
+ // If the wallpaper is currently behind this
+ // window, we need to change both of them inside
+ // of a transaction to avoid artifacts.
+ win.mExiting = true;
+ win.mAnimating = true;
} else {
if (mInputMethodWindow == win) {
mInputMethodWindow = null;
@@ -3158,6 +3170,10 @@ public class WindowManagerService extends IWindowManager.Stub
return;
}
if (ent.array.getBoolean(
+ com.android.internal.R.styleable.Window_windowIsFloating, false)) {
+ return;
+ }
+ if (ent.array.getBoolean(
com.android.internal.R.styleable.Window_windowShowWallpaper, false)) {
return;
}
@@ -7087,8 +7103,8 @@ public class WindowManagerService extends IWindowManager.Stub
mAppToken.firstWindowDrawn = true;
if (mAppToken.startingData != null) {
- if (DEBUG_STARTING_WINDOW) Log.v(TAG, "Finish starting "
- + mToken
+ if (DEBUG_STARTING_WINDOW || DEBUG_ANIM) Log.v(TAG,
+ "Finish starting " + mToken
+ ": first real window is shown, no animation");
// If this initial window is animating, stop it -- we
// will do an animation to reveal it from behind the
@@ -7305,13 +7321,13 @@ public class WindowManagerService extends IWindowManager.Stub
// Compute the desired transformation.
tmpMatrix.setTranslate(frame.left, frame.top);
if (selfTransformation) {
- tmpMatrix.preConcat(mTransformation.getMatrix());
+ tmpMatrix.postConcat(mTransformation.getMatrix());
}
if (attachedTransformation != null) {
- tmpMatrix.preConcat(attachedTransformation.getMatrix());
+ tmpMatrix.postConcat(attachedTransformation.getMatrix());
}
if (appTransformation != null) {
- tmpMatrix.preConcat(appTransformation.getMatrix());
+ tmpMatrix.postConcat(appTransformation.getMatrix());
}
// "convert" it into SurfaceFlinger's format
@@ -8928,11 +8944,14 @@ public class WindowManagerService extends IWindowManager.Stub
wallpaperMayChange = true;
}
}
+ boolean wasAnimating = w.mAnimating;
if (w.stepAnimationLocked(currentTime, dw, dh)) {
animating = true;
//w.dump(" ");
}
-
+ if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) {
+ wallpaperMayChange = true;
+ }
mPolicy.animatingWindowLw(w, attrs);
}
@@ -9269,6 +9288,7 @@ public class WindowManagerService extends IWindowManager.Stub
boolean covered = false;
boolean syswin = false;
boolean backgroundFillerShown = false;
+ boolean forceHiding = false;
final int N = mWindows.size();
@@ -9401,7 +9421,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- if (w.mAttachedHidden) {
+ if ((forceHiding
+ && attrs.type != WindowManager.LayoutParams.TYPE_STATUS_BAR
+ && attrs.type != WindowManager.LayoutParams.TYPE_WALLPAPER)
+ || w.mAttachedHidden) {
if (!w.mLastHidden) {
//dump();
w.mLastHidden = true;
@@ -9515,6 +9538,9 @@ public class WindowManagerService extends IWindowManager.Stub
}
if (displayed) {
+ if (attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD) {
+ forceHiding = true;
+ }
if (!covered) {
if (attrs.width == LayoutParams.FILL_PARENT
&& attrs.height == LayoutParams.FILL_PARENT) {
@@ -9597,7 +9623,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
backgroundFillerShown = true;
mBackgroundFillerShown = true;
- } else if (canBeSeen && !obscured &&
+ } else if (canBeSeen && !obscured && !forceHiding &&
(attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) {
if (localLOGV) Log.v(TAG, "Win " + w
+ ": blurring=" + blurring