diff options
| -rw-r--r-- | core/java/android/view/Choreographer.java | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index 5127f05a03ab..dfa0000cca78 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -1155,9 +1155,15 @@ public final class Choreographer { } private void allocateFrameTimelines(int length) { - mFrameTimelines = new FrameTimeline[length]; - for (int i = 0; i < mFrameTimelines.length; i++) { - mFrameTimelines[i] = new FrameTimeline(); + // Maintain one default frame timeline for API (such as getFrameTimelines and + // getPreferredFrameTimeline) consistency. It should have default data when accessed. + length = Math.max(1, length); + + if (mFrameTimelines == null || mFrameTimelines.length != length) { + mFrameTimelines = new FrameTimeline[length]; + for (int i = 0; i < mFrameTimelines.length; i++) { + mFrameTimelines[i] = new FrameTimeline(); + } } } @@ -1167,12 +1173,7 @@ public final class Choreographer { */ FrameTimeline update( long frameTimeNanos, DisplayEventReceiver.VsyncEventData vsyncEventData) { - // Even if the frame timelines length is 0, continue with allocation for API - // FrameData.getFrameTimelines consistency. The 0 length frame timelines code path - // should only occur when USE_VSYNC property is false. - if (mFrameTimelines.length != vsyncEventData.frameTimelinesLength) { - allocateFrameTimelines(vsyncEventData.frameTimelinesLength); - } + allocateFrameTimelines(vsyncEventData.frameTimelinesLength); mFrameTimeNanos = frameTimeNanos; mPreferredFrameTimelineIndex = vsyncEventData.preferredFrameTimelineIndex; for (int i = 0; i < mFrameTimelines.length; i++) { |