Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(713)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java

Issue 2657703002: Swap to foreground tab when following links that open in a new tab/window in VR Shell. (Closed)
Patch Set: Address comments Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
index fd53a6590c01d0f9c0ffdae4a2d28602ca1670f6..4c73c02fa893dcc68fe7763805d6c2189b3b6f6e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -65,6 +65,7 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
private final CompositorViewHolder mCompositorViewHolder;
private final VirtualDisplayAndroid mContentVirtualDisplay;
private final VirtualDisplayAndroid mUiVirtualDisplay;
+ private final TabRedirectHandler mTabRedirectHandler;
private long mNativeVrShell;
@@ -87,6 +88,9 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
private TabRedirectHandler mNonVrTabRedirectHandler;
private TabModelSelector mTabModelSelector;
+ private float mLastContentWidth;
+ private float mLastContentHeight;
+ private float mLastContentDpr;
public VrShellImpl(Activity activity, CompositorViewHolder compositorViewHolder) {
super(activity);
@@ -123,6 +127,13 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
mContentVirtualDisplay.setTo(primaryDisplay);
mUiVirtualDisplay = VirtualDisplayAndroid.createVirtualDisplay();
mUiVirtualDisplay.setTo(primaryDisplay);
+
+ mTabRedirectHandler = new TabRedirectHandler(mActivity) {
+ @Override
+ public boolean shouldStayInChrome(boolean hasExternalProtocol) {
+ return true;
+ }
+ };
}
@Override
@@ -132,15 +143,6 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
mContentCVC = mTab.getContentViewCore();
mContentVrWindowAndroid = new VrWindowAndroid(mActivity, mContentVirtualDisplay);
- // Make sure we are not redirecting to another app, i.e. out of VR mode.
- mNonVrTabRedirectHandler = mTab.getTabRedirectHandler();
- mTab.setTabRedirectHandler(new TabRedirectHandler(mActivity) {
- @Override
- public boolean shouldStayInChrome(boolean hasExternalProtocol) {
- return true;
- }
- });
-
mUiVrWindowAndroid = new VrWindowAndroid(mActivity, mUiVirtualDisplay);
mUiContents = WebContentsFactory.createWebContents(true, false);
mUiCVC = new ContentViewCore(mActivity, ChromeVersionInfo.getProductVersion());
@@ -187,9 +189,35 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
mUiCVC.setTopControlsHeight(0, false);
mUiVrWindowAndroid.onVisibilityChanged(true);
+ initializeTabForVR();
+ }
+
+ private void initializeTabForVR() {
mOriginalWindowAndroid = mContentCVC.getWindowAndroid();
mTab.updateWindowAndroid(mContentVrWindowAndroid);
mContentCVC.onAttachedToWindow();
+
+ // Make sure we are not redirecting to another app, i.e. out of VR mode.
+ mNonVrTabRedirectHandler = mTab.getTabRedirectHandler();
+ mTab.setTabRedirectHandler(mTabRedirectHandler);
+ }
+
+ private void restoreTabFromVR() {
+ mTab.setTabRedirectHandler(mNonVrTabRedirectHandler);
+ mTab.updateWindowAndroid(mOriginalWindowAndroid);
+ mOriginalWindowAndroid = null;
+ mNonVrTabRedirectHandler = null;
+ }
+
+ @Override
+ public void swapTab(final Tab newTab) {
+ restoreTabFromVR();
+ mTab = newTab;
+ mContentCVC = mTab.getContentViewCore();
+ initializeTabForVR();
+
+ nativeSwapContents(mNativeVrShell, mContentCVC.getWebContents());
+ setContentCssSize(mLastContentWidth, mLastContentHeight, mLastContentDpr);
}
@CalledByNative
@@ -212,6 +240,9 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
@CalledByNative
public void setContentCssSize(float width, float height, float dpr) {
ThreadUtils.assertOnUiThread();
+ mLastContentWidth = width;
+ mLastContentHeight = height;
+ mLastContentDpr = dpr;
int surfaceWidth = (int) Math.ceil(width * dpr);
int surfaceHeight = (int) Math.ceil(height * dpr);
@@ -270,15 +301,12 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
nativeDestroy(mNativeVrShell);
mNativeVrShell = 0;
}
- mCompositorViewHolder.onExitVR(mTabModelSelector);
- mTab.setTabRedirectHandler(mNonVrTabRedirectHandler);
- mTab.updateWindowAndroid(mOriginalWindowAndroid);
- mContentCVC.onSizeChanged(mContentCVC.getContainerView().getWidth(),
- mContentCVC.getContainerView().getHeight(), 0, 0);
+ restoreTabFromVR();
mUiContents.destroy();
mContentVirtualDisplay.destroy();
mUiVirtualDisplay.destroy();
super.shutdown();
+ mCompositorViewHolder.onExitVR(mTabModelSelector);
}
@Override
@@ -333,6 +361,7 @@ public class VrShellImpl extends GvrLayout implements VrShell, SurfaceHolder.Cal
long nativeContentWindowAndroid, WebContents uiWebContents, long nativeUiWindowAndroid,
boolean forWebVR, VrShellDelegate delegate, long gvrApi, boolean reprojectedRendering);
private native void nativeSetSurface(long nativeVrShell, Surface surface);
+ private native void nativeSwapContents(long nativeVrShell, WebContents webContents);
private native void nativeLoadUIContent(long nativeVrShell);
private native void nativeDestroy(long nativeVrShell);
private native void nativeOnTriggerEvent(long nativeVrShell);

Powered by Google App Engine
This is Rietveld 408576698