• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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