Merge changes I5762a98d,I39f4e015 into oc-dev

* changes:
  ViewRootImpl: More careful draw accounting.
  SurfaceView: Avoid over-reporting DRAW_FINISHED.
This commit is contained in:
TreeHugger Robot
2017-05-30 21:33:24 +00:00
committed by Android (Google) Code Review
2 changed files with 30 additions and 15 deletions

View File

@@ -264,6 +264,22 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
updateSurface();
}
private void performDrawFinished() {
if (mPendingReportDraws > 0) {
mDrawFinished = true;
if (mAttachedToWindow) {
mParent.requestTransparentRegion(SurfaceView.this);
notifyDrawFinished();
invalidate();
}
} else {
Log.e(TAG, System.identityHashCode(this) + "finished drawing"
+ " but no pending report draw (extra call"
+ " to draw completion runnable?)");
}
}
void notifyDrawFinished() {
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
@@ -729,12 +745,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
}
runOnUiThread(() -> {
mDrawFinished = true;
if (mAttachedToWindow) {
mParent.requestTransparentRegion(SurfaceView.this);
notifyDrawFinished();
invalidate();
}
performDrawFinished();
});
}

View File

@@ -2330,7 +2330,7 @@ public final class ViewRootImpl implements ViewParent,
// Remember if we must report the next draw.
if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) {
mReportNextDraw = true;
reportNextDraw();
}
boolean cancelDraw = mAttachInfo.mTreeObserver.dispatchOnPreDraw() || !isViewVisible;
@@ -2731,11 +2731,8 @@ public final class ViewRootImpl implements ViewParent,
/**
* A count of the number of calls to pendingDrawFinished we
* require to notify the WM drawing is complete.
*
* This starts at 1, for the ViewRootImpl surface itself.
* Subsurfaces may debt the value with drawPending.
*/
int mDrawsNeededToReport = 1;
int mDrawsNeededToReport = 0;
/**
* Delay notifying WM of draw finished until
@@ -2761,7 +2758,7 @@ public final class ViewRootImpl implements ViewParent,
private void reportDrawFinished() {
try {
mDrawsNeededToReport = 1;
mDrawsNeededToReport = 0;
mWindowSession.finishDrawing(mWindow);
} catch (RemoteException e) {
// Have fun!
@@ -3772,13 +3769,12 @@ public final class ViewRootImpl implements ViewParent,
args.recycle();
if (msg.what == MSG_RESIZED_REPORT) {
mReportNextDraw = true;
reportNextDraw();
}
if (mView != null && framesChanged) {
forceLayout(mView);
}
requestLayout();
}
break;
@@ -7343,6 +7339,14 @@ public final class ViewRootImpl implements ViewParent,
return false;
}
private void reportNextDraw() {
if (mReportNextDraw == false) {
drawPending();
}
mReportNextDraw = true;
}
/**
* Force the window to report its next draw.
* <p>
@@ -7352,7 +7356,7 @@ public final class ViewRootImpl implements ViewParent,
* @hide
*/
public void setReportNextDraw() {
mReportNextDraw = true;
reportNextDraw();
invalidate();
}