Merge "Prevent uncommitted activity visibilities" into udc-dev
This commit is contained in:
@@ -5400,7 +5400,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
return;
|
||||
}
|
||||
if (inFinishingTransition) {
|
||||
// Let the finishing transition commit the visibility.
|
||||
// Let the finishing transition commit the visibility, but let the controller know
|
||||
// about it so that we can recover from degenerate cases.
|
||||
mTransitionController.mValidateCommitVis.add(this);
|
||||
return;
|
||||
}
|
||||
// If we are preparing an app transition, then delay changing
|
||||
|
||||
@@ -1012,13 +1012,20 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
|
||||
// Record all the now-hiding activities so that they are committed. Just use
|
||||
// mParticipants because we can avoid a new list this way.
|
||||
for (int i = 0; i < mTransientHideTasks.size(); ++i) {
|
||||
// Only worry about tasks that were actually hidden. Otherwise, we could end-up
|
||||
// committing visibility for activity-level changes that aren't part of this
|
||||
// transition.
|
||||
if (mTransientHideTasks.get(i).isVisibleRequested()) continue;
|
||||
mTransientHideTasks.get(i).forAllActivities(r -> {
|
||||
final Task rootTask = mTransientHideTasks.get(i);
|
||||
rootTask.forAllActivities(r -> {
|
||||
// Only check leaf-tasks that were collected
|
||||
if (!mParticipants.contains(r.getTask())) return;
|
||||
if (rootTask.isVisibleRequested()) {
|
||||
// This transient-hide didn't hide, so don't commit anything (otherwise we
|
||||
// could prematurely commit invisible on unrelated activities). To be safe,
|
||||
// though, notify the controller to prevent degenerate cases.
|
||||
if (!r.isVisibleRequested()) {
|
||||
mController.mValidateCommitVis.add(r);
|
||||
}
|
||||
return;
|
||||
}
|
||||
// This did hide: commit immediately so that other transitions know about it.
|
||||
mParticipants.add(r);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -132,6 +132,13 @@ class TransitionController {
|
||||
*/
|
||||
final ArrayList<Runnable> mStateValidators = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* List of activity-records whose visibility changed outside the main/tracked part of a
|
||||
* transition (eg. in the finish-transaction). These will be checked when idle to recover from
|
||||
* degenerate states.
|
||||
*/
|
||||
final ArrayList<ActivityRecord> mValidateCommitVis = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Currently playing transitions (in the order they were started). When finished, records are
|
||||
* removed from this list.
|
||||
@@ -848,6 +855,15 @@ class TransitionController {
|
||||
}
|
||||
}
|
||||
mStateValidators.clear();
|
||||
for (int i = 0; i < mValidateCommitVis.size(); ++i) {
|
||||
final ActivityRecord ar = mValidateCommitVis.get(i);
|
||||
if (!ar.isVisibleRequested() && ar.isVisible()) {
|
||||
Slog.e(TAG, "Uncommitted visibility change: " + ar);
|
||||
ar.commitVisibility(ar.isVisibleRequested(), false /* layout */,
|
||||
false /* fromTransition */);
|
||||
}
|
||||
}
|
||||
mValidateCommitVis.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user