Fix issue #7401818: Wrong transition animation when clearing task
When we are clearing activities off the top of a task, propagate any activity options down from the top-most one to whatever top activity we are keeping. This ensures that if we set the activity options on the top activity of the task previously to give it the correct animation, we still keep that animation for the activity that really ends up being the top. Change-Id: I6919b644a530ac283fe4d320496edc2bf72aa04e
This commit is contained in:
@@ -602,6 +602,15 @@ final class ActivityRecord {
|
||||
}
|
||||
}
|
||||
|
||||
void updateOptionsLocked(ActivityOptions options) {
|
||||
if (options != null) {
|
||||
if (pendingOptions != null) {
|
||||
pendingOptions.abort();
|
||||
}
|
||||
pendingOptions = options;
|
||||
}
|
||||
}
|
||||
|
||||
void applyOptionsLocked() {
|
||||
if (pendingOptions != null) {
|
||||
final int animationType = pendingOptions.getAnimationType();
|
||||
@@ -653,6 +662,12 @@ final class ActivityRecord {
|
||||
}
|
||||
}
|
||||
|
||||
ActivityOptions takeOptionsLocked() {
|
||||
ActivityOptions opts = pendingOptions;
|
||||
pendingOptions = null;
|
||||
return opts;
|
||||
}
|
||||
|
||||
void removeUriPermissionsLocked() {
|
||||
if (uriPermissions != null) {
|
||||
uriPermissions.removeUriPermissionsLocked();
|
||||
|
||||
@@ -1963,6 +1963,8 @@ final class ActivityStack {
|
||||
int taskTopI = -1;
|
||||
int replyChainEnd = -1;
|
||||
int lastReparentPos = -1;
|
||||
ActivityOptions topOptions = null;
|
||||
boolean canMoveOptions = true;
|
||||
for (int i=mHistory.size()-1; i>=-1; i--) {
|
||||
ActivityRecord below = i >= 0 ? mHistory.get(i) : null;
|
||||
|
||||
@@ -2048,6 +2050,7 @@ final class ActivityStack {
|
||||
}
|
||||
int dstPos = 0;
|
||||
ThumbnailHolder curThumbHolder = target.thumbHolder;
|
||||
boolean gotOptions = !canMoveOptions;
|
||||
for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
|
||||
p = mHistory.get(srcPos);
|
||||
if (p.finishing) {
|
||||
@@ -2057,6 +2060,13 @@ final class ActivityStack {
|
||||
+ " out to target's task " + target.task);
|
||||
p.setTask(target.task, curThumbHolder, false);
|
||||
curThumbHolder = p.thumbHolder;
|
||||
canMoveOptions = false;
|
||||
if (!gotOptions && topOptions == null) {
|
||||
topOptions = p.takeOptionsLocked();
|
||||
if (topOptions != null) {
|
||||
gotOptions = true;
|
||||
}
|
||||
}
|
||||
if (DEBUG_ADD_REMOVE) {
|
||||
RuntimeException here = new RuntimeException("here");
|
||||
here.fillInStackTrace();
|
||||
@@ -2101,11 +2111,19 @@ final class ActivityStack {
|
||||
replyChainEnd = targetI;
|
||||
}
|
||||
ActivityRecord p = null;
|
||||
boolean gotOptions = !canMoveOptions;
|
||||
for (int srcPos=targetI; srcPos<=replyChainEnd; srcPos++) {
|
||||
p = mHistory.get(srcPos);
|
||||
if (p.finishing) {
|
||||
continue;
|
||||
}
|
||||
canMoveOptions = false;
|
||||
if (!gotOptions && topOptions == null) {
|
||||
topOptions = p.takeOptionsLocked();
|
||||
if (topOptions != null) {
|
||||
gotOptions = true;
|
||||
}
|
||||
}
|
||||
if (finishActivityLocked(p, srcPos,
|
||||
Activity.RESULT_CANCELED, null, "reset", false)) {
|
||||
replyChainEnd--;
|
||||
@@ -2245,7 +2263,17 @@ final class ActivityStack {
|
||||
target = below;
|
||||
targetI = i;
|
||||
}
|
||||
|
||||
|
||||
if (topOptions != null) {
|
||||
// If we got some ActivityOptions from an activity on top that
|
||||
// was removed from the task, propagate them to the new real top.
|
||||
if (taskTop != null) {
|
||||
taskTop.updateOptionsLocked(topOptions);
|
||||
} else {
|
||||
topOptions.abort();
|
||||
}
|
||||
}
|
||||
|
||||
return taskTop;
|
||||
}
|
||||
|
||||
@@ -2296,6 +2324,10 @@ final class ActivityStack {
|
||||
if (r.finishing) {
|
||||
continue;
|
||||
}
|
||||
ActivityOptions opts = r.takeOptionsLocked();
|
||||
if (opts != null) {
|
||||
ret.updateOptionsLocked(opts);
|
||||
}
|
||||
if (finishActivityLocked(r, i, Activity.RESULT_CANCELED,
|
||||
null, "clear", false)) {
|
||||
i--;
|
||||
|
||||
Reference in New Issue
Block a user