Index: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
index 835a3c637d386d058471b04f2a15eedbec09cd77..8f0b7f14d173c079f5690ecdca833af864497d2c 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java |
@@ -7,12 +7,16 @@ package org.chromium.chrome.browser.vr_shell; |
import android.app.Activity; |
import android.app.PendingIntent; |
import android.content.ComponentName; |
+import android.content.Context; |
import android.content.Intent; |
import android.content.pm.ActivityInfo; |
import android.os.Handler; |
import android.os.StrictMode; |
import android.os.SystemClock; |
import android.support.annotation.IntDef; |
+import android.view.Choreographer; |
+import android.view.Choreographer.FrameCallback; |
+import android.view.Display; |
import android.view.View; |
import android.view.ViewGroup; |
import android.view.ViewGroup.LayoutParams; |
@@ -170,6 +174,16 @@ public class VrShellDelegate { |
public void onNativeLibraryReady() { |
if (mVrSupportLevel == VR_NOT_AVAILABLE) return; |
mNativeVrShellDelegate = nativeInit(); |
+ Choreographer choreographer = Choreographer.getInstance(); |
+ choreographer.postFrameCallback(new FrameCallback() { |
+ @Override |
+ public void doFrame(long frameTimeNanos) { |
+ Display display = ((WindowManager) mActivity.getSystemService( |
+ Context.WINDOW_SERVICE)).getDefaultDisplay(); |
+ nativeUpdateVSyncInterval(mNativeVrShellDelegate, frameTimeNanos, |
+ 1.0d / display.getRefreshRate()); |
+ } |
+ }); |
} |
@SuppressWarnings("unchecked") |
@@ -403,20 +417,16 @@ public class VrShellDelegate { |
// TODO(bshe): Ideally, we do not need two gvr context exist at the same time. We can |
// probably shutdown non presenting gvr when presenting and create a new one after exit |
// presenting. See crbug.com/655242 |
- if (mNonPresentingGvrContext != null) { |
- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites(); |
- try { |
- mNonPresentingGvrContext.resume(); |
- } catch (IllegalArgumentException e) { |
- Log.e(TAG, "Unable to resume mNonPresentingGvrContext", e); |
- } finally { |
- StrictMode.setThreadPolicy(oldPolicy); |
- } |
+ StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites(); |
+ try { |
+ nativeOnResume(mNativeVrShellDelegate); |
+ } finally { |
+ StrictMode.setThreadPolicy(oldPolicy); |
} |
if (mInVr) { |
setupVrModeWindowFlags(); |
- StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites(); |
+ oldPolicy = StrictMode.allowThreadDiskWrites(); |
try { |
mVrShell.resume(); |
} catch (IllegalArgumentException e) { |
@@ -448,9 +458,7 @@ public class VrShellDelegate { |
// vrdisplayactivate event should be dispatched in enterVRFromIntent. |
mListeningForWebVrActivateBeforePause = mListeningForWebVrActivate; |
} |
- if (mNonPresentingGvrContext != null) { |
- mNonPresentingGvrContext.pause(); |
- } |
+ nativeOnPause(mNativeVrShellDelegate); |
// TODO(mthiesse): When VR Shell lives in its own activity, and integrates with Daydream |
// home, pause instead of exiting VR here. For now, because VR Apps shouldn't show up in the |
@@ -656,4 +664,8 @@ public class VrShellDelegate { |
private native long nativeInit(); |
private native void nativeSetPresentResult(long nativeVrShellDelegate, boolean result); |
private native void nativeDisplayActivate(long nativeVrShellDelegate); |
+ private native void nativeUpdateVSyncInterval(long nativeVrShellDelegate, long timebaseNanos, |
+ double intervalSeconds); |
+ private native void nativeOnPause(long nativeVrShellDelegate); |
+ private native void nativeOnResume(long nativeVrShellDelegate); |
} |