summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2010-12-09 19:22:04 -0800
committerDianne Hackborn <hackbod@google.com>2010-12-09 19:22:04 -0800
commit7da6ac33a9de82be52e22846d5f22d502452854c (patch)
tree2702555b7795977ce55732015b9745e7bb031b37
parentbca1c4ffad8c28fc142eddcd33095dfa2ebfb0a0 (diff)
downloadframeworks_base-7da6ac33a9de82be52e22846d5f22d502452854c.zip
frameworks_base-7da6ac33a9de82be52e22846d5f22d502452854c.tar.gz
frameworks_base-7da6ac33a9de82be52e22846d5f22d502452854c.tar.bz2
Fix issue #3272051: Use backward transition when going backwards.
Also know as: Issue #3272051 Contacts edit view: Tapping the in-app back button results in a forward transition Yeah more complexity in deciding which animation to use. Also reduce complexity in deciding which app's animation set to use, to balance things out (and make it have less stupid behavior). Change-Id: I78c6c5c5249a96206f7e03ce587c1dcb9a7dc14f
-rw-r--r--core/java/android/view/IWindowManager.aidl5
-rw-r--r--services/java/com/android/server/WindowManagerService.java82
-rw-r--r--services/java/com/android/server/am/ActivityStack.java45
-rw-r--r--tests/permission/src/com/android/framework/permission/tests/WindowManagerPermissionTests.java2
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) {