Merge "Ensure all WindowStates are considered before determining all drawn." into oc-dr1-dev
This commit is contained in:
@@ -1342,6 +1342,24 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the drawn window states of this {@link AppWindowToken} has considered every
|
||||||
|
* child {@link WindowState}. A child is considered if it has been passed into
|
||||||
|
* {@link #updateDrawnWindowStates(WindowState)} after being added. This is used to determine
|
||||||
|
* whether states, such as {@code allDrawn}, can be set, which relies on state variables such as
|
||||||
|
* {@code mNumInterestingWindows}, which depend on all {@link WindowState}s being considered.
|
||||||
|
*
|
||||||
|
* @return {@code true} If all children have been considered, {@code false}.
|
||||||
|
*/
|
||||||
|
private boolean allDrawnStatesConsidered() {
|
||||||
|
for (WindowState child : mChildren) {
|
||||||
|
if (!child.getDrawnStatedEvaluated()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if the token has finished drawing. This should only be called from
|
* Determines if the token has finished drawing. This should only be called from
|
||||||
* {@link DisplayContent#applySurfaceChangesTransaction}
|
* {@link DisplayContent#applySurfaceChangesTransaction}
|
||||||
@@ -1349,9 +1367,14 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
|
|||||||
void updateAllDrawn() {
|
void updateAllDrawn() {
|
||||||
if (!allDrawn) {
|
if (!allDrawn) {
|
||||||
// Number of drawn windows can be less when a window is being relaunched, wait for
|
// Number of drawn windows can be less when a window is being relaunched, wait for
|
||||||
// all windows to be launched and drawn for this token be considered all drawn
|
// all windows to be launched and drawn for this token be considered all drawn.
|
||||||
final int numInteresting = mNumInterestingWindows;
|
final int numInteresting = mNumInterestingWindows;
|
||||||
if (numInteresting > 0 && mNumDrawnWindows >= numInteresting && !isRelaunching()) {
|
|
||||||
|
// We must make sure that all present children have been considered (determined by
|
||||||
|
// {@link #allDrawnStatesConsidered}) before evaluating whether everything has been
|
||||||
|
// drawn.
|
||||||
|
if (numInteresting > 0 && allDrawnStatesConsidered()
|
||||||
|
&& mNumDrawnWindows >= numInteresting && !isRelaunching()) {
|
||||||
if (DEBUG_VISIBILITY) Slog.v(TAG, "allDrawn: " + this
|
if (DEBUG_VISIBILITY) Slog.v(TAG, "allDrawn: " + this
|
||||||
+ " interesting=" + numInteresting + " drawn=" + mNumDrawnWindows);
|
+ " interesting=" + numInteresting + " drawn=" + mNumDrawnWindows);
|
||||||
allDrawn = true;
|
allDrawn = true;
|
||||||
@@ -1396,6 +1419,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
|
|||||||
* windows in this app token where not considered drawn as of the last pass.
|
* windows in this app token where not considered drawn as of the last pass.
|
||||||
*/
|
*/
|
||||||
boolean updateDrawnWindowStates(WindowState w) {
|
boolean updateDrawnWindowStates(WindowState w) {
|
||||||
|
w.setDrawnStateEvaluated(true /*evaluated*/);
|
||||||
|
|
||||||
if (DEBUG_STARTING_WINDOW_VERBOSE && w == startingWindow) {
|
if (DEBUG_STARTING_WINDOW_VERBOSE && w == startingWindow) {
|
||||||
Slog.d(TAG, "updateWindows: starting " + w + " isOnScreen=" + w.isOnScreen()
|
Slog.d(TAG, "updateWindows: starting " + w + " isOnScreen=" + w.isOnScreen()
|
||||||
+ " allDrawn=" + allDrawn + " freezingScreen=" + mAppAnimator.freezingScreen);
|
+ " allDrawn=" + allDrawn + " freezingScreen=" + mAppAnimator.freezingScreen);
|
||||||
|
|||||||
@@ -559,6 +559,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
|||||||
*/
|
*/
|
||||||
final Rect mLastSurfaceInsets = new Rect();
|
final Rect mLastSurfaceInsets = new Rect();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A flag set by the {@link WindowState} parent to indicate that the parent has examined this
|
||||||
|
* {@link WindowState} in its overall drawing context. This book-keeping allows the parent to
|
||||||
|
* make sure all children have been considered.
|
||||||
|
*/
|
||||||
|
private boolean mDrawnStateEvaluated;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compares two window sub-layers and returns -1 if the first is lesser than the second in terms
|
* Compares two window sub-layers and returns -1 if the first is lesser than the second in terms
|
||||||
* of z-order and 1 otherwise.
|
* of z-order and 1 otherwise.
|
||||||
@@ -675,6 +682,27 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
|||||||
mSession.windowAddedLocked(mAttrs.packageName);
|
mSession.windowAddedLocked(mAttrs.packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this {@link WindowState} has been considered for drawing by its parent.
|
||||||
|
*/
|
||||||
|
boolean getDrawnStatedEvaluated() {
|
||||||
|
return mDrawnStateEvaluated;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether this {@link WindowState} has been considered for drawing by its parent. Should
|
||||||
|
* be cleared when detached from parent.
|
||||||
|
*/
|
||||||
|
void setDrawnStateEvaluated(boolean evaluated) {
|
||||||
|
mDrawnStateEvaluated = evaluated;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void onParentSet() {
|
||||||
|
super.onParentSet();
|
||||||
|
setDrawnStateEvaluated(false /*evaluated*/);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getOwningUid() {
|
public int getOwningUid() {
|
||||||
return mOwnerUid;
|
return mOwnerUid;
|
||||||
|
|||||||
Reference in New Issue
Block a user