1 // Copyright 2013 The Flutter Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package io.flutter.view; 6 7 import android.support.annotation.NonNull; 8 import android.view.Choreographer; 9 import android.view.WindowManager; 10 11 import io.flutter.Log; 12 import io.flutter.embedding.engine.FlutterJNI; 13 14 // TODO(mattcarroll): add javadoc. 15 public class VsyncWaiter { 16 private static VsyncWaiter instance; 17 18 @NonNull getInstance(@onNull WindowManager windowManager)19 public static VsyncWaiter getInstance(@NonNull WindowManager windowManager) { 20 if (instance == null) { 21 instance = new VsyncWaiter(windowManager); 22 } 23 return instance; 24 } 25 26 @NonNull 27 private final WindowManager windowManager; 28 29 private final FlutterJNI.AsyncWaitForVsyncDelegate asyncWaitForVsyncDelegate = new FlutterJNI.AsyncWaitForVsyncDelegate() { 30 @Override 31 public void asyncWaitForVsync(long cookie) { 32 Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() { 33 @Override 34 public void doFrame(long frameTimeNanos) { 35 float fps = windowManager.getDefaultDisplay().getRefreshRate(); 36 long refreshPeriodNanos = (long) (1000000000.0 / fps); 37 FlutterJNI.nativeOnVsync(frameTimeNanos, frameTimeNanos + refreshPeriodNanos, cookie); 38 } 39 }); 40 } 41 }; 42 VsyncWaiter(@onNull WindowManager windowManager)43 private VsyncWaiter(@NonNull WindowManager windowManager) { 44 this.windowManager = windowManager; 45 } 46 init()47 public void init() { 48 FlutterJNI.setAsyncWaitForVsyncDelegate(asyncWaitForVsyncDelegate); 49 50 // TODO(mattcarroll): look into moving FPS reporting to a plugin 51 float fps = windowManager.getDefaultDisplay().getRefreshRate(); 52 FlutterJNI.setRefreshRateFPS(fps); 53 } 54 } 55