Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java |
| index 5bd25a049d9809f6421f229ba533fa707e5ae5b5..73eb995d825122dd6a1bb80a28fbbd462caddbb6 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java |
| @@ -20,6 +20,7 @@ import android.opengl.GLSurfaceView; |
| import android.os.StrictMode; |
| import android.view.MotionEvent; |
| import android.view.Surface; |
| +import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.FrameLayout; |
| @@ -28,9 +29,12 @@ import com.google.vr.ndk.base.GvrLayout; |
| import org.chromium.base.ThreadUtils; |
| import org.chromium.base.annotations.JNINamespace; |
| +import org.chromium.chrome.browser.WebContentsFactory; |
| import org.chromium.chrome.browser.tab.Tab; |
| +import org.chromium.content.browser.ContentView; |
| import org.chromium.content.browser.ContentViewCore; |
| import org.chromium.content_public.browser.WebContents; |
| +import org.chromium.ui.base.ViewAndroidDelegate; |
| import org.chromium.ui.base.WindowAndroid; |
| import javax.microedition.khronos.egl.EGLConfig; |
| @@ -52,7 +56,9 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| private long mNativeVrShell = 0; |
| private int mContentTextureHandle; |
| + private int mUiTextureHandle; |
| private FrameListener mContentFrameListener; |
| + private FrameListener mUiFrameListener; |
| private ContentViewCoreContainer mContentViewCoreContainer; |
| @@ -60,9 +66,9 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| private Tab mTab; |
| // The ContentViewCore for the main content rect in VR. |
| - private ContentViewCore mCVC; |
| + private ContentViewCore mContentCVC; |
| - // The non-VR container view for mCVC. |
| + // The non-VR container view for mContentCVC. |
| private ViewGroup mOriginalContentViewParent; |
| // TODO(mthiesse): Instead of caching these values, make tab reparenting work for this case. |
| @@ -70,7 +76,11 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| private ViewGroup.LayoutParams mOriginalLayoutParams; |
| private WindowAndroid mOriginalWindowAndroid; |
| - private VrWindowAndroid mVRWindowAndroid; |
| + private VrWindowAndroid mContentVrWindowAndroid; |
| + |
| + private WebContents mUiContents; |
| + private ContentViewCore mUiCVC; |
| + private VrWindowAndroid mUiWindowAndroid; |
|
bshe
2016/09/21 21:37:34
nit: to be consistent, rename to mUiVrWindowAndroi
mthiesse
2016/09/21 23:56:48
Done.
|
| private static class ContentViewCoreContainer extends FrameLayout { |
| public ContentViewCoreContainer(Context context) { |
| @@ -106,11 +116,28 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| public void onNativeLibraryReady(Tab currentTab) { |
| assert currentTab.getContentViewCore() != null; |
| mTab = currentTab; |
| - mCVC = mTab.getContentViewCore(); |
| - mVRWindowAndroid = new VrWindowAndroid(mActivity); |
| - |
| - mNativeVrShell = nativeInit(mCVC.getWebContents(), |
| - mVRWindowAndroid.getNativePointer()); |
| + mContentCVC = mTab.getContentViewCore(); |
| + mContentVrWindowAndroid = new VrWindowAndroid(mActivity); |
| + |
| + mUiWindowAndroid = new VrWindowAndroid(mActivity); |
| + mUiContents = WebContentsFactory.createWebContents(true, false); |
| + mUiCVC = new ContentViewCore(mActivity); |
| + ContentView uiContentView = ContentView.createContentView(mActivity, mUiCVC); |
| + mUiCVC.initialize(ViewAndroidDelegate.createBasicDelegate(uiContentView), |
| + uiContentView, mUiContents, mUiWindowAndroid); |
| + |
| + mNativeVrShell = nativeInit(mContentCVC.getWebContents(), |
| + mContentVrWindowAndroid.getNativePointer(), |
| + mUiContents, mUiWindowAndroid.getNativePointer()); |
| + |
| + uiContentView.setVisibility(View.VISIBLE); |
| + mUiCVC.onShow(); |
| + mContentViewCoreContainer.addView(uiContentView, new FrameLayout.LayoutParams( |
| + FrameLayout.LayoutParams.MATCH_PARENT, |
| + FrameLayout.LayoutParams.MATCH_PARENT)); |
| + mUiCVC.setBottomControlsHeight(0); |
| + mUiCVC.setTopControlsHeight(0, false); |
| + mUiWindowAndroid.onVisibilityChanged(true); |
| reparentContentWindow(); |
| @@ -118,13 +145,13 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| } |
| private void reparentContentWindow() { |
| - mOriginalWindowAndroid = mCVC.getWindowAndroid(); |
| + mOriginalWindowAndroid = mContentCVC.getWindowAndroid(); |
| // TODO(mthiesse): Update the WindowAndroid in ChromeActivity too? |
| mTab.updateWindowAndroid(null); |
| - mTab.updateWindowAndroid(mVRWindowAndroid); |
| + mTab.updateWindowAndroid(mContentVrWindowAndroid); |
| - ViewGroup contentContentView = mCVC.getContainerView(); |
| + ViewGroup contentContentView = mContentCVC.getContainerView(); |
| mOriginalContentViewParent = ((ViewGroup) contentContentView.getParent()); |
| mOriginalContentViewIndex = mOriginalContentViewParent.indexOfChild(contentContentView); |
| mOriginalLayoutParams = contentContentView.getLayoutParams(); |
| @@ -136,7 +163,7 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| } |
| private void restoreContentWindow() { |
| - ViewGroup contentContentView = mCVC.getContainerView(); |
| + ViewGroup contentContentView = mContentCVC.getContainerView(); |
| mTab.updateWindowAndroid(null); |
| mTab.updateWindowAndroid(mOriginalWindowAndroid); |
| mContentViewCoreContainer.removeView(contentContentView); |
| @@ -159,8 +186,8 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| } |
| }; |
| - public FrameListener(SurfaceTexture texture, GLSurfaceView glSurfaceView) { |
| - mSurfaceTexture = texture; |
| + public FrameListener(int textureId, GLSurfaceView glSurfaceView) { |
| + mSurfaceTexture = new SurfaceTexture(textureId); |
| mSurfaceTexture.setOnFrameAvailableListener(this); |
| mGlSurfaceView = glSurfaceView; |
| } |
| @@ -174,24 +201,31 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| @Override |
| public void onSurfaceCreated(GL10 gl, EGLConfig config) { |
| - final int width = mCVC.getContainerView().getWidth(); |
| - final int height = mCVC.getContainerView().getHeight(); |
| + final int width = mContentCVC.getContainerView().getWidth(); |
| + final int height = mContentCVC.getContainerView().getHeight(); |
| mContentTextureHandle = createExternalTextureHandle(); |
| - mContentFrameListener = new FrameListener(new SurfaceTexture(mContentTextureHandle), |
| - mGlSurfaceView); |
| + mUiTextureHandle = createExternalTextureHandle(); |
| + |
| + mContentFrameListener = new FrameListener(mContentTextureHandle, mGlSurfaceView); |
| + mUiFrameListener = new FrameListener(mUiTextureHandle, mGlSurfaceView); |
| + |
| mContentFrameListener.mSurfaceTexture.setDefaultBufferSize(width, height); |
| + mUiFrameListener.mSurfaceTexture.setDefaultBufferSize(width, height); |
| ThreadUtils.postOnUiThread(new Runnable() { |
| @Override |
| public void run() { |
| nativeContentSurfaceChanged(mNativeVrShell, width, height, |
| new Surface(mContentFrameListener.mSurfaceTexture)); |
| - mCVC.onPhysicalBackingSizeChanged(width, height); |
| + mContentCVC.onPhysicalBackingSizeChanged(width, height); |
| + nativeUiSurfaceChanged(mNativeVrShell, width, height, |
| + new Surface(mUiFrameListener.mSurfaceTexture)); |
| + mUiCVC.onPhysicalBackingSizeChanged(width, height); |
| } |
| }); |
| nativeGvrInit(mNativeVrShell, getGvrApi().getNativeGvrContext()); |
| - nativeInitializeGl(mNativeVrShell, mContentTextureHandle); |
| + nativeInitializeGl(mNativeVrShell, mContentTextureHandle, mUiTextureHandle); |
| } |
| @Override |
| @@ -203,10 +237,15 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| // isn't guaranteed to have fired after transitioning to VR. It only fires when the texture |
| // is updated either through scrolling, resizing, etc. - none of which we're guaranteed to |
| // have done on transition. |
| + if (mUiFrameListener.mFirstTex) { |
| + mUiFrameListener.mSurfaceTexture.updateTexImage(); |
| + mUiFrameListener.mFirstTex = false; |
| + } |
| if (mContentFrameListener.mFirstTex) { |
| mContentFrameListener.mSurfaceTexture.updateTexImage(); |
| mContentFrameListener.mFirstTex = false; |
| } |
| + |
| nativeDrawFrame(mNativeVrShell); |
| } |
| @@ -242,6 +281,9 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| if (mContentFrameListener != null && mContentFrameListener.mSurfaceTexture != null) { |
| mContentFrameListener.mSurfaceTexture.release(); |
| } |
| + if (mUiFrameListener != null && mUiFrameListener.mSurfaceTexture != null) { |
| + mUiFrameListener.mSurfaceTexture.release(); |
| + } |
| restoreContentWindow(); |
| } |
| @@ -292,15 +334,15 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| } |
| } |
| - private native long nativeInit(WebContents contentWebContents, |
| - long nativeContentWindowAndroid); |
| + private native long nativeInit(WebContents contentWebContents, long nativeContentWindowAndroid, |
| + WebContents uiWebContents, long nativeUiWindowAndroid); |
| private native void nativeGvrInit(long nativeVrShell, long nativeGvrApi); |
| private native void nativeDestroy(long nativeVrShell); |
| private native void nativeInitializeGl( |
| - long nativeVrShell, int contentDataHandle); |
| + long nativeVrShell, int contentTextureHandle, int uiTextureHandle); |
| private native void nativeDrawFrame(long nativeVrShell); |
| @@ -308,10 +350,11 @@ public class VrShell extends GvrLayout implements GLSurfaceView.Renderer, VrShel |
| private native void nativeOnResume(long nativeVrShell); |
| - private native void nativeContentSurfaceDestroyed(long nativeVrShell); |
| - |
| private native void nativeContentSurfaceChanged( |
| long nativeVrShell, int width, int height, Surface surface); |
| + private native void nativeUiSurfaceChanged( |
| + long nativeVrShell, int width, int height, Surface surface); |
| + |
| private native void nativeUpdateCompositorLayers(long nativeVrShell); |
| } |