diff options
author | Dianne Hackborn <hackbod@google.com> | 2010-12-09 19:25:17 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-12-09 19:25:17 -0800 |
commit | a64f506941c5c3113984cd3403b82cbcb6bf482d (patch) | |
tree | e54fda24215bfc1328acf52e4d42b0f5525f6965 | |
parent | 6f7f877cc00b17605307776eaa87cbbec2369a43 (diff) | |
parent | 7da6ac33a9de82be52e22846d5f22d502452854c (diff) | |
download | frameworks_base-a64f506941c5c3113984cd3403b82cbcb6bf482d.zip frameworks_base-a64f506941c5c3113984cd3403b82cbcb6bf482d.tar.gz frameworks_base-a64f506941c5c3113984cd3403b82cbcb6bf482d.tar.bz2 |
Merge "Fix issue #3272051: Use backward transition when going backwards."
4 files changed, 61 insertions, 73 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 0d6966f..2c8ca8b 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -1,5 +1,4 @@ -/* //device/java/android/android/view/IWindowManager.aidl -** +/* ** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); @@ -74,7 +73,7 @@ interface IWindowManager void setAppOrientation(IApplicationToken token, int requestedOrientation); int getAppOrientation(IApplicationToken token); void setFocusedApp(IBinder token, boolean moveFocusNow); - void prepareAppTransition(int transit); + void prepareAppTransition(int transit, boolean alwaysKeepCurrent); int getPendingAppTransition(); void overridePendingAppTransition(String packageName, int enterAnim, int exitAnim); void executeAppTransition(); diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 78bc263..8e33011 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -327,18 +327,6 @@ public class WindowManagerService extends IWindowManager.Stub final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<AppWindowToken>(); /** - * This was the app token that was used to retrieve the last enter - * animation. It will be used for the next exit animation. - */ - AppWindowToken mLastEnterAnimToken; - - /** - * These were the layout params used to retrieve the last enter animation. - * They will be used for the next exit animation. - */ - LayoutParams mLastEnterAnimParams; - - /** * Z-ordered (bottom-most first) list of all Window objects. */ final ArrayList<WindowState> mWindows = new ArrayList<WindowState>(); @@ -3663,7 +3651,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - public void prepareAppTransition(int transit) { + public void prepareAppTransition(int transit, boolean alwaysKeepCurrent) { if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, "prepareAppTransition()")) { throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); @@ -3677,14 +3665,16 @@ public class WindowManagerService extends IWindowManager.Stub if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) { mNextAppTransition = transit; - } else if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN - && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) { - // Opening a new task always supersedes a close for the anim. - mNextAppTransition = transit; - } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN - && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) { - // Opening a new activity always supersedes a close for the anim. - mNextAppTransition = transit; + } else if (!alwaysKeepCurrent) { + if (transit == WindowManagerPolicy.TRANSIT_TASK_OPEN + && mNextAppTransition == WindowManagerPolicy.TRANSIT_TASK_CLOSE) { + // Opening a new task always supersedes a close for the anim. + mNextAppTransition = transit; + } else if (transit == WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN + && mNextAppTransition == WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE) { + // Opening a new activity always supersedes a close for the anim. + mNextAppTransition = transit; + } } mAppTransitionReady = false; mAppTransitionTimeout = false; @@ -4237,10 +4227,6 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.animating = false; } mAppTokens.remove(wtoken); - if (mLastEnterAnimToken == wtoken) { - mLastEnterAnimToken = null; - mLastEnterAnimParams = null; - } wtoken.removed = true; if (wtoken.startingData != null) { startingToken = wtoken; @@ -6713,6 +6699,7 @@ public class WindowManagerService extends IWindowManager.Stub int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; // Current transformation being applied. + boolean mHaveMatrix; float mDsDx=1, mDtDx=0, mDsDy=0, mDtDy=1; float mLastDsDx=1, mLastDtDx=0, mLastDsDy=0, mLastDtDy=1; float mHScale=1, mVScale=1; @@ -7598,6 +7585,7 @@ public class WindowManagerService extends IWindowManager.Stub // since it is already included in the transformation. //Slog.i(TAG, "Transform: " + matrix); + mHaveMatrix = true; tmpMatrix.getValues(tmpFloats); mDsDx = tmpFloats[Matrix.MSCALE_X]; mDtDx = tmpFloats[Matrix.MSKEW_Y]; @@ -7649,6 +7637,7 @@ public class WindowManagerService extends IWindowManager.Stub mShownFrame.offset(mXOffset, mYOffset); } mShownAlpha = mAlpha; + mHaveMatrix = false; mDsDx = 1; mDtDx = 0; mDsDy = 0; @@ -8064,11 +8053,6 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mVisibleInsets="); mVisibleInsets.printShortString(pw); pw.print(" last="); mLastVisibleInsets.printShortString(pw); pw.println(); - if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { - pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); - pw.print(" mAlpha="); pw.print(mAlpha); - pw.print(" mLastAlpha="); pw.println(mLastAlpha); - } if (mAnimating || mLocalAnimating || mAnimationIsEntrance || mAnimation != null) { pw.print(prefix); pw.print("mAnimating="); pw.print(mAnimating); @@ -8083,6 +8067,17 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" "); mTransformation.printShortString(pw); pw.println(); } + if (mShownAlpha != 1 || mAlpha != 1 || mLastAlpha != 1) { + pw.print(prefix); pw.print("mShownAlpha="); pw.print(mShownAlpha); + pw.print(" mAlpha="); pw.print(mAlpha); + pw.print(" mLastAlpha="); pw.println(mLastAlpha); + } + if (mHaveMatrix) { + pw.print(prefix); pw.print("mDsDx="); pw.print(mDsDx); + pw.print(" mDtDx="); pw.print(mDtDx); + pw.print(" mDsDy="); pw.print(mDsDy); + pw.print(" mDtDy="); pw.println(mDtDy); + } pw.print(prefix); pw.print("mDrawPending="); pw.print(mDrawPending); pw.print(" mCommitDrawPending="); pw.print(mCommitDrawPending); pw.print(" mReadyToShow="); pw.print(mReadyToShow); @@ -8543,14 +8538,14 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(prefix); pw.print("animating="); pw.print(animating); pw.print(" animation="); pw.println(animation); } - if (animLayerAdjustment != 0) { - pw.print(prefix); pw.print("animLayerAdjustment="); pw.println(animLayerAdjustment); - } if (hasTransformation) { - pw.print(prefix); pw.print("hasTransformation="); pw.print(hasTransformation); - pw.print(" transformation="); transformation.printShortString(pw); + pw.print(prefix); pw.print("XForm: "); + transformation.printShortString(pw); pw.println(); } + if (animLayerAdjustment != 0) { + pw.print(prefix); pw.print("animLayerAdjustment="); pw.println(animLayerAdjustment); + } if (startingData != null || removed || firstWindowDrawn) { pw.print(prefix); pw.print("startingData="); pw.print(startingData); pw.print(" removed="); pw.print(removed); @@ -9854,15 +9849,6 @@ public class WindowManagerService extends IWindowManager.Stub "New transit into wallpaper: " + transit); } - if ((transit&WindowManagerPolicy.TRANSIT_ENTER_MASK) != 0) { - mLastEnterAnimToken = animToken; - mLastEnterAnimParams = animLp; - } else if (mLastEnterAnimParams != null) { - animLp = mLastEnterAnimParams; - mLastEnterAnimToken = null; - mLastEnterAnimParams = null; - } - // If all closing windows are obscured, then there is // no need to do an animation. This is the case, for // example, when this transition is being done behind @@ -10585,10 +10571,6 @@ public class WindowManagerService extends IWindowManager.Stub token.animating = false; mAppTokens.remove(token); mExitingAppTokens.remove(i); - if (mLastEnterAnimToken == token) { - mLastEnterAnimToken = null; - mLastEnterAnimParams = null; - } } } @@ -11409,10 +11391,6 @@ public class WindowManagerService extends IWindowManager.Stub } pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition); pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation); - if (mLastEnterAnimToken != null || mLastEnterAnimToken != null) { - pw.print(" mLastEnterAnimToken="); pw.print(mLastEnterAnimToken); - pw.print(", mLastEnterAnimParams="); pw.println(mLastEnterAnimParams); - } if (mOpeningApps.size() > 0) { pw.print(" mOpeningApps="); pw.println(mOpeningApps); } diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index aa4cd66..e77ec20 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -1195,11 +1195,12 @@ public class ActivityStack { if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare close transition: prev=" + prev); if (mNoAnimActivities.contains(prev)) { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_NONE, false); } else { mService.mWindowManager.prepareAppTransition(prev.task == next.task ? WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE - : WindowManagerPolicy.TRANSIT_TASK_CLOSE); + : WindowManagerPolicy.TRANSIT_TASK_CLOSE, false); } mService.mWindowManager.setAppWillBeHidden(prev); mService.mWindowManager.setAppVisibility(prev, false); @@ -1207,11 +1208,12 @@ public class ActivityStack { if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare open transition: prev=" + prev); if (mNoAnimActivities.contains(next)) { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_NONE, false); } else { mService.mWindowManager.prepareAppTransition(prev.task == next.task ? WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN - : WindowManagerPolicy.TRANSIT_TASK_OPEN); + : WindowManagerPolicy.TRANSIT_TASK_OPEN, false); } } if (false) { @@ -1222,9 +1224,11 @@ public class ActivityStack { if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare open transition: no previous"); if (mNoAnimActivities.contains(next)) { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_NONE, false); } else { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, false); } } @@ -1368,7 +1372,7 @@ public class ActivityStack { } private final void startActivityLocked(ActivityRecord r, boolean newTask, - boolean doResume) { + boolean doResume, boolean keepCurTransition) { final int NH = mHistory.size(); int addPos = -1; @@ -1439,16 +1443,17 @@ public class ActivityStack { if (DEBUG_TRANSITION) Slog.v(TAG, "Prepare open transition: starting " + r); if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_NONE, keepCurTransition); mNoAnimActivities.add(r); } else if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) != 0) { mService.mWindowManager.prepareAppTransition( - WindowManagerPolicy.TRANSIT_TASK_OPEN); + WindowManagerPolicy.TRANSIT_TASK_OPEN, keepCurTransition); mNoAnimActivities.remove(r); } else { mService.mWindowManager.prepareAppTransition(newTask ? WindowManagerPolicy.TRANSIT_TASK_OPEN - : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN); + : WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN, keepCurTransition); mNoAnimActivities.remove(r); } mService.mWindowManager.addAppToken( @@ -2250,7 +2255,7 @@ public class ActivityStack { (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { // The caller has requested to completely replace any - // exising task with its new activity. Well that should + // existing task with its new activity. Well that should // not be too hard... reuseTask = taskTop.task; performClearTaskLocked(taskTop.task.taskId); @@ -2383,6 +2388,7 @@ public class ActivityStack { } boolean newTask = false; + boolean keepCurTransition = false; // Should this be considered a new task? if (r.resultTo == null && !addingToTask @@ -2413,6 +2419,7 @@ public class ActivityStack { // activity is already running. ActivityRecord top = performClearTaskLocked( sourceRecord.task.taskId, r, launchFlags); + keepCurTransition = true; if (top != null) { logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); top.deliverNewIntentLocked(callingUid, r.intent); @@ -2474,7 +2481,7 @@ public class ActivityStack { EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId); } logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); - startActivityLocked(r, newTask, doResume); + startActivityLocked(r, newTask, doResume, keepCurTransition); return START_SUCCESS; } @@ -3128,7 +3135,7 @@ public class ActivityStack { "Prepare close transition: finishing " + r); mService.mWindowManager.prepareAppTransition(endTask ? WindowManagerPolicy.TRANSIT_TASK_CLOSE - : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE); + : WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE, false); // Tell window manager to prepare for this one to be removed. mService.mWindowManager.setAppVisibility(r, false); @@ -3481,13 +3488,15 @@ public class ActivityStack { "Prepare to front transition: task=" + tr); if (reason != null && (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_NONE, false); ActivityRecord r = topRunningActivityLocked(null); if (r != null) { mNoAnimActivities.add(r); } } else { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_TASK_TO_FRONT); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_TASK_TO_FRONT, false); } mService.mWindowManager.moveAppTokensToTop(moved); @@ -3566,13 +3575,15 @@ public class ActivityStack { if (reason != null && (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_NONE, false); ActivityRecord r = topRunningActivityLocked(null); if (r != null) { mNoAnimActivities.add(r); } } else { - mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_TASK_TO_BACK); + mService.mWindowManager.prepareAppTransition( + WindowManagerPolicy.TRANSIT_TASK_TO_BACK, false); } mService.mWindowManager.moveAppTokensToBottom(moved); if (VALIDATE_TOKENS) { diff --git a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java index 710ff30..e0f0f05 100644 --- a/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java +++ b/tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java @@ -144,7 +144,7 @@ public class WindowManagerPermissionTests extends TestCase { } try { - mWm.prepareAppTransition(0); + mWm.prepareAppTransition(0, false); fail("IWindowManager.prepareAppTransition did not throw SecurityException as" + " expected"); } catch (SecurityException e) { |