summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/SurfaceView.java23
-rw-r--r--core/java/android/view/ViewRootImpl.java22
2 files changed, 30 insertions, 15 deletions
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 435675ba01e5..b57ac66e10cc 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -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();
});
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index ded25ab91b92..6450b57bb93e 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -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;
@@ -7351,6 +7347,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>
@@ -7360,7 +7364,7 @@ public final class ViewRootImpl implements ViewParent,
* @hide
*/
public void setReportNextDraw() {
- mReportNextDraw = true;
+ reportNextDraw();
invalidate();
}