diff options
| -rw-r--r-- | core/java/android/view/WindowManagerPolicy.java | 6 | ||||
| -rw-r--r-- | core/res/res/anim/dialog_enter.xml | 2 | ||||
| -rw-r--r-- | core/res/res/anim/dialog_exit.xml | 2 | ||||
| -rw-r--r-- | core/res/res/anim/recent_enter.xml | 28 | ||||
| -rw-r--r-- | core/res/res/anim/recent_exit.xml | 29 | ||||
| -rw-r--r-- | core/res/res/values/styles.xml | 7 | ||||
| -rw-r--r-- | core/res/res/values/themes.xml | 6 | ||||
| -rw-r--r-- | services/java/com/android/server/WindowManagerService.java | 46 |
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 |