Merge "Show Dalvik stack trace if an exception happens at draw time External bug: http://code.google.com/p/android/issues/detail?id=49379"

This commit is contained in:
Romain Guy
2013-02-19 23:33:53 +00:00
committed by Android (Google) Code Review

View File

@@ -441,16 +441,6 @@ public abstract class HardwareRenderer {
abstract boolean draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
Rect dirty);
/**
* Creates a new display list that can be used to record batches of
* drawing operations.
*
* @return A new display list.
*/
public DisplayList createDisplayList() {
return createDisplayList(null);
}
/**
* Creates a new display list that can be used to record batches of
* drawing operations.
@@ -1356,31 +1346,25 @@ public abstract class HardwareRenderer {
dirty = beginFrame(canvas, dirty, surfaceState);
DisplayList displayList = buildDisplayList(view, canvas);
int saveCount = 0;
int status = DisplayList.STATUS_DONE;
try {
view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED)
== View.PFLAG_INVALIDATED;
view.mPrivateFlags &= ~View.PFLAG_INVALIDATED;
long buildDisplayListStartTime = startBuildDisplayListProfiling();
canvas.clearLayerUpdates();
DisplayList displayList = buildDisplayList(view);
status = prepareFrame(dirty);
saveCount = canvas.save();
callbacks.onHardwarePreDraw(canvas);
endBuildDisplayListProfiling(buildDisplayListStartTime);
if (displayList != null) {
status = drawDisplayList(attachInfo, canvas, displayList, status);
} else {
// Shouldn't reach here
view.draw(canvas);
}
} catch (Exception e) {
Log.e(LOG_TAG, "An error has occurred while drawing:", e);
} finally {
callbacks.onHardwarePostDraw(canvas);
canvas.restoreToCount(saveCount);
@@ -1408,6 +1392,23 @@ public abstract class HardwareRenderer {
return false;
}
private DisplayList buildDisplayList(View view, HardwareCanvas canvas) {
view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED)
== View.PFLAG_INVALIDATED;
view.mPrivateFlags &= ~View.PFLAG_INVALIDATED;
long buildDisplayListStartTime = startBuildDisplayListProfiling();
canvas.clearLayerUpdates();
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList");
DisplayList displayList = view.getDisplayList();
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
endBuildDisplayListProfiling(buildDisplayListStartTime);
return displayList;
}
abstract void drawProfileData(View.AttachInfo attachInfo);
private Rect beginFrame(HardwareCanvas canvas, Rect dirty, int surfaceState) {
@@ -1455,17 +1456,6 @@ public abstract class HardwareRenderer {
}
}
private static DisplayList buildDisplayList(View view) {
DisplayList displayList;
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList");
try {
displayList = view.getDisplayList();
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
return displayList;
}
private int prepareFrame(Rect dirty) {
int status;
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "prepareFrame");